use crate::builder::QueryBuilder;
use crate::error::Error;
use crate::sqlx_bind::SqlxDialect;
impl<D: SqlxDialect> QueryBuilder<D> {
pub async fn fetch_all<'e, T, E>(&self, executor: E) -> Result<Vec<T>, Error>
where
T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
E: sqlx::Executor<'e, Database = D::Database>,
{
Ok(self
.try_to_sqlx_query_as::<T>()?
.fetch_all(executor)
.await?)
}
pub async fn fetch_one<'e, T, E>(&self, executor: E) -> Result<T, Error>
where
T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
E: sqlx::Executor<'e, Database = D::Database>,
{
Ok(self
.try_to_sqlx_query_as::<T>()?
.fetch_one(executor)
.await?)
}
pub async fn fetch_optional<'e, T, E>(&self, executor: E) -> Result<Option<T>, Error>
where
T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
E: sqlx::Executor<'e, Database = D::Database>,
{
Ok(self
.try_to_sqlx_query_as::<T>()?
.fetch_optional(executor)
.await?)
}
pub async fn execute<'e, E>(
&self,
executor: E,
) -> Result<<D::Database as sqlx::Database>::QueryResult, Error>
where
E: sqlx::Executor<'e, Database = D::Database>,
{
Ok(self.try_to_sqlx_query()?.execute(executor).await?)
}
pub async fn count<'e, E>(&self, executor: E) -> Result<i64, Error>
where
E: sqlx::Executor<'e, Database = D::Database>,
i64: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database>,
usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
{
let (sql, binds) = self.try_to_sql()?;
let wrapped = format!("SELECT COUNT(*) FROM ({sql}) AS __cb_count");
let args = D::bind_arguments(&binds);
Ok(
sqlx::query_scalar_with::<D::Database, i64, _>(sqlx::AssertSqlSafe(wrapped), args)
.fetch_one(executor)
.await?,
)
}
pub async fn fetch_scalar<'e, T, E>(&self, executor: E) -> Result<T, Error>
where
T: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database> + Send + Unpin,
E: sqlx::Executor<'e, Database = D::Database>,
usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
{
let (sql, binds) = self.try_to_sql()?;
let args = D::bind_arguments(&binds);
Ok(
sqlx::query_scalar_with::<D::Database, T, _>(sqlx::AssertSqlSafe(sql), args)
.fetch_one(executor)
.await?,
)
}
pub async fn fetch_optional_scalar<'e, T, E>(&self, executor: E) -> Result<Option<T>, Error>
where
T: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database> + Send + Unpin,
E: sqlx::Executor<'e, Database = D::Database>,
usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
{
let (sql, binds) = self.try_to_sql()?;
let args = D::bind_arguments(&binds);
Ok(
sqlx::query_scalar_with::<D::Database, T, _>(sqlx::AssertSqlSafe(sql), args)
.fetch_optional(executor)
.await?,
)
}
}