aboutsummaryrefslogtreecommitdiff
path: root/database/src/backends/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/backends/mod.rs')
-rw-r--r--database/src/backends/mod.rs19
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)?),