From d98d18ef09062ae3f375777f2840b991d6a3a27a Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Mon, 3 Feb 2020 01:20:29 +0100
Subject: [PATCH] [ref] db-tools: write transactions must be able to return
 datas

---
 .../bc-db-reader/src/indexes/identities.rs    |  4 +--
 lib/modules-lib/bc-db-reader/src/lib.rs       |  2 +-
 .../bc-db-writer/src/indexes/transactions.rs  |  6 ++--
 .../blockchain/bc-db-writer/src/lib.rs        |  2 +-
 .../blockchain/src/dunp/receiver.rs           |  2 +-
 .../blockchain/src/fork/fork_algo.rs          |  6 ++--
 .../blockchain/src/fork/rollback.rs           |  2 +-
 .../blockchain/src/fork/stackable_blocks.rs   |  9 +++--
 .../src/sync/apply/blocks_worker.rs           |  4 +--
 .../blockchain/src/sync/apply/mod.rs          |  4 +--
 .../blockchain/src/sync/apply/txs_worker.rs   |  2 +-
 .../blockchain/src/sync/apply/wot_worker.rs   |  2 +-
 .../bc-db-tests-tools/src/mocks.rs            |  6 ++--
 lib/tools/dbs-tools/src/kv_db_old.rs          |  2 +-
 lib/tools/dbs-tools/src/kv_db_old/file.rs     | 36 ++++++++++++++-----
 15 files changed, 56 insertions(+), 33 deletions(-)

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 3a8ef7e0..ca1d1172 100644
--- a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs
+++ b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs
@@ -284,7 +284,7 @@ mod test {
                     wot_id as u32,
                     &KvFileDbHandler::db_value(&idty_bin)?,
                 )?;
-                Ok(w)
+                Ok(WriteResp::from(w))
             })?;
             wot_id += 1;
         }
@@ -296,7 +296,7 @@ mod test {
                 CurrentMetaDataKey::NextWotId.to_u32(),
                 &DbValue::U64(wot_id),
             )?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         // Test default filters
diff --git a/lib/modules-lib/bc-db-reader/src/lib.rs b/lib/modules-lib/bc-db-reader/src/lib.rs
index 7b63de38..143f4fe5 100644
--- a/lib/modules-lib/bc-db-reader/src/lib.rs
+++ b/lib/modules-lib/bc-db-reader/src/lib.rs
@@ -40,7 +40,7 @@ pub mod traits;
 pub use durs_dbs_tools::kv_db_old::{
     from_db_value, KvFileDbRead as DbReadable, KvFileDbReader as Reader,
     KvFileDbRoHandler as BcDbRo, KvFileDbSchema, KvFileDbStoreType, KvFileDbValue as DbValue,
-    Readable as DbReader,
+    Readable as DbReader, WriteResp,
 };
 pub use durs_dbs_tools::DbError;
 #[cfg(feature = "mock")]
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 f6ac0313..260dc8b9 100644
--- a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs
+++ b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs
@@ -282,7 +282,7 @@ mod tests {
                 &vec![tx_doc.issuers()[0], tortue_pubkey],
                 false,
             )?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         db.write(|mut w| {
@@ -299,7 +299,7 @@ mod tests {
             )?;
             // Apply first g1 transaction
             apply_and_write_tx(&db, &mut w, &tx_doc, true)?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
         // Check new UTXOS
         // TODO
@@ -319,7 +319,7 @@ mod tests {
             } else {
                 panic!(dbg!("No block consumed sources"));
             }
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         // UTXOS must be empty
diff --git a/lib/modules/blockchain/bc-db-writer/src/lib.rs b/lib/modules/blockchain/bc-db-writer/src/lib.rs
index b48b1570..76dff17f 100644
--- a/lib/modules/blockchain/bc-db-writer/src/lib.rs
+++ b/lib/modules/blockchain/bc-db-writer/src/lib.rs
@@ -39,7 +39,7 @@ pub mod writers;
 
 pub use durs_dbs_tools::kv_db_old::{
     KvFileDbHandler, KvFileDbRead as DbReadable, KvFileDbRoHandler, KvFileDbSchema,
-    KvFileDbStoreType, KvFileDbValue, KvFileDbWriter as DbWriter,
+    KvFileDbStoreType, KvFileDbValue, KvFileDbWriter as DbWriter, WriteResp,
 };
 pub use durs_dbs_tools::{
     open_free_struct_db, open_free_struct_file_db, open_free_struct_memory_db,
diff --git a/lib/modules/blockchain/blockchain/src/dunp/receiver.rs b/lib/modules/blockchain/blockchain/src/dunp/receiver.rs
index dc969299..0a9678ed 100644
--- a/lib/modules/blockchain/blockchain/src/dunp/receiver.rs
+++ b/lib/modules/blockchain/blockchain/src/dunp/receiver.rs
@@ -136,7 +136,7 @@ pub fn receive_blocks(bc: &mut BlockchainModule, blocks: Vec<BlockDocument>) {
                     }
                 },
             }
-            Ok(w)
+            Ok(WriteResp::from(w))
         })
         .unwrap_or_else(|_| fatal_error!("Fail to check or apply block: {}.", blockstamp));
         bc.db = Some(db);
