diff --git a/Cargo.toml b/Cargo.toml index 5845ef01..842dd801 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ chrono = { version = "0.4", features = ["serde"] } rand = "0.8" once_cell = "1.19" dinghy-test = "0.7.1" +itertools = "0.12" [features] default = [ "upgrade_0_5_x" ] diff --git a/benches/overhead_data_size.rs b/benches/overhead_data_size.rs index 4ce628e0..002cbb21 100644 --- a/benches/overhead_data_size.rs +++ b/benches/overhead_data_size.rs @@ -5,6 +5,7 @@ use once_cell::sync::Lazy; use rand::prelude::SliceRandom; use redb::{ReadableTable, TableDefinition}; use serde::{Deserialize, Serialize}; +use itertools::Itertools; // 1 byte * 10000, 10 bytes * 10000, 100 bytes * 5000, 1KB * 1000, 1MB * 100, 10MB * 10 const ITERATIONS: &'static [(usize, usize)] = &[ @@ -133,7 +134,7 @@ fn use_native_db_insert(db: &Database, data: Data) { fn use_native_db_scan(db: &Database) -> Vec { let r = db.r_transaction().unwrap(); - let out = r.scan().primary().unwrap().all().collect::>(); + let out= r.scan().primary().unwrap().all().try_collect().unwrap(); out } diff --git a/native_db_macro/src/native_db.rs b/native_db_macro/src/native_db.rs index 01c05a9c..2beebeeb 100644 --- a/native_db_macro/src/native_db.rs +++ b/native_db_macro/src/native_db.rs @@ -43,12 +43,12 @@ pub fn native_db(args: TokenStream, input: TokenStream) -> TokenStream { #ast impl native_db::db_type::Input for #struct_name { - fn native_db_bincode_encode_to_vec(&self) -> Vec { - native_db::bincode_encode_to_vec(self).expect(format!("Failed to serialize the struct {}", stringify!(#struct_name)).as_str()) + fn native_db_bincode_encode_to_vec(&self) -> native_db::db_type::Result> { + native_db::bincode_encode_to_vec(self) } - fn native_db_bincode_decode_from_slice(slice: &[u8]) -> Self { - native_db::bincode_decode_from_slice(slice).expect(format!("Failed to deserialize the struct {}", stringify!(#struct_name)).as_str()).0 + fn native_db_bincode_decode_from_slice(slice: &[u8]) -> native_db::db_type::Result { + Ok(native_db::bincode_decode_from_slice(slice)?.0) } #native_db_model diff --git a/src/db_type/error.rs b/src/db_type/error.rs index 528aa35e..cde6962a 100644 --- a/src/db_type/error.rs +++ b/src/db_type/error.rs @@ -71,4 +71,7 @@ pub enum Error { #[error("You can not migrate the table {0} because it is a legacy model")] MigrateLegacyModel(String), + + #[error("Model error")] + ModelError(#[from] native_model::Error), } diff --git a/src/db_type/input.rs b/src/db_type/input.rs index 9e484c1e..b5bd646a 100644 --- a/src/db_type/input.rs +++ b/src/db_type/input.rs @@ -54,14 +54,14 @@ pub trait Input: Sized + native_model::Model { DatabaseKeyDefinition, DatabaseKeyValue, >; - fn native_db_bincode_encode_to_vec(&self) -> Vec; - fn native_db_bincode_decode_from_slice(slice: &[u8]) -> Self; + fn native_db_bincode_encode_to_vec(&self) -> Result>; + fn native_db_bincode_decode_from_slice(slice: &[u8]) -> Result; - fn to_item(&self) -> DatabaseInput { - DatabaseInput { + fn to_item(&self) -> Result { + Ok(DatabaseInput { primary_key: self.native_db_primary_key(), secondary_keys: self.native_db_secondary_keys(), - value: self.native_db_bincode_encode_to_vec(), - } + value: self.native_db_bincode_encode_to_vec()?, + }) } } diff --git a/src/db_type/output.rs b/src/db_type/output.rs index 4b6aa27c..269b0fa6 100644 --- a/src/db_type/output.rs +++ b/src/db_type/output.rs @@ -1,4 +1,4 @@ -use crate::db_type::Input; +use crate::db_type::{Input,Result}; #[derive(Clone, Debug)] pub struct DatabaseOutputValue(pub(crate) Vec); @@ -10,12 +10,12 @@ impl From<&[u8]> for DatabaseOutputValue { } impl DatabaseOutputValue { - pub fn inner(&self) -> T { + pub fn inner(&self) -> Result { T::native_db_bincode_decode_from_slice(&self.0) } } -pub(crate) fn unwrap_item(item: Option>) -> Option { +pub(crate) fn unwrap_item(item: Option>) -> Option> { if let Some(item) = item { let item = item.value(); let item = T::native_db_bincode_decode_from_slice(item); diff --git a/src/serialization.rs b/src/serialization.rs index 8c2b12f6..7ea21542 100644 --- a/src/serialization.rs +++ b/src/serialization.rs @@ -1,14 +1,14 @@ -pub fn bincode_encode_to_vec(value: &T) -> Option> +pub fn bincode_encode_to_vec(value: &T) -> crate::db_type::Result> where T: serde::Serialize + native_model::Model, { - native_model::encode(value).ok() + native_model::encode(value).map_err(|e| e.into()) } -pub fn bincode_decode_from_slice(slice: &[u8]) -> Option<(T, usize)> +pub fn bincode_decode_from_slice(slice: &[u8]) -> crate::db_type::Result<(T, usize)> where T: serde::de::DeserializeOwned + native_model::Model, { - let (data, _) = native_model::decode(slice.to_vec()).ok()?; - Some((data, 0)) + let (data, _) = native_model::decode(slice.to_vec())?; + Ok((data, 0)) } diff --git a/src/transaction/internal/rw_transaction.rs b/src/transaction/internal/rw_transaction.rs index ad5a19db..d135c38b 100644 --- a/src/transaction/internal/rw_transaction.rs +++ b/src/transaction/internal/rw_transaction.rs @@ -284,7 +284,7 @@ impl<'db> InternalRwTransaction<'db> { // List all data from the old table for old_data in self.concrete_primary_drain(old_table_definition.model.clone())? { let (decoded_item, _) = native_model::decode::(old_data.0).unwrap(); - let decoded_item = decoded_item.to_item(); + let decoded_item = decoded_item.to_item()?; self.concrete_insert(T::native_db_model(), decoded_item)?; } diff --git a/src/transaction/query/drain.rs b/src/transaction/query/drain.rs index ef3b8f6e..eba7a7ae 100644 --- a/src/transaction/query/drain.rs +++ b/src/transaction/query/drain.rs @@ -6,10 +6,12 @@ pub struct RwDrain<'db, 'txn> { } impl<'db, 'txn> RwDrain<'db, 'txn> { + // TODO: Remove nested Result pub fn primary(&self) -> Result> { let model = T::native_db_model(); let out = self.internal.concrete_primary_drain(model)?; - Ok(out.into_iter().map(|b| b.inner()).collect()) + let out = out.into_iter().map(|b| b.inner()).collect::>>()?; + Ok(out) } /// **TODO: needs to be implemented** diff --git a/src/transaction/query/get.rs b/src/transaction/query/get.rs index 248347c6..be9abba3 100644 --- a/src/transaction/query/get.rs +++ b/src/transaction/query/get.rs @@ -41,7 +41,11 @@ impl RGet<'_, '_> { pub fn primary(&self, key: impl InnerKeyValue) -> Result> { let model = T::native_db_model(); let result = self.internal.get_by_primary_key(model, key)?; - Ok(result.map(|value| value.inner())) + if let Some(value) = result { + Ok(Some(value.inner()?)) + } else { + Ok(None) + } } /// Get a value from the database by secondary key. @@ -87,7 +91,11 @@ impl RGet<'_, '_> { ) -> Result> { let model = T::native_db_model(); let result = self.internal.get_by_secondary_key(model, key_def, key)?; - Ok(result.map(|value| value.inner())) + if let Some(value) = result { + Ok(Some(value.inner()?)) + } else { + Ok(None) + } } } @@ -102,7 +110,11 @@ impl RwGet<'_, '_> { pub fn primary(&self, key: impl InnerKeyValue) -> Result> { let model = T::native_db_model(); let result = self.internal.get_by_primary_key(model, key)?; - Ok(result.map(|value| value.inner())) + if let Some(value) = result { + Ok(Some(value.inner()?)) + } else { + Ok(None) + } } /// Get a value from the database by secondary key. @@ -115,6 +127,10 @@ impl RwGet<'_, '_> { ) -> Result> { let model = T::native_db_model(); let result = self.internal.get_by_secondary_key(model, key_def, key)?; - Ok(result.map(|value| value.inner())) + if let Some(value) = result { + Ok(Some(value.inner()?)) + } else { + Ok(None) + } } } diff --git a/src/transaction/query/scan/primary_scan.rs b/src/transaction/query/scan/primary_scan.rs index 91a7054f..c1530ce4 100644 --- a/src/transaction/query/scan/primary_scan.rs +++ b/src/transaction/query/scan/primary_scan.rs @@ -1,4 +1,4 @@ -use crate::db_type::{unwrap_item, DatabaseInnerKeyValue, DatabaseInnerKeyValueRange, Input}; +use crate::db_type::{unwrap_item, DatabaseInnerKeyValue, DatabaseInnerKeyValueRange, Input, Result}; use crate::InnerKeyValue; use std::marker::PhantomData; use std::ops::RangeBounds; @@ -30,6 +30,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -48,7 +49,7 @@ where /// let r = db.r_transaction()?; /// /// // Get all values - /// let _values: Vec = r.scan().primary()?.all().collect(); + /// let _values: Vec = r.scan().primary()?.all().try_collect()?; /// Ok(()) /// } /// ``` @@ -70,6 +71,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -88,7 +90,7 @@ where /// let r = db.r_transaction()?; /// /// // Get the values from 5 to the end - /// let _values: Vec = r.scan().primary()?.range(5u64..).collect(); + /// let _values: Vec = r.scan().primary()?.range(5u64..).try_collect()?; /// Ok(()) /// } /// ``` @@ -111,6 +113,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -129,7 +132,7 @@ where /// let r = db.r_transaction()?; /// /// // Get the values starting with "victor" - /// let _values: Vec = r.scan().primary()?.start_with("victor").collect(); + /// let _values: Vec = r.scan().primary()?.start_with("victor").try_collect()?; /// Ok(()) /// } /// ``` @@ -156,7 +159,7 @@ pub struct PrimaryScanIterator<'a, T: Input> { } impl<'a, T: Input> Iterator for PrimaryScanIterator<'a, T> { - type Item = T; + type Item = Result; fn next(&mut self) -> Option { match self.range.next() { @@ -181,7 +184,7 @@ pub struct PrimaryScanIteratorStartWith<'a, T: Input> { } impl<'a, T: Input> Iterator for PrimaryScanIteratorStartWith<'a, T> { - type Item = T; + type Item = Result; fn next(&mut self) -> Option { match self.range.next() { diff --git a/src/transaction/query/scan/secondary_scan.rs b/src/transaction/query/scan/secondary_scan.rs index c0525638..740ee68b 100644 --- a/src/transaction/query/scan/secondary_scan.rs +++ b/src/transaction/query/scan/secondary_scan.rs @@ -1,4 +1,4 @@ -use crate::db_type::{unwrap_item, DatabaseInnerKeyValue, DatabaseInnerKeyValueRange, Input}; +use crate::db_type::{unwrap_item, DatabaseInnerKeyValue, DatabaseInnerKeyValueRange, Input, Result}; use crate::InnerKeyValue; use redb; use std::marker::PhantomData; @@ -40,6 +40,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -60,7 +61,7 @@ where /// let r = db.r_transaction()?; /// /// // Get only values that have the secondary key set (name is not None) - /// let _values: Vec = r.scan().secondary(DataKey::name)?.all().collect(); + /// let _values: Vec = r.scan().secondary(DataKey::name)?.all().try_collect()?; /// Ok(()) /// } /// ``` @@ -85,6 +86,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -105,7 +107,7 @@ where /// let r = db.r_transaction()?; /// /// // Get only values that have the secondary key name from C to the end - /// let _values: Vec = r.scan().secondary(DataKey::name)?.range("C"..).collect(); + /// let _values: Vec = r.scan().secondary(DataKey::name)?.range("C"..).try_collect()?; /// Ok(()) /// } /// ``` @@ -134,6 +136,7 @@ where /// use native_db::*; /// use native_model::{native_model, Model}; /// use serde::{Deserialize, Serialize}; + /// use itertools::Itertools; /// /// #[derive(Serialize, Deserialize)] /// #[native_model(id=1, version=1)] @@ -154,7 +157,7 @@ where /// let r = db.r_transaction()?; /// /// // Get only values that have the secondary key name starting with "hello" - /// let _values: Vec = r.scan().secondary(DataKey::name)?.start_with("hello").collect(); + /// let _values: Vec = r.scan().secondary(DataKey::name)?.start_with("hello").try_collect()?; /// Ok(()) /// } /// ``` @@ -189,7 +192,7 @@ impl<'a, PrimaryTable, T: Input> Iterator for SecondaryScanIterator<'a, PrimaryT where PrimaryTable: redb::ReadableTable, { - type Item = T; + type Item = Result; fn next(&mut self) -> Option { match self.range.next() { @@ -233,7 +236,7 @@ where PrimaryTable: redb::ReadableTable, T: Input, { - type Item = T; + type Item = Result; fn next(&mut self) -> Option { match self.range.next() { diff --git a/src/transaction/rw_transaction.rs b/src/transaction/rw_transaction.rs index 59fd5163..3a231757 100644 --- a/src/transaction/rw_transaction.rs +++ b/src/transaction/rw_transaction.rs @@ -126,7 +126,7 @@ impl<'db, 'txn> RwTransaction<'db> { pub fn insert(&self, item: T) -> Result<()> { let (watcher_request, binary_value) = self .internal - .concrete_insert(T::native_db_model(), item.to_item())?; + .concrete_insert(T::native_db_model(), item.to_item()?)?; let event = Event::new_insert(binary_value); self.batch.borrow_mut().add(watcher_request, event); Ok(()) @@ -168,10 +168,10 @@ impl<'db, 'txn> RwTransaction<'db> { pub fn remove(&self, item: T) -> Result { let (watcher_request, binary_value) = self .internal - .concrete_remove(T::native_db_model(), item.to_item())?; + .concrete_remove(T::native_db_model(), item.to_item()?)?; let event = Event::new_delete(binary_value.clone()); self.batch.borrow_mut().add(watcher_request, event); - Ok(binary_value.inner()) + binary_value.inner() } /// Update a value in the database. @@ -212,8 +212,8 @@ impl<'db, 'txn> RwTransaction<'db> { pub fn update(&self, old_item: T, updated_item: T) -> Result<()> { let (watcher_request, old_binary_value, new_binary_value) = self.internal.concrete_update( T::native_db_model(), - old_item.to_item(), - updated_item.to_item(), + old_item.to_item()?, + updated_item.to_item()?, )?; let event = Event::new_update(old_binary_value, new_binary_value); self.batch.borrow_mut().add(watcher_request, event); @@ -280,13 +280,14 @@ impl<'db, 'txn> RwTransaction<'db> { OldType: Input + Clone, NewType: Input + From, { - let find_all_old: Vec = self.scan().primary()?.all().collect(); + let find_all_old: Result> = self.scan().primary()?.all().collect(); + let find_all_old = find_all_old?; for old in find_all_old { let new: NewType = old.clone().into(); self.internal - .concrete_insert(NewType::native_db_model(), new.to_item())?; + .concrete_insert(NewType::native_db_model(), new.to_item()?)?; self.internal - .concrete_remove(OldType::native_db_model(), old.to_item())?; + .concrete_remove(OldType::native_db_model(), old.to_item()?)?; } Ok(()) } diff --git a/src/watch/event.rs b/src/watch/event.rs index abe04534..d6034147 100644 --- a/src/watch/event.rs +++ b/src/watch/event.rs @@ -1,4 +1,4 @@ -use crate::db_type::{DatabaseOutputValue, Input}; +use crate::db_type::{DatabaseOutputValue, Input, Result}; use std::fmt::Debug; #[derive(Clone)] @@ -42,7 +42,7 @@ impl Debug for Event { pub struct Insert(pub(crate) DatabaseOutputValue); impl Insert { - pub fn inner(&self) -> T { + pub fn inner(&self) -> Result { self.0.inner() } } @@ -54,10 +54,10 @@ pub struct Update { } impl Update { - pub fn inner_old(&self) -> T { + pub fn inner_old(&self) -> Result { self.old.inner() } - pub fn inner_new(&self) -> T { + pub fn inner_new(&self) -> Result { self.new.inner() } } @@ -66,7 +66,7 @@ impl Update { pub struct Delete(pub(crate) DatabaseOutputValue); impl Delete { - pub fn inner(&self) -> T { + pub fn inner(&self) -> Result { self.0.inner() } } diff --git a/tests/data/db_0_6_0 b/tests/data/db_0_6_0 new file mode 100644 index 00000000..27b5966f Binary files /dev/null and b/tests/data/db_0_6_0 differ diff --git a/tests/deserialization_error.rs b/tests/deserialization_error.rs new file mode 100644 index 00000000..443ee7a6 --- /dev/null +++ b/tests/deserialization_error.rs @@ -0,0 +1,34 @@ +use native_db::*; +use native_db::db_type::Result; +use native_db::db_type::Error; + +use native_model::{native_model, Model, Error as ModelError}; +use serde::{Deserialize, Serialize}; +use itertools::Itertools; + +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] +#[native_model(id = 1, version = 1)] +#[native_db] +struct Item1 { + // The type of the primary key must be u32, see generation of the test "create_local_database_for_tests". + // We change the type of the primary key to String to generate a deserialization error. + #[primary_key] + id: String, + #[secondary_key(unique)] + name: String, +} + +#[cfg(not(any(target_os = "android", target_os = "ios")))] +#[test] +fn create_local_database_for_tests() { + let root_project_path = env!("CARGO_MANIFEST_DIR"); + let database_path: String = format!("{}/tests/data/db_0_6_0", root_project_path); + + println!("database_path: {}", database_path); + let mut builder = DatabaseBuilder::new(); + builder.define::().unwrap(); + let db = builder.open(&database_path).unwrap(); + let r = db.r_transaction().unwrap(); + let result: Result> = r.scan().primary().unwrap().all().try_collect(); + assert!(matches!(result, Err(Error::ModelError(ModelError::DecodeBodyError(_))))); +} diff --git a/tests/migrate/with_secondary_keys.rs b/tests/migrate/with_secondary_keys.rs index 7c67cbcf..be79adc4 100644 --- a/tests/migrate/with_secondary_keys.rs +++ b/tests/migrate/with_secondary_keys.rs @@ -4,6 +4,8 @@ use serde::{Deserialize, Serialize}; use shortcut_assert_fs::TmpFs; use std::convert::TryFrom; use std::convert::TryInto; +use native_db::db_type::Result; +use itertools::Itertools; #[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)] #[native_model(id = 1, version = 1)] @@ -160,7 +162,7 @@ fn test_migrate() { .secondary(ItemV2Key::first_name_key) .unwrap() .start_with("Alexandre") - .collect(); + .try_collect().unwrap(); assert_eq!( item, vec![ItemV2 { @@ -176,7 +178,7 @@ fn test_migrate() { .secondary(ItemV2Key::last_name_key) .unwrap() .start_with("Verne") - .collect(); + .try_collect().unwrap(); assert_eq!( item, vec![ItemV2 { @@ -200,7 +202,7 @@ struct ItemV3 { impl TryFrom for ItemV2 { type Error = db_type::Error; - fn try_from(item: ItemV3) -> Result { + fn try_from(item: ItemV3) -> std::result::Result { Ok(ItemV2 { id: item.id, first_name: item.first_name, @@ -211,7 +213,7 @@ impl TryFrom for ItemV2 { impl TryFrom for ItemV3 { type Error = db_type::Error; - fn try_from(item: ItemV2) -> Result { + fn try_from(item: ItemV2) -> std::result::Result { Ok(ItemV3 { id: item.id, first_name: item.first_name, diff --git a/tests/scan.rs b/tests/scan.rs index 0a02f36f..d6d9699d 100644 --- a/tests/scan.rs +++ b/tests/scan.rs @@ -4,6 +4,8 @@ use native_db::*; use native_model::{native_model, Model}; use serde::{Deserialize, Serialize}; use shortcut_assert_fs::TmpFs; +use native_db::db_type::Result; +use itertools::Itertools; #[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)] #[native_model(id = 1, version = 1)] @@ -49,7 +51,7 @@ fn test_iter() { rw.commit().unwrap(); let r = db.r_transaction().unwrap(); - let result: Vec = r.scan().primary().unwrap().all().collect(); + let result: Vec= r.scan().primary().unwrap().all().try_collect().unwrap(); assert_eq!(result.len(), 2); let obj1 = result.get(0).unwrap(); @@ -80,7 +82,7 @@ fn test_iter_many_items_to_be_bytes() { let r = db.r_transaction().unwrap(); { - let iter: Vec = r.scan().primary().unwrap().all().collect(); + let iter: Vec = r.scan().primary().unwrap().all().try_collect().unwrap(); assert_eq!(iter.len(), 257); let obj1 = iter.get(0).unwrap(); @@ -113,7 +115,7 @@ fn test_double_ended_iter() { let r = db.r_transaction().unwrap(); let scan = r.scan().primary().unwrap(); let iter = scan.all(); - let result: Vec = iter.rev().collect(); + let result: Vec = iter.rev().try_collect().unwrap(); assert_eq!(result.len(), 2); @@ -142,14 +144,14 @@ fn test_iter_range() { rw.commit().unwrap(); let r = db.r_transaction().unwrap(); - let result: Vec = r.scan().primary().unwrap().range(..2_i32).collect(); + let result: Vec = r.scan().primary().unwrap().range(..2_i32).try_collect().unwrap(); assert_eq!(result.len(), 1); let obj1 = result.get(0).unwrap(); assert_eq!(obj1.id, 1); assert_eq!(obj1.name, "test"); - let result: Vec = r.scan().primary().unwrap().range(2_i32..).collect(); + let result: Vec = r.scan().primary().unwrap().range(2_i32..).try_collect().unwrap(); assert_eq!(result.len(), 2); let obj1 = result.get(0).unwrap(); @@ -160,7 +162,7 @@ fn test_iter_range() { assert_eq!(obj2.id, 3); assert_eq!(obj2.name, "test3"); - let result: Vec = r.scan().primary().unwrap().range(2_i32..3_i32).collect(); + let result: Vec = r.scan().primary().unwrap().range(2_i32..3_i32).try_collect().unwrap(); assert_eq!(result.len(), 1); let obj1 = result.get(0).unwrap(); @@ -187,7 +189,7 @@ fn test_iter_by_key() { .secondary(ItemKey::secondary_key_1) .unwrap() .all() - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 2); @@ -216,7 +218,7 @@ fn test_double_ended_iter_by_key() { let r = db.r_transaction().unwrap(); let scan = r.scan().secondary(ItemKey::secondary_key_1).unwrap(); let iter = scan.all(); - let result: Vec = iter.rev().collect(); + let result: Vec = iter.rev().try_collect().unwrap(); assert_eq!(result.len(), 2); @@ -246,7 +248,7 @@ fn test_double_ended_iter_by_key_range() { let r = db.r_transaction().unwrap(); let scan = r.scan().secondary(ItemKey::secondary_key_1).unwrap(); let iter = scan.range(..b"2".as_slice()); - let result: Vec = iter.rev().collect(); + let result: Vec = iter.rev().try_collect().unwrap(); assert_eq!(result.len(), 1); @@ -256,8 +258,7 @@ fn test_double_ended_iter_by_key_range() { let scan = r.scan().secondary(ItemKey::secondary_key_1).unwrap(); let iter = scan.range(b"2".as_slice()..); - let result: Vec = iter.rev().collect(); - + let result: Vec = iter.rev().try_collect().unwrap(); assert_eq!(result.len(), 2); let obj1 = result.get(0).unwrap(); @@ -270,7 +271,7 @@ fn test_double_ended_iter_by_key_range() { let scan = r.scan().secondary(ItemKey::secondary_key_1).unwrap(); let iter = scan.range(b"2".as_slice()..b"3".as_slice()); - let result: Vec = iter.rev().collect(); + let result: Vec = iter.rev().try_collect().unwrap(); assert_eq!(result.len(), 1); @@ -324,12 +325,12 @@ fn test_start_with_scenario() { for p in ["red:", "blue:", "green:"] { let r = db.r_transaction().unwrap(); - let result = r + let result: Vec = r .scan() .primary() .unwrap() .start_with(p.to_string().as_str()) - .collect::>(); + .try_collect().unwrap(); assert_eq!(result.len(), 3); let obj1 = result.get(0).unwrap(); @@ -400,7 +401,7 @@ fn test_start_with_by_key_scenario_write_txn() { .secondary(ItemIdFlagKey::flag) .unwrap() .start_with(p.to_string().as_str()) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 3); let obj1 = result.get(0).unwrap(); @@ -444,7 +445,7 @@ fn test_start_with_by_key_scenario_readonly_txn() { .secondary(ItemIdFlagKey::flag) .unwrap() .start_with(p.to_string().as_str()) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 3); let obj1 = result.get(0).unwrap(); @@ -472,7 +473,7 @@ fn test_txn_write_iter() { rw.commit().unwrap(); let rw = db.rw_transaction().unwrap(); - let result: Vec = rw.scan().primary().unwrap().all().collect(); + let result: Vec = rw.scan().primary().unwrap().all().try_collect().unwrap(); assert_eq!(result.len(), 2); let obj1 = result.get(0).unwrap(); @@ -504,7 +505,7 @@ fn test_txn_write_iter_range() { .primary() .unwrap() .range(..2_i32.to_be_bytes().as_slice()) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 1); let obj1 = result.get(0).unwrap(); @@ -516,7 +517,7 @@ fn test_txn_write_iter_range() { .primary() .unwrap() .range(2_i32.to_be_bytes().as_slice()..) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 2); let obj1 = result.get(0).unwrap(); @@ -532,7 +533,7 @@ fn test_txn_write_iter_range() { .primary() .unwrap() .range(2_i32.to_be_bytes().as_slice()..3_i32.to_be_bytes().as_slice()) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 1); let obj1 = result.get(0).unwrap(); @@ -571,7 +572,7 @@ fn test_txn_write_start_with_scenario() { .primary() .unwrap() .start_with(p.to_string().as_str()) - .collect(); + .try_collect().unwrap(); assert_eq!(result.len(), 3); let obj1 = result.get(0).unwrap(); diff --git a/tests/watch/mod.rs b/tests/watch/mod.rs index dca751cf..1ae6b75f 100644 --- a/tests/watch/mod.rs +++ b/tests/watch/mod.rs @@ -47,7 +47,7 @@ fn watch_one_primary_key() { for _ in 0..1 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -75,7 +75,7 @@ fn watch_all_primary_key() { for _ in 0..2 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -110,7 +110,7 @@ fn watch_multithreading() { for _ in 0..1 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -130,7 +130,7 @@ fn watch_multithreading() { for _ in 0..2 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -163,7 +163,7 @@ fn watch_outside() { // Check that recv receives only 1 insert event let inner_event: ItemB = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -207,7 +207,7 @@ fn watch_one_secondary_key() { for _ in 0..1 { let inner_event: ItemA1K = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -248,7 +248,7 @@ fn watch_all_secondary_keys() { for _ in 0..2 { let inner_event: ItemA1K = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -275,7 +275,7 @@ fn unwatch() { for _ in 0..1 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -308,7 +308,7 @@ fn unwatch_by_deleted_receiver() { for _ in 0..1 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -367,7 +367,7 @@ fn watch_start_with() { for _ in 0..2 { let inner_event: ItemC = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -413,7 +413,7 @@ fn watch_start_with_by_key() { for _ in 0..2 { let inner_event: ItemA1K = if let Event::Insert(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -447,7 +447,7 @@ fn watch_all_delete() { for _ in 0..1 { let r_a: ItemA = if let Event::Delete(event) = recv.recv_timeout(TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -482,7 +482,7 @@ fn watch_all_update() { for _ in 0..1 { let (old_r_a, new_r_a): (ItemA, ItemA) = if let Event::Update(event) = recv.recv_timeout(TIMEOUT).unwrap() { - (event.inner_old(), event.inner_new()) + (event.inner_old().unwrap(), event.inner_new().unwrap()) } else { panic!("wrong event") }; diff --git a/tests/watch/watch_optional.rs b/tests/watch/watch_optional.rs index 91ae5096..782316f2 100644 --- a/tests/watch/watch_optional.rs +++ b/tests/watch/watch_optional.rs @@ -40,7 +40,7 @@ fn watch_one_secondary_key_some() { for _ in 0..1 { let inner_event: ItemAOptional = if let Event::Insert(event) = recv.recv_timeout(super::TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; @@ -117,7 +117,7 @@ fn watch_start_with_by_key() { for _ in 0..2 { let inner_event: ItemAOptional = if let Event::Insert(event) = recv.recv_timeout(super::TIMEOUT).unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") }; diff --git a/tests/watch_tokio.rs b/tests/watch_tokio.rs index 52eb24ff..80650c40 100644 --- a/tests/watch_tokio.rs +++ b/tests/watch_tokio.rs @@ -32,7 +32,7 @@ async fn watch_one_primary_key() { for _ in 0..1 { let inner_event: ItemA = if let Event::Insert(event) = recv.recv().await.unwrap() { - event.inner() + event.inner().unwrap() } else { panic!("wrong event") };