Skip to main content

oiseau/drivers/
sqlite.rs

1#[cfg(not(feature = "redis"))]
2use crate::cache::no_cache::NoCache;
3#[cfg(feature = "redis")]
4use crate::cache::redis::RedisCache;
5
6use crate::{cache::Cache, config::Configuration};
7pub use rusqlite::{Connection, Result};
8
9#[derive(Clone)]
10pub struct DataManager<T: Clone + Configuration>(
11    pub T,
12    #[cfg(feature = "redis")] pub RedisCache,
13    #[cfg(not(feature = "redis"))] pub NoCache,
14);
15
16impl<T: Clone + Configuration> DataManager<T> {
17    /// Obtain a connection to the staging database.
18    pub async fn connect(&self) -> Result<Connection> {
19        Connection::open(&self.0.db_config().name)
20    }
21
22    /// Create a new [`DataManager`] (and init database).
23    pub async fn new(config: T) -> Result<Self> {
24        let this = Self(
25            config.clone(),
26            #[cfg(feature = "redis")]
27            RedisCache::new().await,
28            #[cfg(not(feature = "redis"))]
29            NoCache::new().await,
30        );
31
32        let conn = this.connect().await?;
33        conn.pragma_update(None, "journal_mode", "WAL").unwrap();
34
35        Ok(this)
36    }
37}
38
39#[macro_export]
40macro_rules! sqlite_get {
41    ($row:ident->$idx:literal($t:ty)) => {
42        $row.get::<usize, $t>($idx).unwrap()
43    };
44
45    ($row:ident->$idx:literal($t:ty) default ($default:expr)) => {
46        $row.get::<usize, $t>($idx).unwrap_or($default)
47    };
48
49    ($row:ident->$idx:ident($t:ty)) => {
50        $row.get::<usize, $t>($idx).unwrap()
51    };
52
53    ($row:ident->$idx:ident($t:ty) default ($default:expr)) => {
54        $row.get::<usize, $t>($idx).unwrap_or($default)
55    };
56}
57
58#[macro_export]
59macro_rules! sqlite_query_row {
60    ($conn:expr, $sql:expr, $params:expr, $f:expr) => {{
61        let mut query = $conn.prepare($sql).unwrap();
62        query.query_row($params, $f)
63    }};
64}
65
66#[macro_export]
67macro_rules! sqlite_query_rows {
68    ($conn:expr, $sql:expr, $params:expr, $f:expr) => {{
69        let mut query = $conn.prepare($sql).unwrap();
70
71        if let Ok(mut rows) = query.query($params) {
72            let mut out = Vec::new();
73
74            while let Some(row) = rows.next().unwrap() {
75                out.push($f(&row));
76            }
77
78            Ok(out)
79        } else {
80            Err(Error::Unknown)
81        }
82    }};
83}
84
85#[macro_export]
86macro_rules! sqlite_execute {
87    ($conn:expr, $sql:expr, $params:expr) => {
88        $conn.prepare($sql).unwrap().execute($params)
89    };
90
91    ($conn:expr, $sql:expr) => {
92        $conn.prepare($sql).unwrap().execute(())
93    };
94}
95
96#[macro_export]
97macro_rules! sqlite_params {
98    () => {
99        $crate::rparams![]
100    };
101    ($($params:expr),+ $(,)?) => {
102        $crate::rparams![$($params),+]
103    };
104}