diff options
| -rw-r--r-- | database/src/kv/mod.rs | 114 | ||||
| -rw-r--r-- | database/src/kv/tests.rs | 142 | ||||
| -rw-r--r-- | server/src/main.rs | 4 |
3 files changed, 148 insertions, 112 deletions
diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs index 903fc46..87af3fa 100644 --- a/database/src/kv/mod.rs +++ b/database/src/kv/mod.rs @@ -11,6 +11,8 @@ pub mod index_key; pub mod merge_iterator; pub mod prefix_iterator; pub mod sort; +#[cfg(test)] +pub mod tests; use std::borrow::Cow; @@ -181,7 +183,8 @@ fn list_indices(txn: &dyn jellykv::Transaction) -> Result<Vec<(SubtreeNum, Index for i in indices { let i = i?; let ik = IndexKey::from_bytes(&i); - let is = read_counter(txn, &i, 0)? as SubtreeNum; + let is_raw = jellykv::Transaction::get(txn, &i)?.unwrap(); + let is = SubtreeNum::from_be_bytes(is_raw.try_into().unwrap()); out.push((is, ik)); } Ok(out) @@ -196,112 +199,3 @@ fn row_key(row: RowNum) -> Vec<u8> { fn inv_row_key(k: &[u8]) -> RowNum { RowNum::from_be_bytes(k[4..12].try_into().unwrap()) } - -#[cfg(test)] -mod test { - use crate::{ - Database, Filter, Query, Sort, - test_shared::{AGE, NAME, new_alice, new_bob, new_charlie}, - }; - use anyhow::Result; - use jellyobject::Path; - - #[test] - pub fn insert_get() -> Result<()> { - let db = jellykv::memory::new(); - - let mut bob_row = 0; - db.transaction(&mut |txn| { - bob_row = txn.insert(new_bob())?; - Ok(()) - })?; - - let mut bob = None; - db.transaction(&mut |txn| { - bob = txn.get(bob_row)?; - Ok(()) - })?; - - assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Bob"); - Ok(()) - } - - #[test] - pub fn update() -> Result<()> { - let db = jellykv::memory::new(); - - let mut bob_row = 0; - let mut bob = None; - - db.transaction(&mut |txn| { - bob_row = txn.insert(new_bob())?; - Ok(()) - })?; - db.transaction(&mut |txn| { - let better_bob = new_bob().as_object().insert(NAME, "Better Bob"); - txn.update(bob_row, better_bob)?; - Ok(()) - })?; - db.transaction(&mut |txn| { - bob = txn.get(bob_row)?; - Ok(()) - })?; - - assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Better Bob"); - Ok(()) - } - - #[test] - pub fn query_match_int() -> Result<()> { - let db = jellykv::memory::new(); - - let mut rows = [0, 0, 0]; - let mut result = None; - - db.transaction(&mut |txn| { - rows = [ - txn.insert(new_bob())?, - txn.insert(new_alice())?, - txn.insert(new_charlie())?, - ]; - Ok(()) - })?; - db.transaction(&mut |txn| { - result = txn.query_single(Query { - filter: Filter::Match(Path(vec![AGE.0]), 35_u32.to_be_bytes().to_vec()), - sort: Sort::None, - })?; - Ok(()) - })?; - - assert_eq!(result, Some(rows[0])); - Ok(()) - } - - #[test] - pub fn query_match_str() -> Result<()> { - let db = jellykv::memory::new(); - - let mut rows = [0, 0, 0]; - let mut result = None; - - db.transaction(&mut |txn| { - rows = [ - txn.insert(new_bob())?, - txn.insert(new_alice())?, - txn.insert(new_charlie())?, - ]; - Ok(()) - })?; - db.transaction(&mut |txn| { - result = txn.query_single(Query { - filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()), - sort: Sort::None, - })?; - Ok(()) - })?; - - assert_eq!(result, Some(rows[1])); - Ok(()) - } -} diff --git a/database/src/kv/tests.rs b/database/src/kv/tests.rs new file mode 100644 index 0000000..5b587ed --- /dev/null +++ b/database/src/kv/tests.rs @@ -0,0 +1,142 @@ +use crate::{ + Database, Filter, Query, Sort, + test_shared::{AGE, NAME, new_alice, new_bob, new_charlie}, +}; +use anyhow::Result; +use jellyobject::Path; + +#[test] +pub fn insert_get() -> Result<()> { + let db = jellykv::memory::new(); + + let mut bob_row = 0; + db.transaction(&mut |txn| { + bob_row = txn.insert(new_bob())?; + Ok(()) + })?; + + let mut bob = None; + db.transaction(&mut |txn| { + bob = txn.get(bob_row)?; + Ok(()) + })?; + + assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Bob"); + Ok(()) +} + +#[test] +pub fn update() -> Result<()> { + let db = jellykv::memory::new(); + + let mut bob_row = 0; + let mut bob = None; + + db.transaction(&mut |txn| { + bob_row = txn.insert(new_bob())?; + Ok(()) + })?; + db.transaction(&mut |txn| { + let better_bob = new_bob().as_object().insert(NAME, "Better Bob"); + txn.update(bob_row, better_bob)?; + Ok(()) + })?; + db.transaction(&mut |txn| { + bob = txn.get(bob_row)?; + Ok(()) + })?; + + assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Better Bob"); + Ok(()) +} + +#[test] +pub fn query_match_int() -> Result<()> { + let db = jellykv::memory::new(); + + let mut rows = [0, 0, 0]; + let mut result = None; + + db.transaction(&mut |txn| { + rows = [ + txn.insert(new_bob())?, + txn.insert(new_alice())?, + txn.insert(new_charlie())?, + ]; + Ok(()) + })?; + db.transaction(&mut |txn| { + result = txn.query_single(Query { + filter: Filter::Match(Path(vec![AGE.0]), 35_u32.to_be_bytes().to_vec()), + sort: Sort::None, + })?; + Ok(()) + })?; + + assert_eq!(result, Some(rows[0])); + Ok(()) +} + +#[test] +pub fn query_match_str() -> Result<()> { + let db = jellykv::memory::new(); + + let mut rows = [0, 0, 0]; + let mut result = None; + + db.transaction(&mut |txn| { + rows = [ + txn.insert(new_bob())?, + txn.insert(new_alice())?, + txn.insert(new_charlie())?, + ]; + Ok(()) + })?; + db.transaction(&mut |txn| { + result = txn.query_single(Query { + filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()), + sort: Sort::None, + })?; + Ok(()) + })?; + + assert_eq!(result, Some(rows[1])); + Ok(()) +} + +#[test] +pub fn query_match_str_after() -> Result<()> { + let db = jellykv::memory::new(); + + let mut rows = [0, 0, 0]; + let mut result = None; + + db.transaction(&mut |txn| { + result = txn.query_single(Query { + filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()), + sort: Sort::None, + })?; + Ok(()) + })?; + assert_eq!(result, None); + + db.transaction(&mut |txn| { + rows = [ + txn.insert(new_bob())?, + txn.insert(new_alice())?, + txn.insert(new_charlie())?, + ]; + Ok(()) + })?; + + db.transaction(&mut |txn| { + result = txn.query_single(Query { + filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()), + sort: Sort::None, + })?; + Ok(()) + })?; + assert_eq!(result, Some(rows[1])); + + Ok(()) +} diff --git a/server/src/main.rs b/server/src/main.rs index c481eec..8032cdf 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -82,8 +82,8 @@ pub fn create_state() -> Result<Arc<State>> { let config: Config = serde_yaml_ng::from_str(&read_to_string(config_path)?)?; let cache_storage = jellykv::rocksdb::new(&config.cache_path)?; - // let db_storage = jellykv::rocksdb::new(&config.database_path)?; - let db_storage = jellykv::memory::new(); + let db_storage = jellykv::rocksdb::new(&config.database_path)?; + // let db_storage = jellykv::memory::new(); let state = Arc::new(State { cache: Cache::new(Box::new(cache_storage), config.max_memory_cache_size), |