diff --git a/Cargo.lock b/Cargo.lock index f73bbd70320c150054c3a3d0aa04530161277b07..b966b136042bca1ae6d779cf00b96d657c0cf539 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -622,9 +622,11 @@ dependencies = [ "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "dubp-currency-params 0.2.0", "dup-crypto 0.7.0", + "durs-bc-db-reader 0.3.0-dev", "durs-blockchain 0.3.0-dev", "durs-common-tools 0.2.0", "durs-conf 0.3.0-dev", + "durs-dbs-tools 0.1.0-a", "durs-message 0.3.0-dev", "durs-module 0.3.0-dev", "durs-network 0.3.0-dev", diff --git a/lib/core/core/Cargo.toml b/lib/core/core/Cargo.toml index 86f6c5440444365360dc5eab1f16746cf6c25d84..555fd03ae89ce88a321d9106f333f6ec197d7e82 100644 --- a/lib/core/core/Cargo.toml +++ b/lib/core/core/Cargo.toml @@ -14,7 +14,9 @@ clear_on_drop = "0.2.3" dirs = "1.0.2" durs-blockchain = { path = "../../modules/blockchain/blockchain" } durs-common-tools = { path = "../../tools/common-tools" } +durs-bc-db-reader = { path = "../../modules-lib/bc-db-reader" } durs-conf = { path = "../conf" } +durs-dbs-tools = { path = "../../tools/dbs-tools" } dup-crypto = { path = "../../crypto" } dubp-currency-params = { path = "../../dubp/currency-params" } durs-message = { path = "../message" } diff --git a/lib/core/core/src/commands/mod.rs b/lib/core/core/src/commands/mod.rs index bfe86cc7b54f4b756fd371129dc544893010ecba..0c51c03b966fd3f6b16bfcddd3bc0542702d61b1 100644 --- a/lib/core/core/src/commands/mod.rs +++ b/lib/core/core/src/commands/mod.rs @@ -21,10 +21,12 @@ pub mod modules; pub mod reset; pub mod start; +use crate::constants::DEFAULT_USER_PROFILE; use crate::errors::DursCoreError; use crate::DursCore; pub use dbex::*; use durs_conf::DuRsConf; +use durs_dbs_tools::kv_db::KvFileDbHandler; pub use durs_network::cli::sync::SyncOpt; pub use keys::KeysOpt; use log::Level; @@ -47,6 +49,20 @@ pub struct DursCoreOptions { pub profiles_path: Option<PathBuf>, } +impl DursCoreOptions { + /// Define profile path + #[inline] + pub fn define_profile_path(&self) -> PathBuf { + durs_conf::get_profile_path( + &self.profiles_path, + &self + .profile_name + .clone() + .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()), + ) + } +} + /// Dunitrust executable command pub trait DursExecutableCoreCommand { /// Execute Dunitrust command @@ -76,6 +92,14 @@ pub enum DursCommandEnum<T: ExecutableModuleCommand> { } impl<T: ExecutableModuleCommand> DursCommand<T> { + fn open_bc_db(&self, profile_path: &PathBuf) -> Result<KvFileDbHandler, DursCoreError> { + let bc_db_path = durs_conf::get_blockchain_db_path(profile_path.clone()); + durs_dbs_tools::kv_db::KvFileDbHandler::open_db( + bc_db_path.as_path(), + &durs_bc_db_reader::bc_db_schema(), + ) + .map_err(DursCoreError::FailOpenBcDb) + } /// Execute Dunitrust command pub fn execute<PlugFunc>( self, @@ -86,12 +110,16 @@ impl<T: ExecutableModuleCommand> DursCommand<T> { where PlugFunc: FnMut(&mut DursCore<DuRsConf>) -> Result<(), DursCoreError>, { + let profile_path = self.options.define_profile_path(); + let bc_db = self.open_bc_db(&profile_path)?; + match self.command { DursCommandEnum::Core(core_cmd) => DursCore::execute_core_command( + bc_db, core_cmd, self.options, - vec![], plug_modules, + profile_path, soft_name, soft_version, ), diff --git a/lib/core/core/src/errors.rs b/lib/core/core/src/errors.rs index 80d353745582a1287b5452fcbf9730c92bf859d8..9bd76606de2d8bb9f280fe0e02a5d08ff0ed288b 100644 --- a/lib/core/core/src/errors.rs +++ b/lib/core/core/src/errors.rs @@ -29,6 +29,9 @@ pub enum DursCoreError { /// Generic error that impl Fail #[fail(display = "{}", _0)] Error(Error), + /// Fail to open blockchain DB. + #[fail(display = "Fail to open blockchain DB: {:?}", _0)] + FailOpenBcDb(durs_dbs_tools::DbError), /// Fail to read currency params DB #[fail(display = "Fail to read currency params DB: {}", _0)] FailReadCurrencyParamsDb(CurrencyParamsDbError), diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs index 8c0ad96623400cd27bd9eb539d07ac8284b999a4..583a10f88b3b609f4d8be694db1a8b32fb36a843 100644 --- a/lib/core/core/src/lib.rs +++ b/lib/core/core/src/lib.rs @@ -40,7 +40,6 @@ mod logger; mod router; use crate::commands::*; -use crate::constants::DEFAULT_USER_PROFILE; use crate::errors::DursCoreError; use dubp_currency_params::CurrencyName; use durs_blockchain::{dbex::DbExQuery, BlockchainModule}; @@ -155,10 +154,11 @@ impl DursCore<DuRsConf> { /// Execute core command pub fn execute_core_command<PlugFunc>( + bc_db: durs_dbs_tools::kv_db::KvFileDbHandler, core_command: DursCoreCommand, durs_core_opts: DursCoreOptions, - external_followers: Vec<mpsc::Sender<DursMsg>>, mut plug_modules: PlugFunc, + profile_path: PathBuf, soft_name: &'static str, soft_version: &'static str, ) -> Result<(), DursCoreError> @@ -168,8 +168,6 @@ impl DursCore<DuRsConf> { // Instantiate durs core let mut durs_core = DursCore::<DuRsConf>::init(soft_name, soft_version, durs_core_opts, 0)?; - let profile_path = durs_core.soft_meta_datas.profile_path.clone(); - /* * CORE COMMAND PROCESSING */ @@ -183,7 +181,6 @@ impl DursCore<DuRsConf> { 0, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - vec![], )); plug_modules(&mut durs_core) } @@ -194,10 +191,9 @@ impl DursCore<DuRsConf> { durs_core.run_duration_in_secs, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - external_followers, )); plug_modules(&mut durs_core)?; - durs_core.start() + durs_core.start(bc_db) } DursCoreCommand::SyncOpt(opts) => { if opts.local_path.is_some() { @@ -217,10 +213,9 @@ impl DursCore<DuRsConf> { durs_core.run_duration_in_secs, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - external_followers, )); plug_modules(&mut durs_core)?; - durs_core.start() + durs_core.start(bc_db) } else { Err(DursCoreError::SyncWithoutSource) } @@ -238,13 +233,7 @@ impl DursCore<DuRsConf> { run_duration_in_secs: u64, ) -> Result<DursCore<DuRsConf>, DursCoreError> { // get profile path - let profile_path = durs_conf::get_profile_path( - &durs_core_opts.profiles_path, - &durs_core_opts - .profile_name - .clone() - .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()), - ); + let profile_path = durs_core_opts.define_profile_path(); // Init logger logger::init( @@ -286,7 +275,10 @@ impl DursCore<DuRsConf> { }) } /// Start durs server - pub fn start(mut self) -> Result<(), DursCoreError> { + pub fn start( + mut self, + bc_db: durs_dbs_tools::kv_db::KvFileDbHandler, + ) -> Result<(), DursCoreError> { if self.network_modules_count == 0 { fatal_error!( "Dev error: no network module found: you must plug at least one network module !" @@ -329,6 +321,7 @@ impl DursCore<DuRsConf> { // Instantiate blockchain module and load is conf let mut blockchain_module = BlockchainModule::load_blockchain_conf( + bc_db, router_sender.clone(), profile_path, RequiredKeysContent::MemberKeyPair(None), diff --git a/lib/core/core/src/router.rs b/lib/core/core/src/router.rs index acba54faf64e3b9e06c98bc6eec6204248f6acb1..5086e57221091731e0d816e0ca3b086349b0b876 100644 --- a/lib/core/core/src/router.rs +++ b/lib/core/core/src/router.rs @@ -41,7 +41,6 @@ enum DursMsgReceiver { fn start_broadcasting_thread( start_time: SystemTime, receiver: &mpsc::Receiver<RouterThreadMessage<DursMsg>>, - _external_followers: &[mpsc::Sender<DursMsg>], ) { // Define variables let mut modules_senders: HashMap<ModuleStaticName, mpsc::Sender<DursMsg>> = HashMap::new(); @@ -317,7 +316,6 @@ pub fn start_router( run_duration_in_secs: u64, profile_path: PathBuf, conf: DuRsConf, - external_followers: Vec<mpsc::Sender<DursMsg>>, ) -> mpsc::Sender<RouterThreadMessage<DursMsg>> { let start_time = SystemTime::now(); @@ -337,7 +335,7 @@ pub fn start_router( // Create broadcasting thread thread::spawn(move || { - start_broadcasting_thread(start_time, &broadcasting_receiver, &external_followers); + start_broadcasting_thread(start_time, &broadcasting_receiver); }); // Create conf thread channel diff --git a/lib/modules/blockchain/blockchain/src/dbex.rs b/lib/modules/blockchain/blockchain/src/dbex.rs index 4dda821e85f64ceef1a72636c53e3cde5a84142c..65cc5165d99a779a83782c820b4b831ff9536d82 100644 --- a/lib/modules/blockchain/blockchain/src/dbex.rs +++ b/lib/modules/blockchain/blockchain/src/dbex.rs @@ -111,7 +111,7 @@ pub fn dbex_bc(profile_path: PathBuf, _csv: bool, _query: DbExBcQuery) -> Result // Open databases let load_dbs_begin = SystemTime::now(); - let db = open_db(&db_path.as_path())?; + let db = durs_bc_db_reader::open_db_ro(&db_path.as_path())?; let load_dbs_duration = SystemTime::now() .duration_since(load_dbs_begin) @@ -379,7 +379,7 @@ pub fn dbex_wot(profile_path: PathBuf, csv: bool, query: &DbExWotQuery) { } DbExWotQuery::ExpireMembers(ref reverse) => { // Open blockchain database - let db = open_db(&db_path.as_path()).expect("Fail to open DB."); + let db = durs_bc_db_reader::open_db_ro(&db_path.as_path()).expect("Fail to open DB."); // Get blocks_times let all_blocks = durs_bc_db_reader::readers::block::get_blocks_in_local_blockchain( &db, diff --git a/lib/modules/blockchain/blockchain/src/lib.rs b/lib/modules/blockchain/blockchain/src/lib.rs index b71714b43bd8c7b21c82fabbc582905242d275d1..4706747be31fd845b1a3a66d54379b56e3b4c2c6 100644 --- a/lib/modules/blockchain/blockchain/src/lib.rs +++ b/lib/modules/blockchain/blockchain/src/lib.rs @@ -181,6 +181,7 @@ impl BlockchainModule { } /// Loading blockchain configuration pub fn load_blockchain_conf( + db: Db, router_sender: mpsc::Sender<RouterThreadMessage<DursMsg>>, profile_path: PathBuf, _keys: RequiredKeysContent, @@ -189,7 +190,6 @@ impl BlockchainModule { let dbs_path = durs_conf::get_blockchain_db_path(profile_path.clone()); // Open databases - let db = open_db(&dbs_path.as_path()).unwrap_or_else(|_| fatal_error!("Fail to open DB.")); let fork_tree = durs_bc_db_reader::readers::current_meta_datas::get_fork_tree(&db) .unwrap_or_else(|_| fatal_error!("Fail to get fork tree.")); let wot_databases = WotsV10DBs::open(Some(&dbs_path)); diff --git a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs index 11328f1cd76ac865d04d0d18512dec7af1d9891a..d288cca0c6247602542f9b6779d2e5788527aa22 100644 --- a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs +++ b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs @@ -96,7 +96,7 @@ pub fn json_reader_worker( // Get current local blockstamp debug!("Get local current blockstamp..."); let db_path = durs_conf::get_blockchain_db_path(profile_path); - let db = open_db(&db_path).expect("Fail to open DB."); + let db = durs_bc_db_reader::open_db_ro(&db_path).expect("Fail to open DB."); let current_blockstamp: Blockstamp = durs_bc_db_reader::readers::current_meta_datas::get_current_blockstamp(&db) .expect("get_current_blockstamp: Fail to read DB !")