1use std::collections::HashMap;
65
66use crate::{Query, QueryBuilder, QueryBuilderTrait, TableBuilder, TablePrimaryKey, Value};
67
68#[cfg(feature = "connect")]
69pub mod connect;
70#[cfg(feature = "libsql")]
71pub mod libsql;
72#[cfg(feature = "rusqlite")]
73pub mod rusqlite;
74
75pub trait GeekConnector<'a, C>
79where
80 C: GeekConnection<Connection = C> + 'a,
81 Self: Sized + TableBuilder + QueryBuilderTrait + serde::Serialize + serde::de::DeserializeOwned,
82{
83 #[allow(async_fn_in_trait, unused_variables)]
85 async fn query(connection: &'a C, query: Query) -> Result<Vec<Self>, crate::Error> {
86 C::query::<Self>(connection, query).await
87 }
88
89 #[allow(async_fn_in_trait, unused_variables)]
91 async fn query_first(connection: &'a C, query: Query) -> Result<Self, crate::Error> {
92 C::query_first::<Self>(connection, query).await
93 }
94
95 #[allow(async_fn_in_trait, unused_variables)]
97 async fn execute(connection: &'a C, query: Query) -> Result<(), crate::Error> {
98 C::execute(connection, query).await
99 }
100
101 #[allow(async_fn_in_trait, unused_variables)]
103 async fn create_table(connection: &'a C) -> Result<(), crate::Error> {
104 C::create_table::<Self>(connection).await
105 }
106
107 #[allow(async_fn_in_trait, unused_variables)]
109 async fn row_count(connection: &'a C, query: Query) -> Result<i64, crate::Error> {
110 C::row_count(connection, query).await
111 }
112
113 #[allow(async_fn_in_trait, unused_variables)]
115 async fn total(connection: &'a C) -> Result<i64, crate::Error> {
116 C::row_count(
117 connection,
118 Self::query_count().table(Self::table()).build()?,
119 )
120 .await
121 }
122
123 #[allow(async_fn_in_trait, unused_variables)]
125 async fn all(connection: &'a C) -> Result<Vec<Self>, crate::Error> {
126 C::query::<Self>(
127 connection,
128 Self::query_select().table(Self::table()).build()?,
129 )
130 .await
131 }
132
133 #[cfg(feature = "pagination")]
135 #[allow(async_fn_in_trait, unused_variables)]
136 async fn page(connection: &'a C, page: &crate::Page) -> Result<Vec<Self>, crate::Error> {
137 C::query::<Self>(
138 connection,
139 QueryBuilder::select()
140 .table(Self::table())
141 .page(page)
142 .build()?,
143 )
144 .await
145 }
146
147 #[cfg(feature = "pagination")]
150 #[allow(async_fn_in_trait, unused_variables)]
151 async fn paginate(connection: &'a C) -> Result<crate::Pagination<Self>, crate::Error> {
152 let mut page = crate::Pagination::new();
153 page.set_total(Self::total(connection).await? as u32);
154 Ok(page)
155 }
156
157 #[allow(async_fn_in_trait, unused_variables)]
159 async fn update(&mut self, connection: &'a C) -> Result<(), crate::Error> {
160 C::execute(connection, Self::query_update(self)).await
161 }
162
163 #[allow(async_fn_in_trait, unused_variables)]
165 async fn save(&mut self, connection: &'a C) -> Result<(), crate::Error>;
166
167 #[allow(async_fn_in_trait, unused_variables)]
169 async fn delete(&self, connection: &'a C) -> Result<(), crate::Error> {
170 C::execute(connection, Self::query_delete(self)).await
171 }
172
173 #[allow(async_fn_in_trait, unused_variables)]
175 async fn fetch(&mut self, connection: &'a C) -> Result<(), crate::Error>;
176
177 #[allow(async_fn_in_trait, unused_variables)]
187 async fn filter(
188 connection: &'a C,
189 fields: Vec<(&str, impl Into<Value>)>,
190 ) -> Result<Vec<Self>, crate::Error> {
191 Self::query(
192 connection,
193 Self::query_select()
194 .table(Self::table())
195 .filter(fields)
196 .build()?,
197 )
198 .await
199 }
200
201 #[cfg(feature = "pagination")]
203 #[allow(async_fn_in_trait, unused_variables)]
204 async fn filter_page(
205 connection: &'a C,
206 fields: Vec<(&str, impl Into<Value>)>,
207 page: &crate::Page,
208 ) -> Result<Vec<Self>, crate::Error> {
209 Self::query(
210 connection,
211 Self::query_select()
212 .table(Self::table())
213 .filter(fields)
214 .page(page)
215 .build()?,
216 )
217 .await
218 }
219
220 #[deprecated(
222 since = "0.8.4",
223 note = "Please use the `all` method instead of `fetch_all`"
224 )]
225 #[allow(async_fn_in_trait, unused_variables)]
226 async fn fetch_all(connection: &'a C) -> Result<Vec<Self>, crate::Error> {
227 C::query::<Self>(
228 connection,
229 QueryBuilder::select().table(Self::table()).build()?,
230 )
231 .await
232 }
233
234 #[allow(async_fn_in_trait, unused_variables)]
236 async fn fetch_or_create(&mut self, connection: &'a C) -> Result<(), crate::Error>;
237
238 #[cfg(feature = "search")]
240 #[allow(async_fn_in_trait, unused_variables)]
241 async fn search(
242 connection: &'a C,
243 search: impl Into<String>,
244 ) -> Result<Vec<Self>, crate::Error>;
245
246 #[allow(async_fn_in_trait, unused_variables)]
248 async fn first(connection: &'a C) -> Result<Self, crate::Error>
249 where
250 Self: TablePrimaryKey,
251 {
252 C::query_first::<Self>(
253 connection,
254 Self::query_select()
255 .table(Self::table())
256 .order_by(
257 &Self::primary_key(),
258 crate::builder::models::QueryOrder::Asc,
259 )
260 .limit(1)
261 .build()?,
262 )
263 .await
264 }
265
266 #[allow(async_fn_in_trait, unused_variables)]
268 async fn last(connection: &'a C) -> Result<Self, crate::Error>
269 where
270 Self: TablePrimaryKey,
271 {
272 C::query_first::<Self>(
273 connection,
274 Self::query_select()
275 .table(Self::table())
276 .order_by(
277 &Self::primary_key(),
278 crate::builder::models::QueryOrder::Desc,
279 )
280 .limit(1)
281 .build()?,
282 )
283 .await
284 }
285}
286
287pub trait GeekConnection {
290 type Connection;
292
293 #[allow(async_fn_in_trait, unused_variables)]
295 async fn create_table<T>(connection: &Self::Connection) -> Result<(), crate::Error>
296 where
297 T: TableBuilder
298 + QueryBuilderTrait
299 + Sized
300 + serde::Serialize
301 + serde::de::DeserializeOwned,
302 {
303 Err(crate::Error::NotImplemented)
304 }
305
306 #[allow(async_fn_in_trait, unused_variables)]
308 async fn row_count(connection: &Self::Connection, query: Query) -> Result<i64, crate::Error> {
309 Err(crate::Error::NotImplemented)
310 }
311
312 #[allow(async_fn_in_trait, unused_variables)]
314 async fn execute(connection: &Self::Connection, query: Query) -> Result<(), crate::Error> {
315 Err(crate::Error::NotImplemented)
316 }
317
318 #[allow(async_fn_in_trait, unused_variables)]
320 async fn batch(connection: &Self::Connection, query: Query) -> Result<(), crate::Error> {
321 Err(crate::Error::NotImplemented)
322 }
323
324 #[allow(async_fn_in_trait, unused_variables)]
326 async fn query<T>(connection: &Self::Connection, query: Query) -> Result<Vec<T>, crate::Error>
327 where
328 T: serde::de::DeserializeOwned,
329 {
330 Err(crate::Error::NotImplemented)
331 }
332
333 #[allow(async_fn_in_trait, unused_variables)]
338 async fn query_first<T>(connection: &Self::Connection, query: Query) -> Result<T, crate::Error>
339 where
340 T: serde::de::DeserializeOwned,
341 {
342 Err(crate::Error::NotImplemented)
343 }
344
345 #[allow(async_fn_in_trait, unused_variables)]
347 async fn query_raw(
348 connection: &Self::Connection,
349 query: Query,
350 ) -> Result<Vec<HashMap<String, Value>>, crate::Error> {
351 Err(crate::Error::NotImplemented)
352 }
353
354 #[cfg(feature = "migrations")]
356 #[allow(async_fn_in_trait, unused_variables)]
357 async fn table_names(connection: &Self::Connection) -> Result<Vec<String>, crate::Error> {
358 let results: Vec<TableNames> = Self::query(
360 connection,
361 Query {
362 query: "SELECT name FROM sqlite_master WHERE type='table'".to_string(),
363 query_type: crate::builder::models::QueryType::Select,
364 ..Default::default()
365 },
366 )
367 .await?;
368
369 Ok(results
371 .iter()
372 .filter_map(|table| {
373 if table.name != "sqlite_sequence" {
374 Some(table.name.clone())
375 } else {
376 None
377 }
378 })
379 .collect())
380 }
381
382 #[cfg(feature = "migrations")]
384 #[allow(async_fn_in_trait, unused_variables)]
385 async fn pragma_info(
386 connection: &Self::Connection,
387 table: &str,
388 ) -> Result<Vec<TableInfo>, crate::Error> {
389 Self::query(
390 connection,
391 Query {
392 query: format!("PRAGMA table_info({})", table),
393 query_type: crate::builder::models::QueryType::Select,
394 ..Default::default()
395 },
396 )
397 .await
398 }
399}
400
401#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
403pub struct TableInfo {
404 pub cid: i32,
406 pub name: String,
408 #[serde(rename = "type")]
410 pub coltype: String,
411 pub notnull: i32,
413 pub dflt_value: Option<String>,
415 pub pk: i32,
417}
418
419#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
421struct TableNames {
422 pub name: String,
424}