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}