diff options
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/helper.rs | 2 | ||||
| -rw-r--r-- | database/src/kv/binning.rs | 4 | ||||
| -rw-r--r-- | database/src/kv/index.rs | 2 | ||||
| -rw-r--r-- | database/src/kv/mod.rs | 43 | ||||
| -rw-r--r-- | database/src/kv/tests.rs | 6 | ||||
| -rw-r--r-- | database/src/lib.rs | 12 | ||||
| -rw-r--r-- | database/src/test_shared.rs | 36 |
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() } |