Procházet zdrojové kódy

Fix kv_list range query to properly iterate by namespace

Replace the invalid range end marker "\u{10FFFF}" with an open-ended range that
breaks when the namespace prefix changes. This correctly iterates only keys
within the specified namespace.
Cesar Rodas před 1 měsícem
rodič
revize
b65629bf17
1 změnil soubory, kde provedl 11 přidání a 9 odebrání
  1. 11 9
      crates/cdk-redb/src/wallet/mod.rs

+ 11 - 9
crates/cdk-redb/src/wallet/mod.rs

@@ -569,14 +569,15 @@ impl KVStoreDatabase for WalletRedbDatabase {
         let mut keys = Vec::new();
 
         // Use range iterator for efficient lookup by namespace prefix
-        // Range from (primary, secondary, "") to (primary, secondary, "\u{10FFFF}") to get all keys in this namespace
         let start = (primary_namespace, secondary_namespace, "");
-        let end = (primary_namespace, secondary_namespace, "\u{10FFFF}");
 
-        for result in table.range(start..=end).map_err(Error::from)? {
+        for result in table.range(start..).map_err(Error::from)? {
             let (key_tuple, _) = result.map_err(Error::from)?;
-            let (_primary, _secondary, k) = key_tuple.value();
-            keys.push(k.to_string());
+            let (primary_from_db, secondary_from_db, key) = key_tuple.value();
+            if primary_from_db != primary_namespace || secondary_from_db != secondary_namespace {
+                break;
+            }
+            keys.push(key.to_string());
         }
 
         // Keys are already sorted by the B-tree structure
@@ -1165,13 +1166,14 @@ impl KVStoreTransaction<database::Error> for RedbWalletTransaction {
         let mut keys = Vec::new();
 
         // Use range iterator for efficient lookup by namespace prefix
-        // Range from (primary, secondary, "") to (primary, secondary, "\u{10FFFF}") to get all keys in this namespace
         let start = (primary_namespace, secondary_namespace, "");
-        let end = (primary_namespace, secondary_namespace, "\u{10FFFF}");
 
-        for result in table.range(start..=end).map_err(Error::from)? {
+        for result in table.range(start..).map_err(Error::from)? {
             let (key_tuple, _) = result.map_err(Error::from)?;
-            let (_primary, _secondary, k) = key_tuple.value();
+            let (primary_from_db, secondary_from_db, k) = key_tuple.value();
+            if primary_from_db != primary_namespace || secondary_from_db != secondary_namespace {
+                break;
+            }
             keys.push(k.to_string());
         }