Skip to main content

sql_middleware/typed/any/
ops.rs

1use crate::SqlMiddlewareDbError;
2use crate::typed::traits::{BeginTx, TxConn, TypedConnOps};
3use crate::{middleware::RowValues, results::ResultSet};
4
5use super::{AnyIdle, AnyTx};
6
7impl TypedConnOps for AnyIdle {
8    #[allow(clippy::manual_async_fn)]
9    fn execute_batch(
10        &mut self,
11        sql: &str,
12    ) -> impl std::future::Future<Output = Result<(), SqlMiddlewareDbError>> {
13        async move {
14            match self {
15                #[cfg(feature = "postgres")]
16                AnyIdle::Postgres(conn) => conn.execute_batch(sql).await,
17                #[cfg(feature = "sqlite")]
18                AnyIdle::Sqlite(conn) => conn.execute_batch(sql).await,
19                #[cfg(feature = "mssql")]
20                AnyIdle::Mssql(conn) => conn.execute_batch(sql).await,
21                #[cfg(feature = "turso")]
22                AnyIdle::Turso(conn) => conn.execute_batch(sql).await,
23                #[allow(unreachable_patterns)]
24                _ => unreachable!("typed backends are not enabled"),
25            }
26        }
27    }
28
29    #[allow(clippy::manual_async_fn)]
30    fn dml(
31        &mut self,
32        query: &str,
33        params: &[RowValues],
34    ) -> impl std::future::Future<Output = Result<usize, SqlMiddlewareDbError>> {
35        async move {
36            match self {
37                #[cfg(feature = "postgres")]
38                AnyIdle::Postgres(conn) => conn.dml(query, params).await,
39                #[cfg(feature = "sqlite")]
40                AnyIdle::Sqlite(conn) => conn.dml(query, params).await,
41                #[cfg(feature = "mssql")]
42                AnyIdle::Mssql(conn) => conn.dml(query, params).await,
43                #[cfg(feature = "turso")]
44                AnyIdle::Turso(conn) => conn.dml(query, params).await,
45                #[allow(unreachable_patterns)]
46                _ => unreachable!("typed backends are not enabled"),
47            }
48        }
49    }
50
51    #[allow(clippy::manual_async_fn)]
52    fn select(
53        &mut self,
54        query: &str,
55        params: &[RowValues],
56    ) -> impl std::future::Future<Output = Result<ResultSet, SqlMiddlewareDbError>> {
57        async move {
58            match self {
59                #[cfg(feature = "postgres")]
60                AnyIdle::Postgres(conn) => conn.select(query, params).await,
61                #[cfg(feature = "sqlite")]
62                AnyIdle::Sqlite(conn) => conn.select(query, params).await,
63                #[cfg(feature = "mssql")]
64                AnyIdle::Mssql(conn) => conn.select(query, params).await,
65                #[cfg(feature = "turso")]
66                AnyIdle::Turso(conn) => conn.select(query, params).await,
67                #[allow(unreachable_patterns)]
68                _ => unreachable!("typed backends are not enabled"),
69            }
70        }
71    }
72}
73
74impl TypedConnOps for AnyTx {
75    #[allow(clippy::manual_async_fn)]
76    fn execute_batch(
77        &mut self,
78        sql: &str,
79    ) -> impl std::future::Future<Output = Result<(), SqlMiddlewareDbError>> {
80        async move {
81            match self {
82                #[cfg(feature = "postgres")]
83                AnyTx::Postgres(conn) => conn.execute_batch(sql).await,
84                #[cfg(feature = "sqlite")]
85                AnyTx::Sqlite(conn) => conn.execute_batch(sql).await,
86                #[cfg(feature = "mssql")]
87                AnyTx::Mssql(conn) => conn.execute_batch(sql).await,
88                #[cfg(feature = "turso")]
89                AnyTx::Turso(conn) => conn.execute_batch(sql).await,
90                #[allow(unreachable_patterns)]
91                _ => unreachable!("typed backends are not enabled"),
92            }
93        }
94    }
95
96    #[allow(clippy::manual_async_fn)]
97    fn dml(
98        &mut self,
99        query: &str,
100        params: &[RowValues],
101    ) -> impl std::future::Future<Output = Result<usize, SqlMiddlewareDbError>> {
102        async move {
103            match self {
104                #[cfg(feature = "postgres")]
105                AnyTx::Postgres(conn) => conn.dml(query, params).await,
106                #[cfg(feature = "sqlite")]
107                AnyTx::Sqlite(conn) => conn.dml(query, params).await,
108                #[cfg(feature = "mssql")]
109                AnyTx::Mssql(conn) => conn.dml(query, params).await,
110                #[cfg(feature = "turso")]
111                AnyTx::Turso(conn) => conn.dml(query, params).await,
112                #[allow(unreachable_patterns)]
113                _ => unreachable!("typed backends are not enabled"),
114            }
115        }
116    }
117
118    #[allow(clippy::manual_async_fn)]
119    fn select(
120        &mut self,
121        query: &str,
122        params: &[RowValues],
123    ) -> impl std::future::Future<Output = Result<ResultSet, SqlMiddlewareDbError>> {
124        async move {
125            match self {
126                #[cfg(feature = "postgres")]
127                AnyTx::Postgres(conn) => conn.select(query, params).await,
128                #[cfg(feature = "sqlite")]
129                AnyTx::Sqlite(conn) => conn.select(query, params).await,
130                #[cfg(feature = "mssql")]
131                AnyTx::Mssql(conn) => conn.select(query, params).await,
132                #[cfg(feature = "turso")]
133                AnyTx::Turso(conn) => conn.select(query, params).await,
134                #[allow(unreachable_patterns)]
135                _ => unreachable!("typed backends are not enabled"),
136            }
137        }
138    }
139}
140
141impl BeginTx for AnyIdle {
142    type Tx = AnyTx;
143
144    #[allow(clippy::manual_async_fn)]
145    fn begin(self) -> impl std::future::Future<Output = Result<Self::Tx, SqlMiddlewareDbError>> {
146        async move {
147            match self {
148                #[cfg(feature = "postgres")]
149                AnyIdle::Postgres(conn) => Ok(AnyTx::Postgres(conn.begin().await?)),
150                #[cfg(feature = "sqlite")]
151                AnyIdle::Sqlite(conn) => Ok(AnyTx::Sqlite(conn.begin().await?)),
152                #[cfg(feature = "mssql")]
153                AnyIdle::Mssql(conn) => Ok(AnyTx::Mssql(conn.begin().await?)),
154                #[cfg(feature = "turso")]
155                AnyIdle::Turso(conn) => Ok(AnyTx::Turso(conn.begin().await?)),
156                #[allow(unreachable_patterns)]
157                _ => unreachable!("typed backends are not enabled"),
158            }
159        }
160    }
161}
162
163impl TxConn for AnyTx {
164    type Idle = AnyIdle;
165
166    #[allow(clippy::manual_async_fn)]
167    fn commit(self) -> impl std::future::Future<Output = Result<Self::Idle, SqlMiddlewareDbError>> {
168        async move {
169            match self {
170                #[cfg(feature = "postgres")]
171                AnyTx::Postgres(tx) => Ok(AnyIdle::Postgres(tx.commit().await?)),
172                #[cfg(feature = "sqlite")]
173                AnyTx::Sqlite(tx) => Ok(AnyIdle::Sqlite(tx.commit().await?)),
174                #[cfg(feature = "mssql")]
175                AnyTx::Mssql(tx) => Ok(AnyIdle::Mssql(tx.commit().await?)),
176                #[cfg(feature = "turso")]
177                AnyTx::Turso(tx) => Ok(AnyIdle::Turso(tx.commit().await?)),
178                #[allow(unreachable_patterns)]
179                _ => unreachable!("typed backends are not enabled"),
180            }
181        }
182    }
183
184    /// Rollback and return to idle.
185    #[allow(clippy::manual_async_fn)]
186    fn rollback(
187        self,
188    ) -> impl std::future::Future<Output = Result<Self::Idle, SqlMiddlewareDbError>> {
189        async move {
190            match self {
191                #[cfg(feature = "postgres")]
192                AnyTx::Postgres(tx) => Ok(AnyIdle::Postgres(tx.rollback().await?)),
193                #[cfg(feature = "sqlite")]
194                AnyTx::Sqlite(tx) => Ok(AnyIdle::Sqlite(tx.rollback().await?)),
195                #[cfg(feature = "mssql")]
196                AnyTx::Mssql(tx) => Ok(AnyIdle::Mssql(tx.rollback().await?)),
197                #[cfg(feature = "turso")]
198                AnyTx::Turso(tx) => Ok(AnyIdle::Turso(tx.rollback().await?)),
199                #[allow(unreachable_patterns)]
200                _ => unreachable!("typed backends are not enabled"),
201            }
202        }
203    }
204}