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