From b0362413a9c12d5c501bf7f518b18544cf3bb3f8 Mon Sep 17 00:00:00 2001 From: librelois <elois@ifee.fr> Date: Mon, 25 Nov 2019 22:36:08 +0100 Subject: [PATCH] [ref] bc-db: merge db handler and reader into a struct --- lib/modules-lib/bc-db-reader/Cargo.toml | 2 +- .../bc-db-reader/src/indexes/identities.rs | 16 +++++------ lib/modules-lib/bc-db-reader/src/lib.rs | 9 +++++-- lib/modules-lib/bc-db-reader/src/traits.rs | 23 +++++++++++----- .../bc-db-writer/src/indexes/transactions.rs | 7 +++-- .../blockchain/bc-db-writer/src/lib.rs | 2 ++ .../blockchain/src/fork/fork_algo.rs | 13 +++++---- .../blockchain/src/fork/rollback.rs | 21 ++++++++------- .../blockchain/blockchain/tests/common.rs | 4 +-- lib/modules/gva/src/db.rs | 4 +-- lib/modules/gva/src/schema/entities/block.rs | 4 +-- lib/modules/gva/src/schema/queries/block.rs | 4 +-- lib/modules/gva/src/schema/queries/blocks.rs | 4 +-- lib/modules/gva/src/schema/queries/current.rs | 4 +-- lib/tools/common-tools/src/traits/mod.rs | 4 +++ lib/tools/dbs-tools/Cargo.toml | 1 + lib/tools/dbs-tools/src/kv_db.rs | 2 ++ lib/tools/dbs-tools/src/kv_db/file.rs | 27 ++++++++++++++++--- 18 files changed, 96 insertions(+), 55 deletions(-) diff --git a/lib/modules-lib/bc-db-reader/Cargo.toml b/lib/modules-lib/bc-db-reader/Cargo.toml index 7dfb6496..1084dd8b 100644 --- a/lib/modules-lib/bc-db-reader/Cargo.toml +++ b/lib/modules-lib/bc-db-reader/Cargo.toml @@ -37,4 +37,4 @@ tempfile = "3.1.0" [features] client-indexer = [] -mock = ["mockall"] +mock = ["mockall", "durs-dbs-tools/mock"] diff --git a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs index 8a23e570..b1067c13 100644 --- a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs +++ b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs @@ -287,12 +287,12 @@ mod test { let idty_bin = durs_dbs_tools::to_bytes(idty)?; db.write(|mut w| { db.get_store(WOT_ID_INDEX).put( - db.w.as_mut(), + w.as_mut(), &idty.idty_doc.issuers()[0].to_bytes_vector(), &DbValue::U64(wot_id), )?; db.get_int_store(IDENTITIES).put( - db.w.as_mut(), + w.as_mut(), wot_id as u32, &KvFileDbHandler::db_value(&idty_bin)?, )?; @@ -304,7 +304,7 @@ mod test { // Write greatest wot id db.write(|mut w| { db.get_int_store(CURRENT_METAS_DATAS).put( - db.w.as_mut(), + w.as_mut(), CurrentMetaDataKey::NextWotId.to_u32(), &DbValue::U64(wot_id), )?; @@ -315,18 +315,18 @@ mod test { let mut filters = IdentitiesFilter::default(); assert!(slice_same_elems( &mock_identities, - &get_identities(&db, filters, BlockNumber(5))? + &db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? )); // Test by pubkey filter filters = IdentitiesFilter::by_pubkey(pubkey('A')); assert_eq!( vec![mock_identities[0].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); filters = IdentitiesFilter::by_pubkey(pubkey('C')); assert_eq!( vec![mock_identities[2].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); // Test paging filter with little page size @@ -341,7 +341,7 @@ mod test { }; assert!(slice_same_elems( &vec![mock_identities[2].clone(), mock_identities[3].clone()], - &get_identities(&db, filters, BlockNumber(5))? + &db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? )); // Test paging filter with limited interval @@ -356,7 +356,7 @@ mod test { }; assert_eq!( vec![mock_identities[2].clone()], - get_identities(&db, filters, BlockNumber(5))? + db.r(|db_r| get_identities(db_r, filters, BlockNumber(5)))? ); Ok(()) diff --git a/lib/modules-lib/bc-db-reader/src/lib.rs b/lib/modules-lib/bc-db-reader/src/lib.rs index 2c148ed0..20a90069 100644 --- a/lib/modules-lib/bc-db-reader/src/lib.rs +++ b/lib/modules-lib/bc-db-reader/src/lib.rs @@ -42,8 +42,8 @@ pub use durs_dbs_tools::kv_db::{ }; pub use durs_dbs_tools::DbError; #[cfg(feature = "mock")] -pub use traits::MockBcDbInReadTx_ as MockBcDbInReadTx; -pub use traits::{BcDbInReadTx, BcDbInReadTx_, BcDbRead, BcDbWithReader}; +pub use traits::MockBcDbInReadTx; +pub use traits::{BcDbInReadTx, BcDbRead, BcDbWithReader}; use constants::*; use maplit::hashmap; @@ -100,6 +100,11 @@ where } } +impl<'r, 'db: 'r, DB> durs_common_tools::traits::NotMock for BcDbWithReaderStruct<'r, 'db, DB> where + DB: DbReadable +{ +} + #[cfg(test)] pub mod tests { diff --git a/lib/modules-lib/bc-db-reader/src/traits.rs b/lib/modules-lib/bc-db-reader/src/traits.rs index 9e8f8e33..544a2776 100644 --- a/lib/modules-lib/bc-db-reader/src/traits.rs +++ b/lib/modules-lib/bc-db-reader/src/traits.rs @@ -48,10 +48,6 @@ where } } -pub trait BcDbInReadTx: BcDbWithReader + BcDbInReadTx_ {} - -impl<T> BcDbInReadTx for T where T: BcDbWithReader + BcDbInReadTx_ {} - pub trait BcDbWithReader { type DB: DbReadable; type R: DbReader; @@ -60,8 +56,21 @@ pub trait BcDbWithReader { fn r(&self) -> &Self::R; } +#[cfg(feature = "mock")] +impl<'a> BcDbWithReader for MockBcDbInReadTx { + type DB = crate::BcDbRo; + type R = durs_dbs_tools::kv_db::MockKvFileDbReader; + + fn db(&self) -> &Self::DB { + unreachable!() + } + fn r(&self) -> &Self::R { + unreachable!() + } +} + #[cfg_attr(feature = "mock", automock)] -pub trait BcDbInReadTx_ { +pub trait BcDbInReadTx: BcDbWithReader { fn get_current_blockstamp(&self) -> Result<Option<Blockstamp>, DbError>; fn get_current_block(&self) -> Result<Option<DbBlock>, DbError>; fn get_db_block_in_local_blockchain( @@ -76,9 +85,9 @@ pub trait BcDbInReadTx_ { fn get_uid_from_pubkey(&self, pubkey: &PubKey) -> Result<Option<String>, DbError>; } -impl<T> BcDbInReadTx_ for T +impl<T> BcDbInReadTx for T where - T: BcDbWithReader, + T: BcDbWithReader + durs_common_tools::traits::NotMock, { fn get_current_blockstamp(&self) -> Result<Option<Blockstamp>, DbError> { crate::current_meta_datas::get_current_blockstamp(self) diff --git a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs index 9dcf7c02..05317b87 100644 --- a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs +++ b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs @@ -306,15 +306,14 @@ mod tests { // Check new UTXOS // TODO //db.get_store(UTXOS).iter_start()? - let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(r)?.count()))?; + let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(&r)?.count()))?; assert_eq!(2, count_utxos); // Revert first g1 tx db.write(|mut w| { if let Some(mut block_consumed_sources_opt) = durs_bc_db_reader::indexes::sources::get_block_consumed_sources_( - &db, - w.as_ref(), + &BcDbRwWithWriter { db: &db, w: &w }, BlockNumber(52), )? { @@ -326,7 +325,7 @@ mod tests { })?; // UTXOS must be empty - let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(r)?.count()))?; + let count_utxos = db.read(|r| Ok(db.get_store(UTXOS).iter_start(&r)?.count()))?; assert_eq!(0, count_utxos); Ok(()) diff --git a/lib/modules/blockchain/bc-db-writer/src/lib.rs b/lib/modules/blockchain/bc-db-writer/src/lib.rs index 6bcfceac..74462a32 100644 --- a/lib/modules/blockchain/bc-db-writer/src/lib.rs +++ b/lib/modules/blockchain/bc-db-writer/src/lib.rs @@ -91,6 +91,8 @@ impl<'w, 'db: 'w> durs_bc_db_reader::BcDbWithReader for BcDbRwWithWriter<'w, 'db } } +impl<'w, 'db: 'w> durs_common_tools::traits::NotMock for BcDbRwWithWriter<'w, 'db> {} + #[derive(Debug)] /// Set of databases storing web of trust information pub struct WotsV10DBs { diff --git a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs index 96e22cd1..725c91c6 100644 --- a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs +++ b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs @@ -140,10 +140,9 @@ mod tests { // Local blockchain must contain at least `fork_window_size +2` blocks assert!(db - .read( - |r| durs_bc_db_reader::blocks::get_block_in_local_blockchain( - &db, - r, + .r( + |db_r| durs_bc_db_reader::blocks::get_block_in_local_blockchain( + db_r, BlockNumber((fork_window_size + 1) as u32) ) )? @@ -182,7 +181,7 @@ mod tests { assert_eq!( None, db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &fork_tree, fork_window_size, current_blockstamp, @@ -226,7 +225,7 @@ mod tests { determining_blockstamp, ]), db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &mut fork_tree, fork_window_size, current_blockstamp, @@ -258,7 +257,7 @@ mod tests { assert_eq!( Some(new_main_blocks.iter().map(|b| b.blockstamp()).collect()), db.read(|r| fork_resolution_algo( - &BcDbRwWithReader { db, r }, + &BcDbRwWithReader { db: &db, r }, &mut fork_tree, fork_window_size, current_blockstamp, diff --git a/lib/modules/blockchain/blockchain/src/fork/rollback.rs b/lib/modules/blockchain/blockchain/src/fork/rollback.rs index e7a01da7..ec11ff9f 100644 --- a/lib/modules/blockchain/blockchain/src/fork/rollback.rs +++ b/lib/modules/blockchain/blockchain/src/fork/rollback.rs @@ -18,7 +18,6 @@ use crate::fork::revert_block::ValidBlockRevertReqs; use crate::*; use dubp_common_doc::traits::Document; use dubp_common_doc::Blockstamp; -use durs_bc_db_reader::BcDbRead; use durs_common_tools::fatal_error; use unwrap::unwrap; @@ -36,12 +35,13 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) let db_tx_result = db.write(|mut w| { // Rollback (revert old branch) while bc.current_blockstamp.id.0 > last_common_block_number { - if let Some(dal_block) = db - .r(|db_r| durs_bc_db_reader::blocks::get_fork_block(db_r, bc.current_blockstamp)) - .unwrap_or_else(|_| { - fatal_error!("revert block {} fail !", bc.current_blockstamp); - }) - { + if let Some(dal_block) = durs_bc_db_reader::blocks::get_fork_block( + &BcDbRwWithWriter { db: &db, w: &w }, + bc.current_blockstamp, + ) + .unwrap_or_else(|_| { + fatal_error!("revert block {} fail !", bc.current_blockstamp); + }) { let blockstamp = dal_block.block.blockstamp(); debug!("try to revert block #{}", blockstamp); let ValidBlockRevertReqs { @@ -85,9 +85,10 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) // Apply new branch let mut new_branch_is_valid = true; for blockstamp in &new_bc_branch { - if let Ok(Some(dal_block)) = - db.r(|db_r| durs_bc_db_reader::blocks::get_fork_block(db_r, *blockstamp)) - { + if let Ok(Some(dal_block)) = durs_bc_db_reader::blocks::get_fork_block( + &BcDbRwWithWriter { db: &db, w: &w }, + *blockstamp, + ) { new_branch_blocks.push(dal_block.clone()); match check_and_apply_block(bc, &db, &mut w, dal_block.block) { Ok(check_and_apply_block_return) => match check_and_apply_block_return { diff --git a/lib/modules/blockchain/blockchain/tests/common.rs b/lib/modules/blockchain/blockchain/tests/common.rs index fe02380f..c02ac26b 100644 --- a/lib/modules/blockchain/blockchain/tests/common.rs +++ b/lib/modules/blockchain/blockchain/tests/common.rs @@ -34,8 +34,8 @@ pub fn init() -> PathBuf { /// Stop and clear test pub fn stop_and_clean( - bc_sender: Sender<DursMsg>, - handle: JoinHandle<()>, + _bc_sender: Sender<DursMsg>, + _handle: JoinHandle<()>, tmp_profile_path: PathBuf, ) { // Send STOP signal to blockchain module diff --git a/lib/modules/gva/src/db.rs b/lib/modules/gva/src/db.rs index dd893c58..ecdea969 100644 --- a/lib/modules/gva/src/db.rs +++ b/lib/modules/gva/src/db.rs @@ -15,7 +15,7 @@ //! Gva Module: database requests -#[cfg(test)] -pub(crate) use durs_bc_db_reader::BcDbInReadTx as BcDbRo; #[cfg(not(test))] pub(crate) use durs_bc_db_reader::BcDbRo; +#[cfg(test)] +pub(crate) use durs_bc_db_reader::MockBcDbInReadTx as BcDbRo; diff --git a/lib/modules/gva/src/schema/entities/block.rs b/lib/modules/gva/src/schema/entities/block.rs index 972a9bc6..10e54692 100644 --- a/lib/modules/gva/src/schema/entities/block.rs +++ b/lib/modules/gva/src/schema/entities/block.rs @@ -21,7 +21,7 @@ use chrono::NaiveDateTime; use dubp_block_doc::block::BlockDocumentTrait; use dubp_common_doc::traits::Document; use durs_bc_db_reader::blocks::DbBlock; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use durs_common_tools::fatal_error; use juniper::{Executor, FieldResult}; use juniper_from_schema::{QueryTrail, Walked}; @@ -43,7 +43,7 @@ impl Block { trail.issuer_name() } // Convert BlockDb (db entity) into Block (gva entity) - pub(crate) fn from_block_db<DB: BcDbWithReader>( + pub(crate) fn from_block_db<DB: BcDbInReadTx>( db: &DB, block_db: DbBlock, ask_issuer_name: bool, diff --git a/lib/modules/gva/src/schema/queries/block.rs b/lib/modules/gva/src/schema/queries/block.rs index 09cde41e..fc9253a5 100644 --- a/lib/modules/gva/src/schema/queries/block.rs +++ b/lib/modules/gva/src/schema/queries/block.rs @@ -17,10 +17,10 @@ use crate::schema::entities::block::Block; use dubp_common_doc::BlockNumber; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, Block, Walked>, number: i32, diff --git a/lib/modules/gva/src/schema/queries/blocks.rs b/lib/modules/gva/src/schema/queries/blocks.rs index 9c0fd898..fa4a97c1 100644 --- a/lib/modules/gva/src/schema/queries/blocks.rs +++ b/lib/modules/gva/src/schema/queries/blocks.rs @@ -22,10 +22,10 @@ use crate::schema::inputs::paging::{FilledPaging, Paging}; use crate::schema::inputs::sort_order::SortOrder; use dubp_common_doc::BlockNumber; use durs_bc_db_reader::blocks::DbBlock; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, BlocksPage, Walked>, paging_opt: Option<Paging>, diff --git a/lib/modules/gva/src/schema/queries/current.rs b/lib/modules/gva/src/schema/queries/current.rs index 2a8e3b20..6a736f8a 100644 --- a/lib/modules/gva/src/schema/queries/current.rs +++ b/lib/modules/gva/src/schema/queries/current.rs @@ -16,10 +16,10 @@ // ! Module execute GraphQl schema current query use crate::schema::entities::block::Block; -use durs_bc_db_reader::{BcDbInReadTx_, BcDbWithReader, DbError}; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; use juniper_from_schema::{QueryTrail, Walked}; -pub(crate) fn execute<DB: BcDbWithReader>( +pub(crate) fn execute<DB: BcDbInReadTx>( db: &DB, trail: &QueryTrail<'_, Block, Walked>, ) -> Result<Option<Block>, DbError> { diff --git a/lib/tools/common-tools/src/traits/mod.rs b/lib/tools/common-tools/src/traits/mod.rs index 757fcc09..812a3a13 100644 --- a/lib/tools/common-tools/src/traits/mod.rs +++ b/lib/tools/common-tools/src/traits/mod.rs @@ -17,3 +17,7 @@ pub mod bool_ext; pub mod merge; + +/// Allows to mark the real structure in order to differentiate it from the mocked structure, +/// is essential in some special cases +pub trait NotMock {} diff --git a/lib/tools/dbs-tools/Cargo.toml b/lib/tools/dbs-tools/Cargo.toml index e00a66f2..a94e4c5e 100644 --- a/lib/tools/dbs-tools/Cargo.toml +++ b/lib/tools/dbs-tools/Cargo.toml @@ -24,3 +24,4 @@ unwrap = "1.2.1" tempfile = "3.1.0" [features] +mock = [] diff --git a/lib/tools/dbs-tools/src/kv_db.rs b/lib/tools/dbs-tools/src/kv_db.rs index e94247a9..ac1afbfd 100644 --- a/lib/tools/dbs-tools/src/kv_db.rs +++ b/lib/tools/dbs-tools/src/kv_db.rs @@ -17,6 +17,8 @@ mod file; +#[cfg(feature = "mock")] +pub use file::MockKvFileDbReader; pub use file::{ from_db_value, KvFileDbHandler, KvFileDbRead, KvFileDbReader, KvFileDbRoHandler, KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter, diff --git a/lib/tools/dbs-tools/src/kv_db/file.rs b/lib/tools/dbs-tools/src/kv_db/file.rs index 7f0d52f6..fa0a23e5 100644 --- a/lib/tools/dbs-tools/src/kv_db/file.rs +++ b/lib/tools/dbs-tools/src/kv_db/file.rs @@ -42,6 +42,25 @@ impl<'r> rkv::Readable for KvFileDbReader<'r> { } } +#[cfg(feature = "mock")] +#[derive(Clone, Copy, Debug)] +/// Mock key-value database reader +pub struct MockKvFileDbReader; + +#[cfg(feature = "mock")] +impl rkv::Readable for MockKvFileDbReader { + fn get<K: AsRef<[u8]>>( + &self, + _: rkv::Database, + _: &K, + ) -> Result<Option<Value>, rkv::StoreError> { + unreachable!() + } + fn open_ro_cursor(&self, _: rkv::Database) -> Result<rkv::RoCursor, rkv::StoreError> { + unreachable!() + } +} + /// Key-value database writer pub struct KvFileDbWriter<'w> { buffer: Vec<u8>, @@ -418,7 +437,7 @@ mod tests { key: u32, ) -> Result<Option<String>, DbError> { ro_db.read(|r| { - if let Some(Value::Str(v)) = ro_db.get_int_store(store_name).get(r, key)? { + if let Some(Value::Str(v)) = ro_db.get_int_store(store_name).get(&r, key)? { Ok(Some(v.to_owned())) } else { Ok(None) @@ -436,7 +455,7 @@ mod tests { let store_test1 = db.get_int_store("test1"); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("toto"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("toto"))?; Ok(w) })?; @@ -448,7 +467,7 @@ mod tests { ); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("titi"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("titi"))?; Ok(w) })?; @@ -458,7 +477,7 @@ mod tests { ); db.write(|mut w| { - store_test1.put(db.w.as_mut(), 3, &Value::Str("tutu"))?; + store_test1.put(w.as_mut(), 3, &Value::Str("tutu"))?; assert_eq!( Some("titi".to_owned()), get_int_store_str_val(&ro_db, "test1", 3)? -- GitLab