aboutsummaryrefslogtreecommitdiff
path: root/database/src/kv
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/src/kv
parentc05bfcc2775f0e11db6e856bfcf06d0419c35d54 (diff)
downloadjellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.bz2
jellything-7930d543a2aa68d4ad2958605827d7eb1baa91f8.tar.zst
reimplement Object as slice type
Diffstat (limited to 'database/src/kv')
-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
4 files changed, 23 insertions, 32 deletions
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(())
}