aboutsummaryrefslogtreecommitdiff
path: root/database/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/lib.rs')
-rw-r--r--database/src/lib.rs71
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),
+}