derive_sql/proxy/
log.rs

1use super::*;
2
3/// Implementation of a wrapper that output the statement to as an `info` level log before running the query
4/// using the providing connection.
5pub struct Log<'a, T, R> 
6where T: traits::Connection<R>,
7      R: traits::Row,
8{
9  conn: &'a mut T,
10  level: ::log::Level,
11  phantom_r: std::marker::PhantomData<R>,
12}
13
14impl<'a, T, R> Log<'a, T, R>
15where T: traits::Connection<R>,
16      R: traits::Row,
17{
18  pub fn from_connection_level(conn: &'a mut T, level: ::log::Level) -> Log<T, R> {
19    Log { conn, level, phantom_r: std::marker::PhantomData, }
20  }
21
22  pub fn inner_mut(&mut self) -> &mut T { &mut self.conn }
23
24  pub fn with_level(mut self, level: ::log::Level) -> Log<'a, T, R> {
25    self.level = level;
26    self
27  }
28
29  fn log(&self, statement: &str) {
30    match self.level {
31      ::log::Level::Error => ::log::error!("{statement}"),
32      ::log::Level::Warn  => ::log::warn!("{statement}"),
33      ::log::Level::Info  => ::log::info!("{statement}"),
34      ::log::Level::Debug => ::log::debug!("{statement}"),
35      ::log::Level::Trace => ::log::trace!("{statement}"),
36    }
37  }
38}
39
40impl<'a, T, R> std::convert::From<&'a mut T> for Log<'a, T, R> 
41where T: traits::Connection<R>,
42      R: traits::Row,
43{
44  fn from(conn: &'a mut T) -> Self { Log { conn, level: ::log::Level::Info, phantom_r: std::marker::PhantomData, } }
45}
46  
47/*
48impl<T, R> std::convert::Into<T> for Log<T, R>
49where T: traits::Connection<R>,
50      R: traits::Row,
51{
52  fn into(self) -> T { self.conn }
53}
54
55impl<T, R> std::convert::From<Log<T, R>> for T
56where T: traits::Connection<R>,
57      R: traits::Row,
58{
59  fn from(v: Log<T, R>) -> Self { v.conn }
60}
61*/
62
63impl<'a, T, R> traits::Connection<R> for Log<'a, T, R>
64where T: traits::Connection<R>,
65      R: traits::Row,
66{
67  fn flavor(&self) -> traits::Flavor { self.conn.flavor() }
68
69  fn execute_with_params<S, P>(&mut self, query: S, params: &P) -> Result<()>
70  where S: std::convert::AsRef<str>,
71        P: traits::Params,
72  {
73    self.log(query.as_ref());
74    self.conn.execute_with_params(query, params)
75  }
76
77  fn execute_with_params_iterator<'b, S, I, P>(&mut self, query: S, params_iter: I) -> Result<()>
78  where S: std::convert::AsRef<str>,
79        P: traits::Params + 'b,
80        I: core::iter::IntoIterator<Item = &'b P>
81  {
82    self.log(query.as_ref());
83    self.conn.execute_with_params_iterator(query, params_iter)
84  }
85
86/*
87  fn execute_with_params_rows<S, P>(&mut self, query: S, params: &P) -> Result<Vec<R>>
88  where S: std::convert::AsRef<str>,
89        P: traits::Params,
90  {
91    self.log(query.as_ref());
92    self.conn.execute_with_params_rows(query, params)
93  }
94  */
95
96  fn query<S>(&mut self, query: S) -> Result<Vec<R>>
97  where S: std::convert::AsRef<str>,
98  {
99    self.log(query.as_ref());
100    self.conn.query(query)
101  }
102}
103