chug_cli/db/
mod.rs

1use std::sync::{Mutex, MutexGuard};
2
3use anyhow::{Context, anyhow};
4use diesel::{prelude::*, sql_query};
5use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations};
6
7use crate::dirs::db_file;
8
9pub mod models;
10pub mod schema;
11
12const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
13
14fn connection() -> anyhow::Result<MutexGuard<'static, SqliteConnection>> {
15    let mutex = cache!(Mutex<SqliteConnection>).get_or_init(|| {
16        let path = db_file()?.to_str().context("DB file path is non-utf8")?;
17        let mut db = SqliteConnection::establish(path)?;
18
19        sql_query("PRAGMA foreign_keys = ON;").execute(&mut db)?;
20
21        db.run_pending_migrations(MIGRATIONS)
22            .map_err(|e| anyhow!(e))?;
23
24        Ok(Mutex::new(db))
25    })?;
26
27    Ok(mutex.lock().unwrap())
28}