diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-12-18 18:45:53 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-12-18 18:45:53 +0100 |
| commit | da985cc06e4caa7501222dbf54f212536fd42b0c (patch) | |
| tree | 106ebacb66abb8fd97a7be4e802ac45d8ce9852d /database/src/backends/mod.rs | |
| parent | fc7f3ae8e39a0398ceba7b9c44f58679c01a98da (diff) | |
| download | jellything-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.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)?), |