aboutsummaryrefslogtreecommitdiff
path: root/database/src
diff options
context:
space:
mode:
Diffstat (limited to 'database/src')
-rw-r--r--database/src/backends/mod.rs6
-rw-r--r--database/src/lib.rs2
-rw-r--r--database/src/table.rs2
-rw-r--r--database/src/tests.rs57
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(())
+}