]> Untitled Git - bdk/commitdiff
[wip] Ensure there are no duplicated script_pubkeys in sqlite
authorAlekos Filini <alekos.filini@gmail.com>
Sat, 26 Nov 2022 13:52:49 +0000 (14:52 +0100)
committerAlekos Filini <alekos.filini@gmail.com>
Sat, 26 Nov 2022 14:04:34 +0000 (15:04 +0100)
Add a `UNIQUE` constraint on the script_pubkeys table so that it doesn't
grow constantly when caching new addresses.

Fixes #801

src/database/sqlite.rs

index a8061984f2bf0588b052bd2f8d8e1edfd266a4d3..68285605f477e9722ab8bb247b5b8c728722d81c 100644 (file)
@@ -57,7 +57,10 @@ static MIGRATIONS: &[&str] = &[
     "CREATE TABLE utxos (value INTEGER, keychain TEXT, vout INTEGER, txid BLOB, script BLOB, is_spent BOOLEAN DEFAULT 0);",
     "INSERT INTO utxos SELECT value, keychain, vout, txid, script, is_spent FROM utxos_old;",
     "DROP TABLE utxos_old;",
-    "CREATE UNIQUE INDEX idx_utxos_txid_vout ON utxos(txid, vout);"
+    "CREATE UNIQUE INDEX idx_utxos_txid_vout ON utxos(txid, vout);",
+    // Fix issue https://github.com/bitcoindevkit/bdk/issues/801: drop duplicated script_pubkeys
+    // TODO "",
+    "CREATE UNIQUE INDEX idx_script_pks_unique ON script_pubkeys(keychain, child);",
 ];
 
 /// Sqlite database stored on filesystem
@@ -88,7 +91,7 @@ impl SqliteDatabase {
         child: u32,
         script: &[u8],
     ) -> Result<i64, Error> {
-        let mut statement = self.connection.prepare_cached("INSERT INTO script_pubkeys (keychain, child, script) VALUES (:keychain, :child, :script)")?;
+        let mut statement = self.connection.prepare_cached("INSERT OR REPLACE INTO script_pubkeys (keychain, child, script) VALUES (:keychain, :child, :script)")?;
         statement.execute(named_params! {
             ":keychain": keychain,
             ":child": child,