1use std::fmt::Debug;
2use std::marker::PhantomData;
3
4use crate::insert_operation::{InsertManyOperation, InsertOperation};
5use crate::model::{Model, UpdateModel};
6use crate::pool::*;
7use crate::where_delete::WhereDelete;
8use crate::where_select::WhereSelect;
9use crate::where_update::WhereUpdate;
10
11#[derive(Clone)]
12pub struct Database {
13 pool: Pool<PostgresConnectionManager<NoTls>>,
14}
15
16impl Database {
17 pub async fn new(url: &str) -> anyhow::Result<Self> {
18 let manager = PostgresConnectionManager::new_from_stringlike(url, NoTls)?;
19 let pool = Pool::builder().build(manager).await?;
20
21 Ok(Self { pool })
22 }
23
24 pub async fn get(&self) -> anyhow::Result<PooledConnection<PostgresConnectionManager<NoTls>>> {
25 Ok(self.pool.get().await?)
26 }
27
28 pub fn bind<T>(&self) -> WhereSelect<T>
29 where
30 T: Model + Debug,
31 {
32 WhereSelect {
33 pool: &self.pool,
34 columns: T::COLUMNS,
35 params: vec![],
36 predicates: vec![],
37 order_by: vec![],
38 _t: PhantomData::<T>,
39 }
40 }
41
42 pub async fn drop_table<T>(&self) -> anyhow::Result<()>
43 where
44 T: Model,
45 {
46 let query = format!("DROP TABLE IF EXISTS {}", T::NAME);
47
48 let conn = self.pool.get().await?;
49 conn.execute(&query, &[]).await?;
50
51 Ok(())
52 }
53
54 pub fn insert<'a, T>(&'a self, data: &'a T) -> InsertOperation<'a, T>
55 where
56 T: Model + Debug,
57 {
58 InsertOperation {
59 pool: &self.pool,
60 data: &data,
61 }
62 }
63
64 pub fn insert_many<'a, T>(&'a self, data: &'a [T]) -> InsertManyOperation<'a, T>
65 where
66 T: Model + Debug,
67 {
68 InsertManyOperation {
69 pool: &self.pool,
70 data: &data,
71 }
72 }
73
74 pub fn update<'a, T, U>(&'a self, data: &'a U) -> WhereUpdate<'a, T, U>
75 where
76 T: Model + Debug,
77 U: UpdateModel,
78 {
79 WhereUpdate {
80 pool: &self.pool,
81 columns: data.columns(),
82 params: data.params(),
83 predicates: vec![],
84 _t: PhantomData,
85 _u: PhantomData,
86 }
87 }
88
89 pub fn delete<T>(&self) -> WhereDelete<T>
90 where
91 T: Model + Debug,
92 {
93 WhereDelete {
94 pool: &self.pool,
95 predicates: vec![],
96 _t: PhantomData,
97 }
98 }
99}