/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin */ mod memory; mod redb; mod rocksdb; use anyhow::{Result, bail}; use std::{path::Path, sync::Arc}; pub type WriteTxnFunction = dyn FnMut(&mut dyn WriteTransaction) -> Result<()>; pub type ReadTxnFunction = dyn FnMut(&dyn ReadTransaction) -> Result<()>; pub trait Database: Send + Sync + 'static { fn write_transaction( &self, f: &mut dyn FnMut(&mut dyn WriteTransaction) -> Result<()>, ) -> Result<()>; fn read_transaction(&self, f: &mut dyn FnMut(&dyn ReadTransaction) -> Result<()>) -> 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 iter<'a>( &'a self, key: &[u8], reverse: bool, ) -> Result>> + 'a>>; } pub fn create_backend(driver: &str, path: &Path) -> Result> { Ok(match driver { "rocksdb" => Arc::new(rocksdb::new(path)?), "redb" => Arc::new(redb::new(path)?), "memory" => Arc::new(memory::new()), _ => bail!("unknown db driver"), }) }