aboutsummaryrefslogtreecommitdiff
path: root/database/src/backends/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-18 18:45:53 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-18 18:45:53 +0100
commitda985cc06e4caa7501222dbf54f212536fd42b0c (patch)
tree106ebacb66abb8fd97a7be4e802ac45d8ce9852d /database/src/backends/mod.rs
parentfc7f3ae8e39a0398ceba7b9c44f58679c01a98da (diff)
downloadjellything-da985cc06e4caa7501222dbf54f212536fd42b0c.tar
jellything-da985cc06e4caa7501222dbf54f212536fd42b0c.tar.bz2
jellything-da985cc06e4caa7501222dbf54f212536fd42b0c.tar.zst
transaction interface
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)?),