use crate::backend;
use crate::driver::rows::DriverRows;
use crate::transaction::Executor;
use crate::{Error, Value};
pub async fn execute<'a>(db: impl Executor<'a>, sql: &str, binds: &[Value]) -> Result<u64, Error> {
let target = db.target();
let (sql, values) = target.driver().prepare(sql, binds);
Ok(backend::execute(target, &sql, &values).await?.rows_affected)
}
pub async fn fetch_all<'a, T>(
db: impl Executor<'a>,
sql: &str,
binds: &[Value],
) -> Result<Vec<T>, Error>
where
T: DriverRows + Send + Unpin,
{
let target = db.target();
let (sql, values) = target.driver().prepare(sql, binds);
Ok(backend::fetch_all::<T>(target, &sql, &values).await?)
}
pub async fn fetch_optional<'a, T>(
db: impl Executor<'a>,
sql: &str,
binds: &[Value],
) -> Result<Option<T>, Error>
where
T: DriverRows + Send + Unpin,
{
let target = db.target();
let (sql, values) = target.driver().prepare(sql, binds);
Ok(backend::fetch_optional::<T>(target, &sql, &values).await?)
}
pub async fn fetch_scalar<'a, T>(
db: impl Executor<'a>,
sql: &str,
binds: &[Value],
) -> Result<T, Error>
where
(T,): DriverRows + Send + Unpin,
{
let target = db.target();
let (sql, values) = target.driver().prepare(sql, binds);
Ok(backend::scalar::<T>(target, &sql, &values).await?)
}