skoupidi 1 год назад
Родитель
Сommit
ba8d8e22ab
1 измененных файлов с 27 добавлено и 7 удалено
  1. 27 7
      bin/drk/src/walletdb.rs

+ 27 - 7
bin/drk/src/walletdb.rs

@@ -312,26 +312,43 @@ impl WalletDb {
         Ok(())
         Ok(())
     }
     }
 
 
-    /// Auxiliary function to retrieve caches inverse queries into an single execution block.
+    /// Auxiliary function to retrieve cached inverse queries into a single SQL execution block.
     /// The final query will contain the queries in reverse order, and cache is cleared afterwards.
     /// The final query will contain the queries in reverse order, and cache is cleared afterwards.
-    pub fn grab_inverse_block(&self) -> WalletDbResult<String> {
-        debug!(target: "walletdb::grab_inverse_block", "[WalletDb] Grabbing cached inversed quirie");
-        let Ok(mut cache) = self.inverse_cache.lock() else {
+    pub fn grab_inverse_cache_block(&self) -> WalletDbResult<String> {
+        // Grab cache lock
+        debug!(target: "walletdb::grab_inverse_block", "[WalletDb] Grabbing cached inverse queries");
+        let Ok(cache) = self.inverse_cache.lock() else {
             return Err(WalletDbError::FailedToAquireLock)
             return Err(WalletDbError::FailedToAquireLock)
         };
         };
 
 
+        // Build the full SQL block query
         let mut inverse_batch = String::from("BEGIN;");
         let mut inverse_batch = String::from("BEGIN;");
         for query in cache.iter().rev() {
         for query in cache.iter().rev() {
             inverse_batch += query;
             inverse_batch += query;
         }
         }
         inverse_batch += "END;";
         inverse_batch += "END;";
 
 
-        // Clear cache and drop the lock
-        *cache = vec![];
+        // Drop the lock
         drop(cache);
         drop(cache);
 
 
         Ok(inverse_batch)
         Ok(inverse_batch)
     }
     }
+
+    /// Auxiliary function to clear inverse queries cache.
+    pub fn clear_inverse_cache(&self) -> WalletDbResult<()> {
+        // Grab cache lock
+        let Ok(mut cache) = self.inverse_cache.lock() else {
+            return Err(WalletDbError::FailedToAquireLock)
+        };
+
+        // Clear cache
+        *cache = vec![];
+
+        // Drop the lock
+        drop(cache);
+
+        Ok(())
+    }
 }
 }
 
 
 /// Custom implementation of rusqlite::named_params! to use `expr` instead of `literal` as `$param_name`,
 /// Custom implementation of rusqlite::named_params! to use `expr` instead of `literal` as `$param_name`,
@@ -692,9 +709,12 @@ mod tests {
         assert!(!rows.is_empty());
         assert!(!rows.is_empty());
 
 
         // We are now going to rollback the wallet changes
         // We are now going to rollback the wallet changes
-        let rollback_query = wallet.grab_inverse_block().unwrap();
+        let rollback_query = wallet.grab_inverse_cache_block().unwrap();
         wallet.exec_batch_sql(&rollback_query).unwrap();
         wallet.exec_batch_sql(&rollback_query).unwrap();
 
 
+        // Clear cache
+        wallet.clear_inverse_cache().unwrap();
+
         // Verify database is empty again
         // Verify database is empty again
         let rows = wallet.query_multiple(table, &[key_col], &[]).unwrap();
         let rows = wallet.query_multiple(table, &[key_col], &[]).unwrap();
         assert!(rows.is_empty());
         assert!(rows.is_empty());