use super::*;
pub struct Row {
row: ::postgres::row::Row,
}
impl std::convert::TryFrom<::postgres::row::Row> for Row {
type Error = Error;
fn try_from(row: ::postgres::row::Row) -> core::result::Result<Self, Self::Error> {
Ok( Row { row })
}
}
impl Row {
fn get_value_opt(&self, i: usize) -> Result<Option<traits::Value>> {
Ok(self.row.try_get(i)?)
}
}
impl traits::Row for Row {
fn get_value(&self, i: usize) -> Option<Result<traits::Value>> {
match self.get_value_opt(i) {
Ok(Some(v)) => Some(Ok(v)),
Ok(None) => Some(Ok(traits::Value::Null)),
Err(e) => Some(Err(e)),
}
}
}
fn execute<P>(tx: &mut ::postgres::Transaction, statement: &::postgres::Statement, params: &P) -> Result<()>
where P: traits::Params,
{
let params: Vec<traits::Param> = params.as_vec_params()?;
let _ = match params.len() {
0 => tx.execute(statement, &[])?,
1 => tx.execute(statement, &[ ¶ms[0] ] )?,
2 => tx.execute(statement, &[ ¶ms[0], ¶ms[1] ] )?,
3 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ] )?,
4 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ] )?,
5 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ] )?,
6 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ] )?,
7 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ] )?,
8 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ] )?,
9 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ] )?,
10 => tx.execute(statement, &[ ¶ms[0], ¶ms[1], ¶ms[2], ¶ms[3], ¶ms[4], ¶ms[5], ¶ms[6], ¶ms[7], ¶ms[8], ¶ms[9], ] )?,
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], ] )?,
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], ] )?,
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], ] )?,
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], ] )?,
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], ] )?,
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], ] )?,
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], ] )?,
_ => { return Err(Error::MaximumNumberOfParametersExceeded(17, params.len())); },
};
Ok(())
}
impl traits::Connection<Row> for ::postgres::Client
{
fn flavor(&self) -> traits::Flavor { traits::Flavor::PostgreSQL }
fn execute_with_params<S, P>(&mut self, query: S, params: &P) -> Result<()>
where S: std::convert::AsRef<str>,
P: traits::Params,
{
let mut tx = self.transaction()?;
let statement = tx.prepare(query.as_ref())?;
execute(&mut tx, &statement, params)?;
tx.commit()?;
Ok(())
}
fn execute_with_params_iterator<'a, S, I, P>(&mut self, query: S, params_iter: I) -> Result<()>
where S: std::convert::AsRef<str>,
P: traits::Params + 'a,
I: core::iter::IntoIterator<Item = &'a P>
{
let mut tx = self.transaction()?;
let statement = tx.prepare(query.as_ref())?;
for params in params_iter { execute(&mut tx, &statement, params)?; }
tx.commit()?;
Ok(())
}
fn query<S>(&mut self, query: S) -> Result<Vec<Row>>
where S: std::convert::AsRef<str>
{
::log::info!("Running query");
let r = self.query(query.as_ref(), &[])?.into_iter()
.map(|row| {
::log::info!("Mapping row {row:?}");
Ok(row.try_into()?)
})
.collect::<Result<Vec<Row>>>()?;
::log::info!("Return query result");
Ok(r)
}
}