use r2d2::CustomizeConnection;
use rusqlite::Connection;
use crate::{constant::DEFAULT_SQLITE_TIMEOUT, helper::load_sqlite_vector_extension};
#[derive(Debug)]
pub struct SqliteConnectionCustomizer {
busy_timeout_ms: u32,
}
impl SqliteConnectionCustomizer {
pub fn new() -> Box<Self> {
Box::new(SqliteConnectionCustomizer {
busy_timeout_ms: DEFAULT_SQLITE_TIMEOUT,
})
}
pub fn with_busy_timeout(busy_timeout_ms: u32) -> Box<Self> {
Box::new(SqliteConnectionCustomizer { busy_timeout_ms })
}
}
impl Default for SqliteConnectionCustomizer {
fn default() -> Self {
SqliteConnectionCustomizer {
busy_timeout_ms: DEFAULT_SQLITE_TIMEOUT,
}
}
}
impl CustomizeConnection<Connection, rusqlite::Error> for SqliteConnectionCustomizer {
fn on_acquire(&self, conn: &mut Connection) -> Result<(), rusqlite::Error> {
conn.busy_timeout(std::time::Duration::from_millis(self.busy_timeout_ms as u64))?;
conn.pragma_update(None, "journal_mode", "WAL")?;
conn.pragma_update(None, "synchronous", "NORMAL")?;
load_sqlite_vector_extension(conn).map_err(|e| {
rusqlite::Error::SqliteFailure(rusqlite::ffi::Error::new(1), Some(e.to_string()))
})
}
fn on_release(&self, _conn: Connection) {}
}