pub mod bookmarks;
pub mod store;
pub mod preflight;
pub mod scheduler;
pub mod tracker;
use rusqlite::Connection;
use crate::errors::XmasterError;
pub(crate) fn open_db(file_name: &str) -> Result<Connection, XmasterError> {
let dir = crate::config::config_dir();
std::fs::create_dir_all(&dir).ok();
let conn = Connection::open(dir.join(file_name))
.map_err(|e| XmasterError::Config(format!("DB open error ({file_name}): {e}")))?;
conn.pragma_update(None, "journal_mode", "wal").ok();
conn.pragma_update(None, "busy_timeout", 5000).ok();
conn.pragma_update(None, "synchronous", "NORMAL").ok();
Ok(conn)
}
pub(crate) fn add_column_if_missing(conn: &Connection, table: &str, column: &str, decl: &str) {
let cols: Vec<String> = conn
.prepare(&format!("PRAGMA table_info({table})"))
.and_then(|mut s| {
s.query_map([], |row| row.get::<_, String>(1))?
.collect::<Result<Vec<_>, _>>()
})
.unwrap_or_default();
if !cols.iter().any(|c| c == column) {
conn.execute_batch(&format!("ALTER TABLE {table} ADD COLUMN {column} {decl};"))
.ok();
}
}