use r2d2::ManageConnection;
use rusqlite::Connection;
use std::path::PathBuf;
pub enum SqliteConnectionManager {
File(PathBuf),
SharedMemory { uri: String },
}
impl SqliteConnectionManager {
pub fn file(path: impl Into<PathBuf>) -> Self {
Self::File(path.into())
}
pub fn shared_memory(uri: impl Into<String>) -> Self {
Self::SharedMemory { uri: uri.into() }
}
}
impl ManageConnection for SqliteConnectionManager {
type Connection = Connection;
type Error = rusqlite::Error;
fn connect(&self) -> Result<Connection, rusqlite::Error> {
let conn = match self {
Self::File(path) => Connection::open(path)?,
Self::SharedMemory { uri } => Connection::open_with_flags(
uri,
rusqlite::OpenFlags::SQLITE_OPEN_READ_WRITE
| rusqlite::OpenFlags::SQLITE_OPEN_CREATE
| rusqlite::OpenFlags::SQLITE_OPEN_URI,
)?,
};
conn.execute_batch("PRAGMA foreign_keys = ON;")?;
Ok(conn)
}
fn is_valid(&self, conn: &mut Connection) -> Result<(), rusqlite::Error> {
conn.execute_batch("SELECT 1;")
}
fn has_broken(&self, _conn: &mut Connection) -> bool {
false
}
}