diff options
Diffstat (limited to 'database/src/backends/mod.rs')
| -rw-r--r-- | database/src/backends/mod.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/database/src/backends/mod.rs b/database/src/backends/mod.rs index 814cc50..a95b00a 100644 --- a/database/src/backends/mod.rs +++ b/database/src/backends/mod.rs @@ -12,15 +12,24 @@ use crate::backends::{memory::Memory, redb::Redb, rocksdb::Rocksdb}; use anyhow::{Result, bail}; use std::{path::Path, sync::Arc}; -pub trait KV { - fn set(&self, key: &[u8], value: &[u8]) -> Result<()>; - fn get<'a>(&'a self, key: &[u8]) -> Result<Option<Vec<u8>>>; - fn del(&self, key: &[u8]) -> Result<()>; +pub type WriteTxnFunction = dyn FnMut(&mut dyn WriteTransaction) -> Result<()>; +pub type ReadTxnFunction = dyn FnMut(&dyn ReadTransaction) -> Result<()>; + +pub trait Db { + fn write_transaction(&self, f: &mut WriteTxnFunction) -> Result<()>; + fn read_transaction(&self, f: &mut ReadTxnFunction) -> Result<()>; +} +pub trait WriteTransaction: ReadTransaction { + fn set(&mut self, key: &[u8], value: &[u8]) -> Result<()>; + fn del(&mut self, key: &[u8]) -> Result<()>; +} +pub trait ReadTransaction { + fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>; fn next(&self, key: &[u8]) -> Result<Option<Vec<u8>>>; fn prev(&self, key: &[u8]) -> Result<Option<Vec<u8>>>; } -pub fn create_backend(driver: &str, path: &Path) -> Result<Arc<dyn KV>> { +pub fn create_backend(driver: &str, path: &Path) -> Result<Arc<dyn Db>> { Ok(match driver { "rocksdb" => Arc::new(Rocksdb::new(path)?), "redb" => Arc::new(Redb::new(path)?), |