aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-27 20:56:20 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-27 20:56:20 +0100
commit7930d543a2aa68d4ad2958605827d7eb1baa91f8 (patch)
treefe59d1f549e303a96b78d3e925d75abb70b73af0 /database
parentc05bfcc2775f0e11db6e856bfcf06d0419c35d54 (diff)
downloadjellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.bz2
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.zst
reimplement Object as slice type
Diffstat (limited to 'database')
-rw-r--r--database/src/helper.rs2
-rw-r--r--database/src/kv/binning.rs4
-rw-r--r--database/src/kv/index.rs2
-rw-r--r--database/src/kv/mod.rs43
-rw-r--r--database/src/kv/tests.rs6
-rw-r--r--database/src/lib.rs12
-rw-r--r--database/src/test_shared.rs36
7 files changed, 52 insertions, 53 deletions
diff --git a/database/src/helper.rs b/database/src/helper.rs
index 28ab1fa..d1fc29a 100644
--- a/database/src/helper.rs
+++ b/database/src/helper.rs
@@ -20,4 +20,4 @@ pub trait DatabaseReturnExt: Database {
Ok(ret.unwrap())
}
}
-impl<D: Database> DatabaseReturnExt for D {}
+impl<D: Database + ?Sized> DatabaseReturnExt for D {}
diff --git a/database/src/kv/binning.rs b/database/src/kv/binning.rs
index 253bb5c..d9b173d 100644
--- a/database/src/kv/binning.rs
+++ b/database/src/kv/binning.rs
@@ -22,14 +22,14 @@ impl Binning {
comps.sort();
Self(comps)
}
- pub fn apply(&self, ob: Object<'_>, keys: &mut Vec<Vec<u8>>) {
+ pub fn apply(&self, ob: &Object, keys: &mut Vec<Vec<u8>>) {
for f in &self.0 {
f.apply(ob, keys);
}
}
}
impl BinningComponent {
- pub fn apply(&self, ob: Object<'_>, keys: &mut Vec<Vec<u8>>) {
+ pub fn apply(&self, ob: &Object, keys: &mut Vec<Vec<u8>>) {
match self {
BinningComponent::Has(path) => {
if path.get_matching_value(ob).is_none() {
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
index ee14d77..ba5784b 100644
--- a/database/src/kv/index.rs
+++ b/database/src/kv/index.rs
@@ -22,7 +22,7 @@ pub fn update_index(
is: SubtreeNum,
ik: &IndexKey,
row: RowNum,
- ob: Object<'_>,
+ ob: &Object,
remove: bool,
) -> Result<()> {
let mut ks = vec![is.to_be_bytes().to_vec()];
diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs
index 837aa51..784cbef 100644
--- a/database/src/kv/mod.rs
+++ b/database/src/kv/mod.rs
@@ -24,7 +24,7 @@ use crate::{
},
};
use anyhow::{Result, anyhow};
-use jellyobject::ObjectBuffer;
+use jellyobject::{Object, vec_to_ob, vec_u8_to_u32};
use log::{debug, info};
use std::{borrow::Cow, fmt::Write};
@@ -44,22 +44,17 @@ impl<T: jellykv::Store> Database for T {
}
impl Transaction for &mut dyn jellykv::Transaction {
- fn insert(&mut self, entry: ObjectBuffer) -> Result<RowNum> {
+ fn insert(&mut self, entry: Box<Object>) -> Result<RowNum> {
debug!("insert {entry:?}");
let mut id_counter = read_counter(*self, &T_ROW_COUNTER.to_be_bytes(), 0)?;
let row = id_counter;
id_counter += 1;
write_counter(*self, &T_ROW_COUNTER.to_be_bytes(), id_counter)?;
- jellykv::Transaction::set(
- *self,
- &row_key(row),
- bytemuck::cast_slice(entry.0.as_slice()),
- )?;
+ jellykv::Transaction::set(*self, &row_key(row), bytemuck::cast_slice(entry.export()))?;
- let ob = entry.as_object();
for (is, ik) in list_indices(*self)? {
- update_index(*self, is, &ik, row, ob, false)?;
+ update_index(*self, is, &ik, row, &entry, false)?;
}
Ok(row)
@@ -67,34 +62,28 @@ impl Transaction for &mut dyn jellykv::Transaction {
fn remove(&mut self, row: RowNum) -> Result<()> {
debug!("remove {row}");
let entry = self.get(row)?.ok_or(anyhow!("row did not exist"))?;
- let ob = entry.as_object();
for (is, ik) in list_indices(*self)? {
- update_index(*self, is, &ik, row, ob, true)?;
+ update_index(*self, is, &ik, row, &entry, true)?;
}
jellykv::Transaction::del(*self, &row_key(row))
}
- fn update(&mut self, row: RowNum, entry: ObjectBuffer) -> Result<()> {
+ fn update(&mut self, row: RowNum, entry: Box<Object>) -> Result<()> {
debug!("update {row}");
let before = self.get(row)?.ok_or(anyhow!("row to update missing"))?;
- let before = before.as_object();
- let after = entry.as_object();
-
- jellykv::Transaction::set(
- *self,
- &row_key(row),
- bytemuck::cast_slice(entry.0.as_slice()),
- )?;
+ jellykv::Transaction::set(*self, &row_key(row), bytemuck::cast_slice(entry.export()))?;
for (is, ik) in list_indices(*self)? {
- update_index(*self, is, &ik, row, before, true)?;
- update_index(*self, is, &ik, row, after, false)?;
+ update_index(*self, is, &ik, row, &before, true)?;
+ update_index(*self, is, &ik, row, &entry, false)?;
}
Ok(())
}
- fn get(&self, row: RowNum) -> Result<Option<ObjectBuffer>> {
- Ok(jellykv::Transaction::get(*self, &row_key(row))?.map(ObjectBuffer::from))
+ fn get(&self, row: RowNum) -> Result<Option<Box<Object>>> {
+ Ok(jellykv::Transaction::get(*self, &row_key(row))?
+ .map(vec_u8_to_u32)
+ .map(vec_to_ob))
}
fn query<'a>(
@@ -181,8 +170,10 @@ fn create_index(txn: &mut dyn jellykv::Transaction, is: SubtreeNum, ik: &IndexKe
for rowkey in rowkeys {
let row = inv_row_key(&rowkey);
- let buf = ObjectBuffer::from(jellykv::Transaction::get(txn, &rowkey)?.unwrap());
- update_index(txn, is, ik, row, buf.as_object(), false)?;
+ let buf = vec_to_ob(vec_u8_to_u32(
+ jellykv::Transaction::get(txn, &rowkey)?.unwrap(),
+ ));
+ update_index(txn, is, ik, row, &buf, false)?;
}
Ok(())
diff --git a/database/src/kv/tests.rs b/database/src/kv/tests.rs
index e3e6b3b..5e65b4b 100644
--- a/database/src/kv/tests.rs
+++ b/database/src/kv/tests.rs
@@ -21,7 +21,7 @@ pub fn insert_get() -> Result<()> {
Ok(())
})?;
- assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Bob");
+ assert_eq!(bob.unwrap().get(NAME).unwrap(), "Bob");
Ok(())
}
@@ -37,7 +37,7 @@ pub fn update() -> Result<()> {
Ok(())
})?;
db.transaction(&mut |txn| {
- let better_bob = new_bob().as_object().insert(NAME, "Better Bob");
+ let better_bob = new_bob().insert(NAME, "Better Bob");
txn.update(bob_row, better_bob)?;
Ok(())
})?;
@@ -46,7 +46,7 @@ pub fn update() -> Result<()> {
Ok(())
})?;
- assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Better Bob");
+ assert_eq!(bob.unwrap().get(NAME).unwrap(), "Better Bob");
Ok(())
}
diff --git a/database/src/lib.rs b/database/src/lib.rs
index b8a67c9..263c2fc 100644
--- a/database/src/lib.rs
+++ b/database/src/lib.rs
@@ -3,15 +3,15 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-#![feature(if_let_guard)]
+#![feature(phantom_variance_markers)]
+pub mod helper;
pub mod kv;
pub mod query_syntax;
#[cfg(test)]
pub mod test_shared;
-pub mod helper;
use anyhow::Result;
-use jellyobject::{ObjectBuffer, Path, Value};
+use jellyobject::{Object, Path, Value};
pub type RowNum = u64;
pub type RowIter = Box<dyn Iterator<Item = Result<(RowNum, Vec<u8>)>>>;
@@ -21,10 +21,10 @@ pub trait Database: Send + Sync {
}
pub trait Transaction {
- fn insert(&mut self, entry: ObjectBuffer) -> Result<RowNum>;
+ fn insert(&mut self, entry: Box<Object>) -> Result<RowNum>;
fn remove(&mut self, row: RowNum) -> Result<()>;
- fn update(&mut self, row: RowNum, entry: ObjectBuffer) -> Result<()>;
- fn get(&self, row: RowNum) -> Result<Option<ObjectBuffer>>;
+ fn update(&mut self, row: RowNum, entry: Box<Object>) -> Result<()>;
+ fn get(&self, row: RowNum) -> Result<Option<Box<Object>>>;
fn query<'a>(
&'a mut self,
query: Query,
diff --git a/database/src/test_shared.rs b/database/src/test_shared.rs
index 81d2e60..4d06a1f 100644
--- a/database/src/test_shared.rs
+++ b/database/src/test_shared.rs
@@ -4,25 +4,33 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use jellyobject::{ObjectBuffer, fields};
+use jellyobject::{OBB, Object, fields};
fields! {
- NAME: &str = b"name";
+ NAME: str = b"name";
AGE: u32 = b"age1";
- FRIEND: &str = b"frnd";
+ FRIEND: str = b"frnd";
}
-pub(crate) fn new_bob() -> ObjectBuffer {
- ObjectBuffer::new(&mut [
- (NAME.0, &"Bob"),
- (AGE.0, &35_u32),
- (FRIEND.0, &"Alice"),
- (FRIEND.0, &"Charlie"),
- ])
+pub(crate) fn new_bob() -> Box<Object> {
+ OBB::new()
+ .with(NAME, "Bob")
+ .with(AGE, 35)
+ .with(FRIEND, "Alice")
+ .with(FRIEND, "Charlie")
+ .finish()
}
-pub(crate) fn new_alice() -> ObjectBuffer {
- ObjectBuffer::new(&mut [(NAME.0, &"Alice"), (AGE.0, &31_u32), (FRIEND.0, &"Bob")])
+pub(crate) fn new_alice() -> Box<Object> {
+ OBB::new()
+ .with(NAME, "Alice")
+ .with(AGE, 31)
+ .with(FRIEND, "Bob")
+ .finish()
}
-pub(crate) fn new_charlie() -> ObjectBuffer {
- ObjectBuffer::new(&mut [(NAME.0, &"Charlie"), (AGE.0, &31_u32), (FRIEND.0, &"Bob")])
+pub(crate) fn new_charlie() -> Box<Object> {
+ OBB::new()
+ .with(NAME, "Charlie")
+ .with(AGE, 31)
+ .with(FRIEND, "Bob")
+ .finish()
}