diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-01-15 02:57:31 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-01-15 02:57:31 +0100 |
| commit | c836b650eaf4ba33b1cfd2b475971b3ccc9f69b7 (patch) | |
| tree | 2ea722aff33252ff2e3662faee63cabb223339c3 /database | |
| parent | 8c0ee6d17fe0dbd7748e7b60ff01a0e8f25faa51 (diff) | |
| download | jellything-c836b650eaf4ba33b1cfd2b475971b3ccc9f69b7.tar jellything-c836b650eaf4ba33b1cfd2b475971b3ccc9f69b7.tar.bz2 jellything-c836b650eaf4ba33b1cfd2b475971b3ccc9f69b7.tar.zst | |
new update_node_init
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/backends/memory.rs | 14 | ||||
| -rw-r--r-- | database/src/backends/mod.rs | 10 | ||||
| -rw-r--r-- | database/src/backends/redb.rs | 14 | ||||
| -rw-r--r-- | database/src/backends/rocksdb.rs | 12 | ||||
| -rw-r--r-- | database/src/filter/mod.rs | 1 | ||||
| -rw-r--r-- | database/src/query.rs | 7 | ||||
| -rw-r--r-- | database/src/sort/mod.rs | 2 | ||||
| -rw-r--r-- | database/src/sort/value.rs | 2 | ||||
| -rw-r--r-- | database/src/table.rs | 34 |
9 files changed, 76 insertions, 20 deletions
diff --git a/database/src/backends/memory.rs b/database/src/backends/memory.rs index 0c1635f..e010a84 100644 --- a/database/src/backends/memory.rs +++ b/database/src/backends/memory.rs @@ -4,9 +4,7 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use crate::backends::{ - Database, ReadTransaction, ReadTxnFunction, WriteTransaction, WriteTxnFunction, -}; +use crate::backends::{Database, ReadTransaction, WriteTransaction}; use anyhow::Result; use std::{ collections::BTreeMap, @@ -21,10 +19,16 @@ pub fn new() -> Memdb { } impl Database for Memdb { - fn write_transaction(&self, f: &mut WriteTxnFunction) -> Result<()> { + fn write_transaction( + &self, + f: &mut dyn FnMut(&mut dyn WriteTransaction) -> Result<()>, + ) -> Result<()> { f(&mut self.write().unwrap()) } - fn read_transaction(&self, f: &mut ReadTxnFunction) -> Result<()> { + fn read_transaction( + &self, + f: &mut dyn FnMut(&dyn ReadTransaction) -> Result<()>, + ) -> Result<()> { f(&self.read().unwrap()) } } diff --git a/database/src/backends/mod.rs b/database/src/backends/mod.rs index 4cbb4cf..ba30b46 100644 --- a/database/src/backends/mod.rs +++ b/database/src/backends/mod.rs @@ -14,9 +14,13 @@ 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 { - fn write_transaction(&self, f: &mut WriteTxnFunction) -> Result<()>; - fn read_transaction(&self, f: &mut ReadTxnFunction) -> 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<()>; diff --git a/database/src/backends/redb.rs b/database/src/backends/redb.rs index 70623b5..c0887c8 100644 --- a/database/src/backends/redb.rs +++ b/database/src/backends/redb.rs @@ -4,9 +4,7 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use crate::backends::{ - Database, ReadTransaction, ReadTxnFunction, WriteTransaction, WriteTxnFunction, -}; +use crate::backends::{Database, ReadTransaction, WriteTransaction}; use anyhow::Result; use redb::{AccessGuard, ReadableDatabase, ReadableTable, StorageError, Table, TableDefinition}; use std::path::Path; @@ -18,7 +16,10 @@ pub fn new(path: &Path) -> Result<redb::Database> { } impl Database for redb::Database { - fn write_transaction(&self, f: &mut WriteTxnFunction) -> Result<()> { + fn write_transaction( + &self, + f: &mut dyn FnMut(&mut dyn WriteTransaction) -> Result<()>, + ) -> Result<()> { let txn = self.begin_write()?; let mut table = txn.open_table(TABLE)?; f(&mut table)?; @@ -26,7 +27,10 @@ impl Database for redb::Database { txn.commit()?; Ok(()) } - fn read_transaction(&self, f: &mut ReadTxnFunction) -> Result<()> { + fn read_transaction( + &self, + f: &mut dyn FnMut(&dyn ReadTransaction) -> Result<()>, + ) -> Result<()> { let mut txn = self.begin_read()?; f(&mut txn)?; Ok(()) diff --git a/database/src/backends/rocksdb.rs b/database/src/backends/rocksdb.rs index 1475dac..056af9e 100644 --- a/database/src/backends/rocksdb.rs +++ b/database/src/backends/rocksdb.rs @@ -4,7 +4,7 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use crate::backends::{Database, ReadTransaction, WriteTransaction, WriteTxnFunction}; +use crate::backends::{Database, ReadTransaction, WriteTransaction}; use anyhow::Result; use rocksdb::{Direction, ErrorKind, IteratorMode, OptimisticTransactionDB}; use std::path::Path; @@ -14,7 +14,10 @@ pub fn new(path: &Path) -> Result<OptimisticTransactionDB> { } impl Database for OptimisticTransactionDB { - fn write_transaction(&self, f: &mut WriteTxnFunction) -> Result<()> { + fn write_transaction( + &self, + f: &mut dyn FnMut(&mut dyn WriteTransaction) -> Result<()>, + ) -> Result<()> { loop { let mut txn = self.transaction(); f(&mut txn)?; @@ -25,7 +28,10 @@ impl Database for OptimisticTransactionDB { } } } - fn read_transaction(&self, f: &mut super::ReadTxnFunction) -> Result<()> { + fn read_transaction( + &self, + f: &mut dyn FnMut(&dyn ReadTransaction) -> Result<()>, + ) -> Result<()> { loop { let txn = self.transaction(); f(&txn)?; diff --git a/database/src/filter/mod.rs b/database/src/filter/mod.rs index d142c0f..c40e4c0 100644 --- a/database/src/filter/mod.rs +++ b/database/src/filter/mod.rs @@ -14,6 +14,7 @@ impl Filter { pub fn get_bins(&self) -> Vec<Binning> { fn recurse(f: &Filter) -> Vec<Vec<BinningComponent>> { match f { + Filter::True => vec![vec![]], Filter::All(filters) => { let mut o = vec![vec![]]; for filter in filters { diff --git a/database/src/query.rs b/database/src/query.rs index 8513e22..3c3a07c 100644 --- a/database/src/query.rs +++ b/database/src/query.rs @@ -6,12 +6,15 @@ use jellyobject::Path; +#[derive(Default)] pub struct Query { pub filter: Filter, pub sort: Sort, } +#[derive(Default)] pub enum Sort { + #[default] None, Value(ValueSortComponent), TextSearch(Path, String), @@ -34,8 +37,10 @@ pub enum SortOrder { Descending, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub enum Filter { + #[default] + True, All(Vec<Filter>), Any(Vec<Filter>), Match(Path, Vec<u8>), diff --git a/database/src/sort/mod.rs b/database/src/sort/mod.rs index 9c2eb88..b058766 100644 --- a/database/src/sort/mod.rs +++ b/database/src/sort/mod.rs @@ -11,7 +11,7 @@ use jellyobject::Object; pub mod none; pub mod value; -pub trait Index { +pub trait Index: Send + Sync + 'static { fn add(&self, db: &mut dyn WriteTransaction, row: RowNum, val: Object) -> Result<()>; fn remove(&self, db: &mut dyn WriteTransaction, row: RowNum, val: Object) -> Result<()>; /// Might return true if objects are identical for this index; false if not or uncertain diff --git a/database/src/sort/value.rs b/database/src/sort/value.rs index 0381fe0..6eb638c 100644 --- a/database/src/sort/value.rs +++ b/database/src/sort/value.rs @@ -12,7 +12,7 @@ use crate::{ table::{RowNum, TableNum}, }; use anyhow::Result; -use jellycommon::jellyobject::Object; +use jellyobject::Object; pub struct ValueIndex { id: TableNum, diff --git a/database/src/table.rs b/database/src/table.rs index 1680016..27db06e 100644 --- a/database/src/table.rs +++ b/database/src/table.rs @@ -6,9 +6,10 @@ use crate::{ backends::{ReadTransaction, WriteTransaction}, + query::Query, sort::Index, }; -use anyhow::Result; +use anyhow::{Result, anyhow}; use jellyobject::ObjectBuffer; pub type TableNum = u64; @@ -68,4 +69,35 @@ impl Table { db.del(&self.key(row))?; Ok(true) } + pub fn update( + &self, + db: &mut dyn WriteTransaction, + row: RowNum, + entry: ObjectBuffer, + ) -> Result<()> { + let before = self.get(db, row)?.ok_or(anyhow!("row to update missing"))?; + let before = before.as_object(); + let after = entry.as_object(); + + db.set(&self.key(row), bytemuck::cast_slice(entry.0.as_slice()))?; + + for idx in &self.indices { + if !idx.compare(before, after) { + idx.remove(db, row, before)?; + idx.add(db, row, after)?; + } + } + + Ok(()) + } + pub fn query( + &self, + db: &dyn ReadTransaction, + query: Query, + ) -> Box<dyn Iterator<Item = RowNum>> { + todo!() + } + pub fn query_single(&self, db: &dyn ReadTransaction, query: Query) -> Option<RowNum> { + self.query(db, query).next() + } } |