diff options
Diffstat (limited to 'database/src')
| -rw-r--r-- | database/src/backends/mod.rs | 6 | ||||
| -rw-r--r-- | database/src/lib.rs | 2 | ||||
| -rw-r--r-- | database/src/table.rs | 2 | ||||
| -rw-r--r-- | database/src/tests.rs | 57 |
4 files changed, 65 insertions, 2 deletions
diff --git a/database/src/backends/mod.rs b/database/src/backends/mod.rs index ba30b46..1a3998f 100644 --- a/database/src/backends/mod.rs +++ b/database/src/backends/mod.rs @@ -11,6 +11,10 @@ mod rocksdb; use anyhow::{Result, bail}; use std::{path::Path, sync::Arc}; +pub use memory::new as new_memory; +pub use redb::new as new_redb; +pub use rocksdb::new as new_rocksdb; + pub type WriteTxnFunction = dyn FnMut(&mut dyn WriteTransaction) -> Result<()>; pub type ReadTxnFunction = dyn FnMut(&dyn ReadTransaction) -> Result<()>; @@ -35,7 +39,7 @@ pub trait ReadTransaction { ) -> Result<Box<dyn Iterator<Item = Result<Vec<u8>>> + 'a>>; } -pub fn create_backend(driver: &str, path: &Path) -> Result<Arc<dyn Database>> { +pub fn create_database(driver: &str, path: &Path) -> Result<Arc<dyn Database>> { Ok(match driver { "rocksdb" => Arc::new(rocksdb::new(path)?), "redb" => Arc::new(redb::new(path)?), diff --git a/database/src/lib.rs b/database/src/lib.rs index 9c372b4..67cbca4 100644 --- a/database/src/lib.rs +++ b/database/src/lib.rs @@ -9,5 +9,7 @@ pub mod prefix_iterator; pub mod table; pub mod query; pub mod filter; +#[cfg(test)] +pub mod tests; pub type Pad32 = u32; diff --git a/database/src/table.rs b/database/src/table.rs index 2a45ddb..ace0fb8 100644 --- a/database/src/table.rs +++ b/database/src/table.rs @@ -49,7 +49,7 @@ impl Table { idx.add(txn, row, ob)?; } - Ok(id_counter) + Ok(row) } pub fn add_index<T: Index + Clone + 'static>(&mut self, index: T) -> T { self.indices.push(Box::new(index.clone())); diff --git a/database/src/tests.rs b/database/src/tests.rs new file mode 100644 index 0000000..dd4d1ae --- /dev/null +++ b/database/src/tests.rs @@ -0,0 +1,57 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2026 metamuffin <metamuffin.org> +*/ + +use std::sync::LazyLock; + +use crate::{ + backends::{Database, new_memory}, + table::Table, +}; +use anyhow::Result; +use jellyobject::{ObjectBuffer, Registry, fields}; + +pub static TAGREG: LazyLock<Registry> = LazyLock::new(|| { + let mut reg = Registry::default(); + register_fields(&mut reg); + reg +}); +fields! { + NAME: &str = 15 "name"; + AGE: u32 = 13 "age"; + FRIEND: &str = 54321 "friend"; +} + +fn test_object() -> ObjectBuffer { + ObjectBuffer::new(&mut [ + (NAME.0, &"Bob"), + (AGE.0, &35_u32), + (FRIEND.0, &"Alice"), + (FRIEND.0, &"Charlie"), + ]) +} + +#[test] +fn table_insert_get() -> Result<()> { + let db = new_memory(); + let table = Table::new(5); + + let mut bob_row = 0; + db.write_transaction(&mut |txn| { + bob_row = table.insert(txn, test_object())?; + Ok(()) + })?; + + let mut bob = None; + db.read_transaction(&mut |txn| { + bob = table.get(txn, bob_row)?; + Ok(()) + })?; + + assert!(bob.is_some()); + assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Bob"); + + Ok(()) +} |