aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-01-15 02:57:31 +0100
committermetamuffin <metamuffin@disroot.org>2026-01-15 02:57:31 +0100
commitc836b650eaf4ba33b1cfd2b475971b3ccc9f69b7 (patch)
tree2ea722aff33252ff2e3662faee63cabb223339c3 /database
parent8c0ee6d17fe0dbd7748e7b60ff01a0e8f25faa51 (diff)
downloadjellything-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.rs14
-rw-r--r--database/src/backends/mod.rs10
-rw-r--r--database/src/backends/redb.rs14
-rw-r--r--database/src/backends/rocksdb.rs12
-rw-r--r--database/src/filter/mod.rs1
-rw-r--r--database/src/query.rs7
-rw-r--r--database/src/sort/mod.rs2
-rw-r--r--database/src/sort/value.rs2
-rw-r--r--database/src/table.rs34
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()
+ }
}