use sqlx::postgres::{PgArguments, PgRow};
use sqlx::query::Query;
use super::bind_query;
use super::ExecError;
use super::Postgres;
use crate::core::{BulkInsertQuery, DeleteQuery, InsertQuery, SelectQuery, UpdateQuery};
use crate::sql::Dialect as _;
pub async fn insert_on<'c, E>(executor: E, query: &InsertQuery) -> Result<(), ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
query.validate()?;
let stmt = Postgres.compile_insert(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
q.execute(executor).await?;
Ok(())
}
pub async fn insert_returning_on<'c, E>(
executor: E,
query: &InsertQuery,
) -> Result<PgRow, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
if query.returning.is_empty() {
return Err(ExecError::EmptyReturning);
}
query.validate()?;
let stmt = Postgres.compile_insert(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
let row = q.fetch_one(executor).await?;
Ok(row)
}
pub async fn bulk_insert_on<'c, E>(
executor: E,
query: &BulkInsertQuery,
) -> Result<Vec<PgRow>, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
query.validate()?;
let stmt = Postgres.compile_bulk_insert(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
if query.returning.is_empty() {
q.execute(executor).await?;
Ok(Vec::new())
} else {
Ok(q.fetch_all(executor).await?)
}
}
pub async fn update_on<'c, E>(executor: E, query: &UpdateQuery) -> Result<u64, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
query.validate()?;
let stmt = Postgres.compile_update(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
let result = q.execute(executor).await?;
Ok(result.rows_affected())
}
pub async fn delete_on<'c, E>(executor: E, query: &DeleteQuery) -> Result<u64, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
let stmt = Postgres.compile_delete(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
let result = q.execute(executor).await?;
Ok(result.rows_affected())
}
pub async fn select_rows_on<'c, E>(
executor: E,
query: &SelectQuery,
) -> Result<Vec<PgRow>, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
let stmt = Postgres.compile_select(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
Ok(q.fetch_all(executor).await?)
}
pub async fn select_one_row_on<'c, E>(
executor: E,
query: &SelectQuery,
) -> Result<Option<PgRow>, ExecError>
where
E: sqlx::Executor<'c, Database = sqlx::Postgres>,
{
let stmt = Postgres.compile_select(query)?;
let mut q: Query<'_, sqlx::Postgres, PgArguments> = sqlx::query(&stmt.sql);
for value in stmt.params {
q = bind_query(q, value);
}
Ok(q.fetch_optional(executor).await?)
}