use std::path::Path;
use std::sync::Arc;
use parking_lot::Mutex;
use rusqlite::Connection;
use crate::error::{LocalError, LocalResult};
#[derive(Clone)]
pub struct SqliteDb {
conn: Arc<Mutex<Connection>>,
}
impl SqliteDb {
pub fn open(path: impl AsRef<Path>) -> LocalResult<Self> {
let conn = Connection::open(path.as_ref())?;
Self::from_connection(conn)
}
pub fn open_in_memory() -> LocalResult<Self> {
let conn = Connection::open_in_memory()?;
Self::from_connection(conn)
}
fn from_connection(conn: Connection) -> LocalResult<Self> {
conn.pragma_update(None, "journal_mode", "WAL")?;
conn.pragma_update(None, "foreign_keys", true)?;
Ok(Self {
conn: Arc::new(Mutex::new(conn)),
})
}
pub fn with_conn<T>(
&self,
f: impl FnOnce(&Connection) -> rusqlite::Result<T>,
) -> LocalResult<T> {
let guard = self.conn.lock();
f(&guard).map_err(LocalError::from)
}
}