oiseau 0.3.0

Super simple SQL helper
Documentation
#[cfg(not(feature = "redis"))]
use crate::cache::no_cache::NoCache;
#[cfg(feature = "redis")]
use crate::cache::redis::RedisCache;

use crate::{cache::Cache, config::Configuration};
pub use rusqlite::{Connection, Result};

#[derive(Clone)]
pub struct DataManager<T: Clone + Configuration>(
    pub T,
    #[cfg(feature = "redis")] pub RedisCache,
    #[cfg(not(feature = "redis"))] pub NoCache,
);

impl<T: Clone + Configuration> DataManager<T> {
    /// Obtain a connection to the staging database.
    pub async fn connect(&self) -> Result<Connection> {
        Connection::open(&self.0.db_config().name)
    }

    /// Create a new [`DataManager`] (and init database).
    pub async fn new(config: T) -> Result<Self> {
        let this = Self(
            config.clone(),
            #[cfg(feature = "redis")]
            RedisCache::new().await,
            #[cfg(not(feature = "redis"))]
            NoCache::new().await,
        );

        let conn = this.connect().await?;
        conn.pragma_update(None, "journal_mode", "WAL").unwrap();

        Ok(this)
    }
}

#[macro_export]
macro_rules! sqlite_get {
    ($row:ident->$idx:literal($t:ty)) => {
        $row.get::<usize, $t>($idx).unwrap()
    };

    ($row:ident->$idx:literal($t:ty) default ($default:expr)) => {
        $row.get::<usize, $t>($idx).unwrap_or($default)
    };

    ($row:ident->$idx:ident($t:ty)) => {
        $row.get::<usize, $t>($idx).unwrap()
    };

    ($row:ident->$idx:ident($t:ty) default ($default:expr)) => {
        $row.get::<usize, $t>($idx).unwrap_or($default)
    };
}

#[macro_export]
macro_rules! sqlite_query_row {
    ($conn:expr, $sql:expr, $params:expr, $f:expr) => {{
        let mut query = $conn.prepare($sql).unwrap();
        query.query_row($params, $f)
    }};
}

#[macro_export]
macro_rules! sqlite_query_rows {
    ($conn:expr, $sql:expr, $params:expr, $f:expr) => {{
        let mut query = $conn.prepare($sql).unwrap();

        if let Ok(mut rows) = query.query($params) {
            let mut out = Vec::new();

            while let Some(row) = rows.next().unwrap() {
                out.push($f(&row));
            }

            Ok(out)
        } else {
            Err(Error::Unknown)
        }
    }};
}

#[macro_export]
macro_rules! sqlite_execute {
    ($conn:expr, $sql:expr, $params:expr) => {
        $conn.prepare($sql).unwrap().execute($params)
    };

    ($conn:expr, $sql:expr) => {
        $conn.prepare($sql).unwrap().execute(())
    };
}

#[macro_export]
macro_rules! sqlite_params {
    () => {
        $crate::rparams![]
    };
    ($($params:expr),+ $(,)?) => {
        $crate::rparams![$($params),+]
    };
}