use super::{DeleteQuery, InsertQuery, SelectQuery};
fn to_params(binds: &[crate::core::types::Value]) -> Vec<&(dyn driver::ToSql + Sync)> {
binds
.iter()
.map(|v| v as &(dyn driver::ToSql + Sync))
.collect()
}
impl SelectQuery {
pub async fn fetch_all(
self,
conn: &mut driver::Connection,
) -> crate::core::error::Result<Vec<driver::Row>> {
let (sql, binds) = self.build();
Ok(conn.query(&sql, &to_params(&binds)).await?)
}
pub async fn fetch_one(
self,
conn: &mut driver::Connection,
) -> crate::core::error::Result<driver::Row> {
let (sql, binds) = self.build();
conn.query_one(&sql, &to_params(&binds))
.await
.map_err(Into::into)
}
pub async fn fetch_optional(
self,
conn: &mut driver::Connection,
) -> crate::core::error::Result<Option<driver::Row>> {
let (sql, binds) = self.build();
Ok(conn.query_opt(&sql, &to_params(&binds)).await?)
}
}
impl InsertQuery {
pub async fn fetch_returning(
self,
conn: &mut driver::Connection,
) -> crate::core::error::Result<Vec<driver::Row>> {
let (sql, binds) = self.build();
Ok(conn.query(&sql, &to_params(&binds)).await?)
}
pub async fn execute(self, conn: &mut driver::Connection) -> crate::core::error::Result<u64> {
let (sql, binds) = self.build();
Ok(conn.execute(&sql, &to_params(&binds)).await?)
}
}
impl super::UpdateQuery {
pub async fn fetch_returning(
self,
conn: &mut driver::Connection,
) -> crate::core::error::Result<Vec<driver::Row>> {
let (sql, binds) = self.build();
Ok(conn.query(&sql, &to_params(&binds)).await?)
}
pub async fn execute(self, conn: &mut driver::Connection) -> crate::core::error::Result<u64> {
let (sql, binds) = self.build();
Ok(conn.execute(&sql, &to_params(&binds)).await?)
}
}
impl DeleteQuery {
pub async fn execute(self, conn: &mut driver::Connection) -> crate::core::error::Result<u64> {
let (sql, binds) = self.build();
Ok(conn.execute(&sql, &to_params(&binds)).await?)
}
}