use crate::errors::AppError;
use rusqlite::Connection;
pub fn apply_init_pragmas(conn: &Connection) -> Result<(), AppError> {
conn.execute_batch("PRAGMA auto_vacuum = INCREMENTAL;")?;
apply_connection_pragmas(conn)?;
conn.execute_batch(&format!(
"PRAGMA wal_autocheckpoint = {};",
crate::constants::WAL_AUTOCHECKPOINT_PAGES
))?;
Ok(())
}
pub fn ensure_wal_mode(conn: &Connection) -> Result<(), AppError> {
let mode: String = conn.query_row("PRAGMA journal_mode = WAL;", [], |r| r.get(0))?;
if mode != "wal" {
tracing::warn!(target: "pragmas", mode = %mode, "journal_mode did not switch to WAL after re-assertion");
}
Ok(())
}
pub fn apply_sidecar_queue_pragmas(conn: &Connection) -> Result<(), AppError> {
conn.pragma_update(None, "busy_timeout", resolved_busy_timeout_ms())?;
conn.pragma_update(None, "journal_mode", "wal")?;
Ok(())
}
fn resolved_busy_timeout_ms() -> i32 {
let ms = crate::runtime_config::db_query_timeout_ms(crate::constants::QUERY_TIMEOUT_MILLIS);
i32::try_from(ms)
.unwrap_or(crate::constants::BUSY_TIMEOUT_MILLIS)
.max(0)
}
pub fn apply_connection_pragmas(conn: &Connection) -> Result<(), AppError> {
conn.execute_batch(&format!(
"PRAGMA synchronous = NORMAL;
PRAGMA foreign_keys = ON;
PRAGMA busy_timeout = {busy};
PRAGMA cache_size = {cache};
PRAGMA temp_store = MEMORY;
PRAGMA mmap_size = {mmap};",
busy = resolved_busy_timeout_ms(),
cache = crate::constants::CACHE_SIZE_KB,
mmap = crate::constants::MMAP_SIZE_BYTES,
))?;
let mode: String = conn.query_row("PRAGMA journal_mode = WAL;", [], |r| r.get(0))?;
if mode != "wal" {
tracing::warn!(target: "pragmas", mode = %mode, "journal_mode did not switch to WAL");
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
fn busy_timeout_of(conn: &Connection) -> i64 {
conn.query_row("PRAGMA busy_timeout", [], |r| r.get(0))
.expect("busy_timeout must be readable")
}
#[test]
fn sidecar_connection_carries_the_resolved_busy_timeout() {
let conn = Connection::open_in_memory().expect("in-memory db");
apply_sidecar_queue_pragmas(&conn).expect("pragmas must apply");
assert_eq!(
busy_timeout_of(&conn),
i64::from(resolved_busy_timeout_ms())
);
}
#[test]
fn main_connection_carries_the_resolved_busy_timeout() {
let conn = Connection::open_in_memory().expect("in-memory db");
apply_connection_pragmas(&conn).expect("pragmas must apply");
assert_eq!(
busy_timeout_of(&conn),
i64::from(resolved_busy_timeout_ms())
);
}
}