dojo_orm/
database.rs

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}