From da985cc06e4caa7501222dbf54f212536fd42b0c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 18 Dec 2025 18:45:53 +0100 Subject: transaction interface --- database/src/backends/mod.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'database/src/backends/mod.rs') 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>>; - 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>>; fn next(&self, key: &[u8]) -> Result>>; fn prev(&self, key: &[u8]) -> Result>>; } -pub fn create_backend(driver: &str, path: &Path) -> Result> { +pub fn create_backend(driver: &str, path: &Path) -> Result> { Ok(match driver { "rocksdb" => Arc::new(Rocksdb::new(path)?), "redb" => Arc::new(Redb::new(path)?), -- cgit v1.3