cdbc_sqlite/statement/
mod.rs1use 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}