sql_middleware/postgres/
executor.rs

1use super::params::Params;
2use super::query::build_result_set;
3use crate::middleware::{ResultSet, RowValues, SqlMiddlewareDbError};
4use deadpool_postgres::Object;
5
6/// Execute a batch of SQL statements for Postgres
7///
8/// # Errors
9/// Returns errors from transaction operations or batch execution.
10pub async fn execute_batch(
11    pg_client: &mut Object,
12    query: &str,
13) -> Result<(), SqlMiddlewareDbError> {
14    // Begin a transaction
15    let tx = pg_client.transaction().await?;
16
17    // Execute the batch of queries
18    tx.batch_execute(query).await?;
19
20    // Commit the transaction
21    tx.commit().await?;
22
23    Ok(())
24}
25
26/// Execute a SELECT query with parameters
27///
28/// # Errors
29/// Returns errors from parameter conversion, transaction operations, query preparation, or result set building.
30pub async fn execute_select(
31    pg_client: &mut Object,
32    query: &str,
33    params: &[RowValues],
34) -> Result<ResultSet, SqlMiddlewareDbError> {
35    let params = Params::convert(params)?;
36    let tx = pg_client.transaction().await?;
37    let stmt = tx.prepare(query).await?;
38    let result_set = build_result_set(&stmt, params.as_refs(), &tx).await?;
39    tx.commit().await?;
40    Ok(result_set)
41}
42
43/// Execute a DML query (INSERT, UPDATE, DELETE) with parameters
44///
45/// # Errors
46/// Returns errors from parameter conversion, transaction operations, or query execution.
47pub async fn execute_dml(
48    pg_client: &mut Object,
49    query: &str,
50    params: &[RowValues],
51) -> Result<usize, SqlMiddlewareDbError> {
52    let params = Params::convert(params)?;
53    let tx = pg_client.transaction().await?;
54
55    let stmt = tx.prepare(query).await?;
56    let rows = tx.execute(&stmt, params.as_refs()).await?;
57    tx.commit().await?;
58
59    usize::try_from(rows).map_err(|e| {
60        SqlMiddlewareDbError::ExecutionError(format!("Invalid rows affected count: {e}"))
61    })
62}