sql_middleware/query_builder/
dml.rs

1use crate::error::SqlMiddlewareDbError;
2use crate::executor::{QueryTarget, QueryTargetKind, execute_dml_dispatch};
3
4use super::{QueryBuilder, translate_query_for_target};
5
6impl QueryBuilder<'_, '_> {
7    /// Execute a DML statement and return rows affected.
8    ///
9    /// # Errors
10    /// Returns an error if placeholder translation fails or the backend DML execution fails.
11    pub async fn dml(self) -> Result<usize, SqlMiddlewareDbError> {
12        let translated = translate_query_for_target(
13            &self.target,
14            self.sql.as_ref(),
15            self.params.as_ref(),
16            self.options,
17        );
18
19        match self.target {
20            QueryTarget {
21                kind: QueryTargetKind::Connection(conn),
22                ..
23            } => execute_dml_dispatch(conn, translated.as_ref(), self.params.as_ref()).await,
24            #[cfg(feature = "sqlite")]
25            QueryTarget {
26                kind: QueryTargetKind::TypedSqlite { conn },
27                ..
28            } => {
29                crate::sqlite::connection::dml(conn, translated.as_ref(), self.params.as_ref())
30                    .await
31            }
32            #[cfg(feature = "sqlite")]
33            QueryTarget {
34                kind: QueryTargetKind::TypedSqliteTx { conn },
35                ..
36            } => {
37                crate::sqlite::connection::dml(conn, translated.as_ref(), self.params.as_ref())
38                    .await
39            }
40            #[cfg(feature = "postgres")]
41            QueryTarget {
42                kind: QueryTargetKind::TypedPostgres { conn },
43                ..
44            } => crate::typed_postgres::dml(conn, translated.as_ref(), self.params.as_ref()).await,
45            #[cfg(feature = "postgres")]
46            QueryTarget {
47                kind: QueryTargetKind::TypedPostgresTx { conn },
48                ..
49            } => crate::typed_postgres::dml(conn, translated.as_ref(), self.params.as_ref()).await,
50            #[cfg(feature = "turso")]
51            QueryTarget {
52                kind: QueryTargetKind::TypedTurso { conn },
53                ..
54            } => crate::typed_turso::dml(conn, translated.as_ref(), self.params.as_ref()).await,
55            #[cfg(feature = "turso")]
56            QueryTarget {
57                kind: QueryTargetKind::TypedTursoTx { conn },
58                ..
59            } => crate::typed_turso::dml(conn, translated.as_ref(), self.params.as_ref()).await,
60            #[cfg(feature = "postgres")]
61            QueryTarget {
62                kind: QueryTargetKind::PostgresTx(tx),
63                ..
64            } => {
65                let prepared = tx.prepare(translated.as_ref()).await?;
66                tx.execute_prepared(&prepared, self.params.as_ref()).await
67            }
68            #[cfg(feature = "mssql")]
69            QueryTarget {
70                kind: QueryTargetKind::MssqlTx(tx),
71                ..
72            } => {
73                let prepared = tx.prepare(translated.as_ref())?;
74                tx.execute_prepared(&prepared, self.params.as_ref()).await
75            }
76            #[cfg(feature = "libsql")]
77            QueryTarget {
78                kind: QueryTargetKind::LibsqlTx(tx),
79                ..
80            } => {
81                let prepared = tx.prepare(translated.as_ref())?;
82                tx.execute_prepared(&prepared, self.params.as_ref()).await
83            }
84            #[cfg(feature = "turso")]
85            QueryTarget {
86                kind: QueryTargetKind::TursoTx(tx),
87                ..
88            } => {
89                let mut prepared = tx.prepare(translated.as_ref()).await?;
90                tx.execute_prepared(&mut prepared, self.params.as_ref())
91                    .await
92            }
93        }
94    }
95}