1use 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, &[ ¶ms[0] ] )?,
38 2 => tx.execute(statement, &[ ¶ms[0], ¶ms[1] ] )?,
39 3 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ] )?,
40 4 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ] )?,
41 5 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ] )?,
42 6 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ] )?,
43 7 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ] )?,
44 8 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ] )?,
45 9 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ] )?,
46 10 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ] )?,
47 11 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ] )?,
48 12 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ] )?,
49 13 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ¶ms[12], ] )?,
50 14 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ¶ms[12], ¶ms[13], ] )?,
51 15 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ¶ms[12], ¶ms[13], ¶ms[14], ] )?,
52 16 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ¶ms[12], ¶ms[13], ¶ms[14], ¶ms[15], ] )?,
53 17 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ¶ms[10], ¶ms[11], ¶ms[12], ¶ms[13], ¶ms[14], ¶ms[15], ¶ms[16], ] )?,
54 _ => { 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