pub mod errors; pub mod models; pub mod queries; pub mod schema; use std::path::Path; use rusqlite::Connection; use errors::DatabaseError; /// Open a SQLite database at the given path, creating tables if needed. pub fn open_database(path: &Path) -> Result { let conn = Connection::open(path)?; // Enable WAL mode for concurrent reads conn.pragma_update(None, "journal_mode", "WAL")?; // Set busy timeout to 5 seconds conn.pragma_update(None, "busy_timeout", 5000)?; // Enable foreign key constraints conn.pragma_update(None, "foreign_keys", "ON")?; schema::create_tables(&conn)?; Ok(conn) } #[cfg(test)] mod tests { use super::*; #[test] fn test_open_in_memory() { let conn = Connection::open_in_memory().unwrap(); conn.pragma_update(None, "foreign_keys", "ON").unwrap(); schema::create_tables(&conn).unwrap(); // Verify tables exist by querying sqlite_master let count: i32 = conn .query_row( "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'", [], |row| row.get(0), ) .unwrap(); // 8 tables: schema_version, projects, media_files, speakers, segments, words, ai_outputs, annotations assert_eq!(count, 8); } }