diff --git a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs
index e7dd9f76..72984cdf 100644
--- a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs
+++ b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs
@@ -133,7 +133,7 @@ mod tests {
                     },
                 )?;
             }
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         // Local blockchain must contain at least `fork_window_size +2` blocks
@@ -211,7 +211,7 @@ mod tests {
                     },
                 )?,
             );
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         // Must fork
@@ -287,7 +287,7 @@ mod tests {
                     )?,
                 );
             }
-            Ok(w)
+            Ok(WriteResp::from(w))
         })
     }
 }
diff --git a/lib/modules/blockchain/blockchain/src/fork/rollback.rs b/lib/modules/blockchain/blockchain/src/fork/rollback.rs
index 8b4cd210..e045220c 100644
--- a/lib/modules/blockchain/blockchain/src/fork/rollback.rs
+++ b/lib/modules/blockchain/blockchain/src/fork/rollback.rs
@@ -157,7 +157,7 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>)
             }
             durs_bc_db_writer::blocks::fork_tree::save_fork_tree(&db, &mut w, &bc.fork_tree)?;
 
-            Ok(w)
+            Ok(WriteResp::from(w))
         } else {
             Err(DbError::WriteAbort {
                 reason: "Abort rollback: new branch is invalid.".to_owned(),
diff --git a/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs b/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs
index 946afaed..b1ff85ad 100644
--- a/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs
+++ b/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs
@@ -77,12 +77,11 @@ pub fn apply_stackable_blocks(bc: &mut BlockchainModule) {
                         .expect("DB error : Fail to save fork tree !");
                         debug!("success to stackable_block({})", stackable_block_number);
 
-                        bc.current_blockstamp = stackable_block_blockstamp;
                         events::sent::send_event(
                             bc,
                             &BlockchainEvent::StackUpValidBlock(Box::new(new_current_block)),
                         );
-                        Ok(w)
+                        Ok(WriteResp::new(w, stackable_block_blockstamp))
                     }
                     Ok(re) => {
                         warn!(
@@ -105,8 +104,12 @@ pub fn apply_stackable_blocks(bc: &mut BlockchainModule) {
                 }
             });
             bc.db = Some(db);
+
             match db_write_result {
-                Ok(()) => continue 'blocks,
+                Ok(new_current_blockstamp) => {
+                    bc.current_blockstamp = new_current_blockstamp;
+                    continue 'blocks;
+                }
                 Err(e) => {
                     debug!(
                         "Invalid stackable block {}: {:?}",
diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs
index 4f009c35..ac7a7711 100644
--- a/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs
+++ b/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs
@@ -58,7 +58,7 @@ pub fn execute(
                                 fork_window_size,
                                 Some(target_blockstamp),
                             )?;
-                            Ok(w)
+                            Ok(WriteResp::from(w))
                         })
                         .expect("Fatal error : Fail to apply BlocksDBsWriteQuery !");
 
@@ -91,7 +91,7 @@ pub fn execute(
         info!("Save db...");
         db.write(|mut w| {
             durs_bc_db_writer::blocks::fork_tree::save_fork_tree(&db, &mut w, &fork_tree)?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })
         .unwrap_or_else(|_| fatal_error!("DB corrupted, please reset data."));
 
diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs b/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs
index 0d8b0f2b..46bfd528 100644
--- a/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs
+++ b/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs
@@ -29,7 +29,7 @@ use dubp_currency_params::{CurrencyName, CurrencyParameters};
 use dup_crypto::keys::PubKey;
 use durs_bc_db_reader::BcDbRead;
 use durs_bc_db_writer::writers::requests::WotsDBsWriteQuery;
-use durs_bc_db_writer::WotsV10DBs;
+use durs_bc_db_writer::{WotsV10DBs, WriteResp};
 use durs_common_tools::fatal_error;
 use durs_network_documents::url::Url;
 use durs_wot::data::rusty::RustyWebOfTrust;
@@ -122,7 +122,7 @@ impl BlockApplicator {
                     &self.wot_databases.wot_db,
                     &expire_certs,
                 );
-                Ok(w)
+                Ok(WriteResp::from(w))
             })
             .expect("Fail to apply valid block.");
             self.db = Some(db);
diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs
index 52ae0b28..19cd2961 100644
--- a/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs
+++ b/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs
@@ -40,7 +40,7 @@ pub fn execute(
             // Apply db request
             db.write(|mut w| {
                 req.apply(&db, &mut w, None, in_fork_window)?;
-                Ok(w)
+                Ok(WriteResp::from(w))
             })
             .expect("Fatal error : Fail to apply CurrencyDBsWriteQuery !");
             wait_begin = Instant::now();
diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs
index 2cb3c86b..1cef4417 100644
--- a/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs
+++ b/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs
@@ -38,7 +38,7 @@ pub fn execute(
                 SyncJobsMess::WotsDBsWriteQuery(blockstamp, currency_params, req) => {
                     db.write(|mut w| {
                         req.apply(&db, &mut w, &blockstamp, &currency_params.deref())?;
-                        Ok(w)
+                        Ok(WriteResp::from(w))
                     })
                     .unwrap_or_else(|_| {
                         fatal_error!("Fail to apply WotsDBsWriteQuery ({})", blockstamp)
diff --git a/lib/tests-tools/bc-db-tests-tools/src/mocks.rs b/lib/tests-tools/bc-db-tests-tools/src/mocks.rs
index e5742c3b..1323d846 100644
--- a/lib/tests-tools/bc-db-tests-tools/src/mocks.rs
+++ b/lib/tests-tools/bc-db-tests-tools/src/mocks.rs
@@ -20,7 +20,7 @@ use durs_bc_db_reader::blocks::fork_tree::ForkTree;
 use durs_bc_db_reader::blocks::BlockDb;
 use durs_bc_db_writer::blocks::{insert_new_fork_block, insert_new_head_block};
 use durs_bc_db_writer::current_metadata::update_current_metadata;
-use durs_bc_db_writer::{Db, DbError};
+use durs_bc_db_writer::{Db, DbError, WriteResp};
 
 /// Warning : This function does not update the indexes and considers
 /// that your block is valid (so chainable on the main chain).
@@ -42,7 +42,7 @@ pub fn insert_main_block(
                 expire_certs: None,
             },
         )?;
-        Ok(w)
+        Ok(WriteResp::from(w))
     })
 }
 
@@ -63,7 +63,7 @@ pub fn insert_fork_block(
                 expire_certs: None,
             },
         )?;
-        Ok(w)
+        Ok(WriteResp::from(w))
     })?;
     Ok(orphan)
 }
