diff options
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), +} |