sql_middleware/query_builder/
select.rs

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