use rusqlite::Connection;
use std::path::Path;
pub fn open_wal(path: &Path) -> rusqlite::Result<Connection> {
let conn = Connection::open(path)?;
conn.pragma_update(None, "journal_mode", "WAL")?;
Ok(conn)
}
pub fn table_exists(conn: &Connection, name: &str) -> rusqlite::Result<bool> {
let count: i64 = conn.query_row(
"SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = ?1",
[name],
|r| r.get(0),
)?;
Ok(count > 0)
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn table_exists_true_for_existing_table() {
let conn = Connection::open_in_memory().unwrap();
conn.execute_batch("CREATE TABLE widgets (id INTEGER);").unwrap();
assert!(table_exists(&conn, "widgets").unwrap());
}
#[test]
fn table_exists_false_for_missing_table() {
let conn = Connection::open_in_memory().unwrap();
assert!(!table_exists(&conn, "widgets").unwrap());
}
#[test]
fn open_wal_sets_journal_mode() {
let dir = tempdir().unwrap();
let db_path = dir.path().join("test.db");
let conn = open_wal(&db_path).unwrap();
let mode: String = conn
.query_row("PRAGMA journal_mode", [], |r| r.get(0))
.unwrap();
assert_eq!(mode.to_lowercase(), "wal");
}
#[test]
fn open_wal_is_idempotent_across_repeated_opens() {
let dir = tempdir().unwrap();
let db_path = dir.path().join("test.db");
open_wal(&db_path).unwrap();
let conn = open_wal(&db_path).unwrap();
let mode: String = conn
.query_row("PRAGMA journal_mode", [], |r| r.get(0))
.unwrap();
assert_eq!(mode.to_lowercase(), "wal");
}
}