Files
RuDS/crates/bds-core/src/db/connection.rs

50 lines
1.3 KiB
Rust

use rusqlite::Connection;
use std::path::Path;
use crate::db::migrations;
/// Database wrapper managing a SQLite connection.
pub struct Database {
conn: Connection,
}
impl Database {
/// Open an existing bDS project database.
pub fn open(path: &Path) -> Result<Self, rusqlite::Error> {
let conn = Connection::open(path)?;
conn.execute_batch("PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL; PRAGMA foreign_keys=ON;")?;
Ok(Self { conn })
}
/// Open an in-memory database (for tests).
pub fn open_in_memory() -> Result<Self, rusqlite::Error> {
let conn = Connection::open_in_memory()?;
conn.execute_batch("PRAGMA foreign_keys=ON;")?;
Ok(Self { conn })
}
/// Get a reference to the underlying connection.
pub fn conn(&self) -> &Connection {
&self.conn
}
/// Run all pending migrations via refinery.
pub fn migrate(&mut self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
migrations::run_migrations(&mut self.conn)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn open_in_memory() {
let db = Database::open_in_memory().expect("should open in-memory db");
let result: i64 = db
.conn()
.query_row("SELECT 1", [], |row| row.get(0))
.unwrap();
assert_eq!(result, 1);
}
}