cdbc_sqlite/statement/
mod.rs

1use cdbc::column::ColumnIndex;
2use cdbc::error::Error;
3use crate::{Sqlite, SqliteArguments, SqliteColumn, SqliteTypeInfo};
4use cdbc::statement::Statement;
5use cdbc::HashMap;
6use either::Either;
7use std::sync::Arc;
8use cdbc::ustr::UStr;
9
10mod handle;
11mod r#virtual;
12
13pub use handle::StatementHandle;
14pub use r#virtual::VirtualStatement;
15
16#[derive(Debug, Clone)]
17#[allow(clippy::rc_buffer)]
18pub struct SqliteStatement {
19    pub sql: String,
20    pub parameters: usize,
21    pub columns: Arc<Vec<SqliteColumn>>,
22    pub column_names: Arc<HashMap<UStr, usize>>,
23}
24
25impl Statement for SqliteStatement {
26    type Database = Sqlite;
27
28    fn to_owned(&self) -> SqliteStatement {
29        SqliteStatement {
30            sql: self.sql.clone(),
31            parameters: self.parameters,
32            columns: Arc::clone(&self.columns),
33            column_names: Arc::clone(&self.column_names),
34        }
35    }
36
37    fn sql(&self) -> &str {
38        &self.sql
39    }
40
41    fn sql_mut(&mut self) -> &mut String {
42        &mut self.sql
43    }
44
45    fn parameters(&self) -> Option<Either<&[SqliteTypeInfo], usize>> {
46        Some(Either::Right(self.parameters))
47    }
48
49    fn columns(&self) -> &[SqliteColumn] {
50        &self.columns
51    }
52
53    #[inline]
54    fn query(self) -> cdbc::query::Query< Self::Database, SqliteArguments<'static>> {
55    cdbc::query::query_statement(self)
56    }
57
58    #[inline]
59    fn query_with<'s, A>(self, arguments: A) -> cdbc::query::Query<Self::Database, A>
60        where
61            A: cdbc::arguments::IntoArguments<'s, Self::Database>,
62    {
63        cdbc::query::query_statement_with(self, arguments)
64    }
65
66    #[inline]
67    fn query_as<O>(
68        self,
69    ) -> cdbc::query_as::QueryAs<
70        Self::Database,
71        O,
72        <Self::Database as cdbc::database::HasArguments<'static>>::Arguments,
73    >
74        where
75            O: for<'r> cdbc::from_row::FromRow<
76                'r,
77                <Self::Database as cdbc::database::Database>::Row,
78            >,
79    {
80        cdbc::query_as::query_statement_as(self)
81    }
82
83    #[inline]
84    fn query_as_with<'s, O, A>(
85        self,
86        arguments: A,
87    ) -> cdbc::query_as::QueryAs<Self::Database, O, A>
88        where
89            O: for<'r> cdbc::from_row::FromRow<
90                'r,
91                <Self::Database as cdbc::database::Database>::Row,
92            >,
93            A: cdbc::arguments::IntoArguments<'s, Self::Database>,
94    {
95        cdbc::query_as::query_statement_as_with(self, arguments)
96    }
97
98    #[inline]
99    fn query_scalar<O>(
100        self,
101    ) -> cdbc::query_scalar::QueryScalar<
102        Self::Database,
103        O,
104        <Self::Database as cdbc::database::HasArguments<'static>>::Arguments,
105    >
106        where
107            (O,): for<'r> cdbc::from_row::FromRow<
108                'r,
109                <Self::Database as cdbc::database::Database>::Row,
110            >,
111    {
112        cdbc::query_scalar::query_statement_scalar(self)
113    }
114
115    #[inline]
116    fn query_scalar_with<'s, O, A>(
117        self,
118        arguments: A,
119    ) -> cdbc::query_scalar::QueryScalar<Self::Database, O, A>
120        where
121            (O,): for<'r> cdbc::from_row::FromRow<
122                'r,
123                <Self::Database as cdbc::database::Database>::Row,
124            >,
125            A: cdbc::arguments::IntoArguments<'s, Self::Database>,
126    {
127        cdbc::query_scalar::query_statement_scalar_with(self, arguments)
128    }
129}
130
131impl ColumnIndex<SqliteStatement> for &'_ str {
132    fn index(&self, statement: &SqliteStatement) -> Result<usize, Error> {
133        statement
134            .column_names
135            .get(*self)
136            .ok_or_else(|| Error::ColumnNotFound((*self).into()))
137            .map(|v| *v)
138    }
139}