derive_sql/proxy/
postgres.rs

1//! Postgresql connection
2use super::*;
3
4pub struct Row {
5  row: ::postgres::row::Row,
6}
7
8impl std::convert::TryFrom<::postgres::row::Row> for Row {
9  type Error = Error;
10  fn try_from(row: ::postgres::row::Row) -> core::result::Result<Self, Self::Error> {
11    Ok( Row { row })
12  }
13}
14
15impl Row {
16  fn get_value_opt(&self, i: usize) -> Result<Option<traits::Value>> {
17    Ok(self.row.try_get(i)?)
18  }
19}
20
21impl traits::Row for Row {
22  fn get_value(&self, i: usize) -> Option<Result<traits::Value>> {
23    match self.get_value_opt(i) {
24      Ok(Some(v)) => Some(Ok(v)),
25      Ok(None) => Some(Ok(traits::Value::Null)),
26      Err(e) => Some(Err(e)),
27    }
28  }
29}
30
31fn execute<P>(tx: &mut ::postgres::Transaction, statement: &::postgres::Statement, params: &P) -> Result<()>
32where P: traits::Params,
33{
34    let params: Vec<traits::Param> = params.as_vec_params()?;
35    let _ = match params.len() {
36      0 => tx.execute(statement, &[])?,
37      1 => tx.execute(statement, &[ &params[0] ] )?,
38      2 => tx.execute(statement, &[ &params[0], &params[1] ] )?,
39      3 => tx.execute(statement, &[ &params[0], &params[1], &params[2], ] )?,
40      4 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], ] )?,
41      5 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], ] )?,
42      6 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], ] )?,
43      7 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], ] )?,
44      8 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], ] )?,
45      9 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], ] )?,
46     10 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], ] )?,
47     11 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], ] )?,
48     12 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], ] )?,
49     13 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], &params[12], ] )?,
50     14 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], &params[12], &params[13], ] )?,
51     15 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], &params[12], &params[13], &params[14], ] )?,
52     16 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], &params[12], &params[13], &params[14], &params[15], ] )?,
53     17 => tx.execute(statement, &[ &params[0], &params[1], &params[2], &params[3], &params[4], &params[5], &params[6], &params[7], &params[8], &params[9], &params[10], &params[11], &params[12], &params[13], &params[14], &params[15], &params[16], ] )?,
54      // _ => { self.conn.execute(query, params.iter().collect::<Vec<&traits::Param>>().as_slice())?; },
55      _ => { return Err(Error::MaximumNumberOfParametersExceeded(17, params.len())); },
56    };
57    Ok(())
58}
59
60impl traits::Connection<Row> for ::postgres::Client 
61{
62  fn flavor(&self) -> traits::Flavor { traits::Flavor::PostgreSQL }
63
64  fn execute_with_params<S, P>(&mut self, query: S, params: &P) -> Result<()>
65  where S: std::convert::AsRef<str>,
66        P: traits::Params,
67  {
68    let mut tx = self.transaction()?;
69    let statement = tx.prepare(query.as_ref())?;
70    execute(&mut tx, &statement, params)?;
71    tx.commit()?;
72    Ok(())
73  }
74
75  fn execute_with_params_iterator<'a, S, I, P>(&mut self, query: S, params_iter: I) -> Result<()>
76  where S: std::convert::AsRef<str>,
77        P: traits::Params + 'a,
78        I: core::iter::IntoIterator<Item = &'a P>
79  {
80    let mut tx = self.transaction()?;
81    let statement = tx.prepare(query.as_ref())?;
82    for params in params_iter { execute(&mut tx, &statement, params)?; }
83    tx.commit()?;
84    Ok(())
85  }
86
87  fn query<S>(&mut self, query: S) -> Result<Vec<Row>>
88  where S: std::convert::AsRef<str>
89  {
90    ::log::info!("Running query");
91    let r = self.query(query.as_ref(), &[])?.into_iter()
92    .map(|row| {
93      ::log::info!("Mapping row {row:?}");
94      Ok(row.try_into()?) 
95    })
96    .collect::<Result<Vec<Row>>>()?;
97    ::log::info!("Return query result");
98    Ok(r)
99  }
100}
101