diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-05 20:31:55 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-05 20:31:55 +0100 |
| commit | 65ca3f3450d0067668111f6e13cc3089768c9efe (patch) | |
| tree | 89dceed4f711d25ff2763e18a4be7e1a59e79507 /database/src/lib.rs | |
| parent | 1af0468788c0a592a76398206e6c7479384853ec (diff) | |
| download | jellything-65ca3f3450d0067668111f6e13cc3089768c9efe.tar jellything-65ca3f3450d0067668111f6e13cc3089768c9efe.tar.bz2 jellything-65ca3f3450d0067668111f6e13cc3089768c9efe.tar.zst | |
remove read/write distinction for kv transactions; traitify database
Diffstat (limited to 'database/src/lib.rs')
| -rw-r--r-- | database/src/lib.rs | 71 |
1 files changed, 63 insertions, 8 deletions
diff --git a/database/src/lib.rs b/database/src/lib.rs index 00e6905..f6f3fa9 100644 --- a/database/src/lib.rs +++ b/database/src/lib.rs @@ -3,15 +3,70 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin <metamuffin.org> */ -pub mod filter; -pub mod prefix_iterator; -pub mod query; -pub mod sort; -pub mod table; +pub mod kv; #[cfg(test)] pub mod test_shared; -pub mod counters; -pub type Pad32 = u32; +use anyhow::Result; +use jellyobject::{ObjectBuffer, Path}; -pub use jellykv as kv; +pub type RowNum = u64; +pub type RowIter = Box<dyn Iterator<Item = Result<RowNum>>>; + +pub trait Database { + fn transaction(&self, f: &mut dyn FnMut(&mut dyn Transaction) -> Result<()>) -> Result<()>; +} + +pub trait Transaction { + fn insert(&self, entry: ObjectBuffer) -> Result<RowNum>; + fn get(&self, row: RowNum) -> Result<Option<ObjectBuffer>>; + fn remove(&self, row: RowNum) -> Result<()>; + fn update(&self, row: RowNum, entry: ObjectBuffer) -> Result<()>; + fn query(&self, query: Query) -> Result<RowIter>; + fn query_single(&self, query: Query) -> Result<Option<RowNum>>; + fn count(&self, query: Query) -> Result<u64>; +} + +#[derive(Default)] +pub struct Query { + pub filter: Filter, + pub sort: Sort, +} + +#[derive(Default)] +pub enum Sort { + #[default] + None, + Value(ValueSort), + TextSearch(Path, String), +} + +pub struct ValueSort { + pub order: SortOrder, + pub path: Path, + pub multi: MultiBehaviour, + pub offset: Option<Vec<u8>>, +} + +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] +pub enum MultiBehaviour { + First, + ForEach, + Max, + Min, + Count, +} +pub enum SortOrder { + Ascending, + Descending, +} + +#[derive(Debug, Clone, Default)] +pub enum Filter { + #[default] + True, + All(Vec<Filter>), + Any(Vec<Filter>), + Match(Path, Vec<u8>), + Has(Path), +} |