diff --git a/lib/tools/dbs-tools/src/kv_db_old.rs b/lib/tools/dbs-tools/src/kv_db_old.rs
index 5d4b0682..a061e687 100644
--- a/lib/tools/dbs-tools/src/kv_db_old.rs
+++ b/lib/tools/dbs-tools/src/kv_db_old.rs
@@ -7,7 +7,7 @@ mod file;
 pub use file::MockKvFileDbReader;
 pub use file::{
     from_db_value, KvFileDbHandler, KvFileDbRead, KvFileDbReader, KvFileDbRoHandler,
-    KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter,
+    KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter, WriteResp,
 };
 pub use rkv::{
     store::multi::Iter, IntegerStore, MultiIntegerStore, MultiStore,
diff --git a/lib/tools/dbs-tools/src/kv_db_old/file.rs b/lib/tools/dbs-tools/src/kv_db_old/file.rs
index 24ba05bb..cd38a926 100644
--- a/lib/tools/dbs-tools/src/kv_db_old/file.rs
+++ b/lib/tools/dbs-tools/src/kv_db_old/file.rs
@@ -410,18 +410,38 @@ impl KvFileDbHandler {
     }
     /// Write datas in database
     /// /!\ The written data are visible to readers but not persisted on the disk until a save() is performed.
-    pub fn write<F>(&self, f: F) -> Result<(), DbError>
+    pub fn write<D, F>(&self, f: F) -> Result<D, DbError>
     where
-        F: FnOnce(KvFileDbWriter) -> Result<KvFileDbWriter, DbError>,
+        F: FnOnce(KvFileDbWriter) -> Result<WriteResp<D>, DbError>,
     {
         f(KvFileDbWriter {
             buffer: Vec::with_capacity(0),
             writer: self.arc().read()?.write()?,
         })?
-        .writer
-        .commit()?;
+        .commit()
+    }
+}
 
-        Ok(())
+/// Write transaction response
+pub struct WriteResp<'w, D> {
+    writer: KvFileDbWriter<'w>,
+    datas: D,
+}
+
+impl<'w, D> WriteResp<'w, D> {
+    fn commit(self) -> Result<D, DbError> {
+        self.writer.writer.commit()?;
+        Ok(self.datas)
+    }
+    /// Instantiate WriteResp
+    pub fn new(writer: KvFileDbWriter<'w>, datas: D) -> WriteResp<'w, D> {
+        WriteResp { writer, datas }
+    }
+}
+
+impl<'w> From<KvFileDbWriter<'w>> for WriteResp<'w, ()> {
+    fn from(writer: KvFileDbWriter<'w>) -> WriteResp<'w, ()> {
+        WriteResp { writer, datas: () }
     }
 }
 
@@ -456,7 +476,7 @@ mod tests {
 
         db.write(|mut w| {
             store_test1.put(w.as_mut(), 3, &Value::Str("toto"))?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         let ro_db = KvFileDbRoHandler::open_db_ro(tmp_dir.path(), &schema)?;
@@ -468,7 +488,7 @@ mod tests {
 
         db.write(|mut w| {
             store_test1.put(w.as_mut(), 3, &Value::Str("titi"))?;
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         assert_eq!(
@@ -482,7 +502,7 @@ mod tests {
                 Some("titi".to_owned()),
                 get_int_store_str_val(&ro_db, "test1", 3)?
             );
-            Ok(w)
+            Ok(WriteResp::from(w))
         })?;
 
         let db_path = tmp_dir.path().to_owned();
-- 
GitLab