From c51d544932a666851c39f79a517e2e0a1e783b05 Mon Sep 17 00:00:00 2001 From: Alekos Filini Date: Sat, 26 Nov 2022 14:52:49 +0100 Subject: [PATCH] [wip] Ensure there are no duplicated script_pubkeys in sqlite 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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/database/sqlite.rs b/src/database/sqlite.rs index a8061984f..68285605f 100644 --- a/src/database/sqlite.rs +++ b/src/database/sqlite.rs @@ -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 { - 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,