use std::sync::Arc;
use tokio_postgres::types::ToSql;
use crate::error::{BsqlError, BsqlResult};
use crate::pool::{Pool, PoolConnection};
use crate::transaction::Transaction;
pub trait Executor: sealed::Sealed {
fn query_raw(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> impl std::future::Future<Output = BsqlResult<Arc<Vec<tokio_postgres::Row>>>> + Send;
fn query_raw_readonly(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> impl std::future::Future<Output = BsqlResult<Arc<Vec<tokio_postgres::Row>>>> + Send;
fn execute_raw(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> impl std::future::Future<Output = BsqlResult<u64>> + Send;
}
mod sealed {
pub trait Sealed {}
impl Sealed for super::Pool {}
impl Sealed for super::PoolConnection {}
impl Sealed for super::Transaction {}
}
impl Executor for Pool {
async fn query_raw(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
self.query_raw_primary(sql, params).await
}
async fn query_raw_readonly(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
self.query_raw_read(sql, params).await
}
async fn execute_raw(&self, sql: &str, params: &[&(dyn ToSql + Sync)]) -> BsqlResult<u64> {
let conn = self.acquire().await?;
conn.execute_raw(sql, params).await
}
}
impl Executor for PoolConnection {
async fn query_raw(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
let stmt = self
.inner
.prepare_cached(sql)
.await
.map_err(BsqlError::from)?;
let rows = self
.inner
.query(&stmt, params)
.await
.map_err(BsqlError::from)?;
Ok(Arc::new(rows))
}
async fn query_raw_readonly(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
self.query_raw(sql, params).await
}
async fn execute_raw(&self, sql: &str, params: &[&(dyn ToSql + Sync)]) -> BsqlResult<u64> {
let stmt = self
.inner
.prepare_cached(sql)
.await
.map_err(BsqlError::from)?;
self.inner
.execute(&stmt, params)
.await
.map_err(BsqlError::from)
}
}
impl Executor for Transaction {
async fn query_raw(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
self.connection().query_raw(sql, params).await
}
async fn query_raw_readonly(
&self,
sql: &str,
params: &[&(dyn ToSql + Sync)],
) -> BsqlResult<Arc<Vec<tokio_postgres::Row>>> {
self.query_raw(sql, params).await
}
async fn execute_raw(&self, sql: &str, params: &[&(dyn ToSql + Sync)]) -> BsqlResult<u64> {
self.connection().execute_raw(sql, params).await
}
}