use crate::{bind, classify, decode};
use persistant_relational::{Dialect, RelError, Row, Runner, Sql, Value, prepare};
pub struct OnPool<'p>(pub &'p sqlx::PgPool);
pub struct OnConn<'c>(pub &'c mut sqlx::PgConnection);
impl Runner for OnPool<'_> {
async fn run_query(&mut self, sql: &Sql, params: &[Value]) -> Result<Vec<Row>, RelError> {
let (text, ordered) = prepare(sql, &Dialect::Postgres, params)?;
let q = bind(sqlx::query(sqlx::AssertSqlSafe(text.to_string())), &ordered)?;
let rows = q.fetch_all(self.0).await.map_err(classify)?;
rows.iter().map(decode).collect()
}
async fn run_execute(&mut self, sql: &Sql, params: &[Value]) -> Result<u64, RelError> {
let (text, ordered) = prepare(sql, &Dialect::Postgres, params)?;
let q = bind(sqlx::query(sqlx::AssertSqlSafe(text.to_string())), &ordered)?;
q.execute(self.0)
.await
.map(|r| r.rows_affected())
.map_err(classify)
}
}
impl Runner for OnConn<'_> {
async fn run_query(&mut self, sql: &Sql, params: &[Value]) -> Result<Vec<Row>, RelError> {
let (text, ordered) = prepare(sql, &Dialect::Postgres, params)?;
let q = bind(sqlx::query(sqlx::AssertSqlSafe(text.to_string())), &ordered)?;
let rows = q.fetch_all(&mut *self.0).await.map_err(classify)?;
rows.iter().map(decode).collect()
}
async fn run_execute(&mut self, sql: &Sql, params: &[Value]) -> Result<u64, RelError> {
let (text, ordered) = prepare(sql, &Dialect::Postgres, params)?;
let q = bind(sqlx::query(sqlx::AssertSqlSafe(text.to_string())), &ordered)?;
q.execute(&mut *self.0)
.await
.map(|r| r.rows_affected())
.map_err(classify)
}
}