use super::{write_on, ExecError, InsertReturningPool, SqlExecutor};
use crate::core::{BulkInsertQuery, DeleteQuery, InsertQuery, UpdateQuery};
pub async fn insert_on<'c, E: SqlExecutor<'c>>(
executor: E,
query: &InsertQuery,
) -> Result<(), ExecError> {
query.validate()?;
let stmt = executor.dialect().compile_insert(query)?;
write_on(executor, &stmt.sql, stmt.params).await.map(drop)
}
pub async fn insert_returning_on<'c, E: SqlExecutor<'c>>(
executor: E,
query: &InsertQuery,
) -> Result<InsertReturningPool, ExecError> {
if query.returning.is_empty() {
return Err(ExecError::EmptyReturning);
}
query.validate()?;
executor.insert_returning(query.clone()).await
}
pub async fn update_on<'c, E: SqlExecutor<'c>>(
executor: E,
query: &UpdateQuery,
) -> Result<u64, ExecError> {
query.validate()?;
let stmt = executor.dialect().compile_update(query)?;
write_on(executor, &stmt.sql, stmt.params).await
}
pub async fn delete_on<'c, E: SqlExecutor<'c>>(
executor: E,
query: &DeleteQuery,
) -> Result<u64, ExecError> {
let plan = crate::sql::compile_delete_plan(executor.dialect(), query)?;
if plan.is_one_statement() {
return write_on(executor, &plan.owner.sql, plan.owner.params).await;
}
if !executor.runs_plans() {
if plan.cascade.is_some() {
return Err(ExecError::AuditUnsupported {
table: query.model.table,
reason: "a raw sqlx executor cannot audit the rows this delete cascades to; \
use a Pool, PoolConn or PoolTx",
});
}
if plan.links.is_empty() {
return write_on(executor, &plan.owner.sql, plan.owner.params).await;
}
}
executor.run_delete_plan(plan).await
}
pub async fn bulk_insert_on<'c, E: SqlExecutor<'c>>(
executor: E,
query: &BulkInsertQuery,
) -> Result<Vec<InsertReturningPool>, ExecError> {
if query.rows.is_empty() {
return Ok(Vec::new());
}
let mut query = query.clone();
if !executor.dialect().supports_returning() {
query.returning.clear();
}
executor.bulk_insert(query).await
}