diff --git a/Cargo.lock b/Cargo.lock index e9d18fbb..57b1badb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -384,12 +384,11 @@ dependencies = [ "nanoid", "p256", "pollster", - "r2d2", - "r2d2_sqlite", "ring", "rmp-serde", "robusta_jni", "rstest", + "rusqlite", "rusqlite_migration", "security-framework", "security-framework-sys", @@ -1356,17 +1355,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.11", + "parking_lot_core", ] [[package]] @@ -1378,24 +1367,11 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", "winapi", ] -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.17", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "password-hash" version = "0.5.0" @@ -1607,28 +1583,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "r2d2" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" -dependencies = [ - "log", - "parking_lot 0.12.4", - "scheduled-thread-pool", -] - -[[package]] -name = "r2d2_sqlite" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63417e83dc891797eea3ad379f52a5986da4bca0d6ef28baf4d14034dd111b0c" -dependencies = [ - "r2d2", - "rusqlite", - "uuid", -] - [[package]] name = "rand" version = "0.8.5" @@ -1697,15 +1651,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags 2.9.1", -] - [[package]] name = "regex" version = "1.11.1" @@ -1938,15 +1883,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scheduled-thread-pool" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" -dependencies = [ - "parking_lot 0.12.4", -] - [[package]] name = "scoped-tls" version = "1.0.1" @@ -2111,7 +2047,7 @@ dependencies = [ "fxhash", "libc", "log", - "parking_lot 0.11.2", + "parking_lot", ] [[package]] @@ -2675,18 +2611,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "uuid" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" -dependencies = [ - "getrandom 0.3.3", - "js-sys", - "rand 0.9.1", - "wasm-bindgen", -] - [[package]] name = "valuable" version = "0.1.1" @@ -2738,7 +2662,6 @@ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", - "rustversion", "wasm-bindgen-macro", ] diff --git a/Cargo.toml b/Cargo.toml index 95f6dbab..67575152 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -96,8 +96,7 @@ itertools = "0.14.0" rmp-serde = "1.3.0" security-framework-sys = { version = "2.14.0", optional = true } rusqlite_migration = "2.3.0" -r2d2 = "0.8.10" -r2d2_sqlite = { version = "0.31.0", features = ["bundled"] } +rusqlite = { version = "0.37.0", features = ["bundled"] } [dev-dependencies] color-eyre = "0.6.3" diff --git a/src/storage/storage_backend/sqlite_store.rs b/src/storage/storage_backend/sqlite_store.rs index a60d9485..0699171f 100644 --- a/src/storage/storage_backend/sqlite_store.rs +++ b/src/storage/storage_backend/sqlite_store.rs @@ -2,15 +2,11 @@ use core::fmt; use std::{ fs::create_dir_all, path::{Path, PathBuf}, - sync::Arc, + sync::{Arc, Mutex}, }; use itertools::Itertools; -use r2d2::{Builder, Pool}; -use r2d2_sqlite::{ - rusqlite::{self, named_params}, - SqliteConnectionManager, -}; +use rusqlite::{named_params, Connection}; use rusqlite_migration::{Migrations, M}; use thiserror::Error; @@ -25,8 +21,8 @@ pub enum SqliteBackendError { SqlError(#[from] rusqlite::Error), #[error("Key not found.")] NoKeyError, - #[error("Failed to acquire SQLite pooled connection.")] - Acquire { source: r2d2::Error }, + #[error("Failed to acquire lock to SQLite connection.")] + Acquire, } #[derive(Error, Debug)] @@ -41,14 +37,15 @@ pub enum SqliteBackendInitializationError { #[error("Failed to set SQLite pragmas: {source}")] Pragma { source: rusqlite::Error }, #[error("Failed opening sqlite database with path '{path:?}' and error: {source}")] - Open { source: r2d2::Error, path: PathBuf }, - #[error("Failed to acquire SQLite pooled connection.")] - Acquire { source: r2d2::Error }, + Open { + source: rusqlite::Error, + path: PathBuf, + }, } #[derive(Clone)] pub(in crate::storage) struct SqliteBackend { - pool: Arc>, + connection: Arc>, } const MIGRATIONS_SLICE: &[M<'_>] = &[ @@ -67,25 +64,18 @@ impl SqliteBackend { tracing::trace!("opening sql db: {:?}", path); - let manager = SqliteConnectionManager::file(&path).with_init(|conn| { - conn.pragma_update(None, "journal_mode", "WAL")?; - conn.pragma_update(None, "synchronous", "NORMAL")?; - conn.pragma_update(None, "busy_timeout", "15000")?; - - Ok(()) - }); - let pool = Builder::new().build(manager).map_err(|err| { - SqliteBackendInitializationError::Open { + let mut conn = + Connection::open(&path).map_err(|err| SqliteBackendInitializationError::Open { source: err, path: path, - } - })?; + })?; - // This is ok, as conn only is mut to hinder nested transactions on one connection. - // See `rusqlite::Transaction` for more info. - let mut conn = pool - .get() - .map_err(|err| SqliteBackendInitializationError::Acquire { source: err })?; + conn.pragma_update(None, "journal_mode", "WAL") + .map_err(|err| SqliteBackendInitializationError::Pragma { source: err })?; + conn.pragma_update(None, "synchronous", "NORMAL") + .map_err(|err| SqliteBackendInitializationError::Pragma { source: err })?; + conn.pragma_update(None, "busy_timeout", "15000") + .map_err(|err| SqliteBackendInitializationError::Pragma { source: err })?; match MIGRATIONS.to_latest(&mut conn) { Ok(_) => (), @@ -104,7 +94,7 @@ impl SqliteBackend { } Ok(Self { - pool: Arc::new(pool), + connection: Arc::new(Mutex::new(conn)), }) } } @@ -117,9 +107,9 @@ impl fmt::Debug for SqliteBackend { impl StorageBackend for SqliteBackend { fn store(&self, key: ScopedKey, data: &[u8]) -> Result<(), StorageBackendError> { - self.pool - .get() - .map_err(|err| SqliteBackendError::Acquire { source: err })? + self.connection + .lock() + .map_err(|_| SqliteBackendError::Acquire)? .execute( "INSERT INTO keys (id, provider, encryption_key_id, signature_key_id, data_blob) VALUES (:id, :provider, :encryption_key_id, :signature_key_id, :data_blob) @@ -142,9 +132,9 @@ impl StorageBackend for SqliteBackend { "SELECT data_blob FROM keys WHERE id = :id AND provider = :provider AND encryption_key_id = :encryption_key_id AND signature_key_id = :signature_key_id;"; let result = self - .pool - .get() - .map_err(|err| SqliteBackendError::Acquire { source: err })? + .connection + .lock() + .map_err(|_| SqliteBackendError::Acquire)? .query_one( query, named_params! { @@ -169,9 +159,9 @@ impl StorageBackend for SqliteBackend { let query = "DELETE FROM keys WHERE id = :id AND provider = :provider AND encryption_key_id = :encryption_key_id AND signature_key_id = :signature_key_id;"; - self.pool - .get() - .map_err(|err| SqliteBackendError::Acquire { source: err })? + self.connection + .lock() + .map_err(|_| SqliteBackendError::Acquire)? .execute( query, named_params! { @@ -186,9 +176,9 @@ impl StorageBackend for SqliteBackend { } fn keys(&self) -> Vec> { - let conn = match self.pool.get() { + let conn = match self.connection.lock() { Ok(c) => c, - Err(err) => return vec![Err(SqliteBackendError::Acquire { source: err }.into())], + Err(_) => return vec![Err(SqliteBackendError::Acquire.into())], }; let query = "SELECT id, provider, encryption_key_id, signature_key_id FROM keys;";