@@ -35,7 +35,8 @@ static MIGRATIONS: &[&str] = &[
35
35
"CREATE UNIQUE INDEX idx_indices_keychain ON last_derivation_indices(keychain);" ,
36
36
"CREATE TABLE checksums (keychain TEXT, checksum BLOB);" ,
37
37
"CREATE INDEX idx_checksums_keychain ON checksums(keychain);" ,
38
- "CREATE TABLE sync_time (id INTEGER PRIMARY KEY, height INTEGER, timestamp INTEGER);"
38
+ "CREATE TABLE sync_time (id INTEGER PRIMARY KEY, height INTEGER, timestamp INTEGER);" ,
39
+ "ALTER TABLE utxos ADD COLUMN is_spent_unconfirmed;" ,
39
40
] ;
40
41
41
42
/// Sqlite database stored on filesystem
@@ -79,14 +80,16 @@ impl SqliteDatabase {
79
80
vout : u32 ,
80
81
txid : & [ u8 ] ,
81
82
script : & [ u8 ] ,
83
+ is_spent_unconfirmed : bool ,
82
84
) -> Result < i64 , Error > {
83
- let mut statement = self . connection . prepare_cached ( "INSERT INTO utxos (value, keychain, vout, txid, script) VALUES (:value, :keychain, :vout, :txid, :script)" ) ?;
85
+ let mut statement = self . connection . prepare_cached ( "INSERT INTO utxos (value, keychain, vout, txid, script, is_spent_unconfirmed ) VALUES (:value, :keychain, :vout, :txid, :script, :is_spent_unconfirmed )" ) ?;
84
86
statement. execute ( named_params ! {
85
87
":value" : value,
86
88
":keychain" : keychain,
87
89
":vout" : vout,
88
90
":txid" : txid,
89
- ":script" : script
91
+ ":script" : script,
92
+ ":is_spent_unconfirmed" : is_spent_unconfirmed,
90
93
} ) ?;
91
94
92
95
Ok ( self . connection . last_insert_rowid ( ) )
@@ -287,9 +290,9 @@ impl SqliteDatabase {
287
290
}
288
291
289
292
fn select_utxos ( & self ) -> Result < Vec < LocalUtxo > , Error > {
290
- let mut statement = self
291
- . connection
292
- . prepare_cached ( "SELECT value, keychain, vout, txid, script FROM utxos" ) ?;
293
+ let mut statement = self . connection . prepare_cached (
294
+ "SELECT value, keychain, vout, txid, script, is_spent_unconfirmed FROM utxos" ,
295
+ ) ?;
293
296
let mut utxos: Vec < LocalUtxo > = vec ! [ ] ;
294
297
let mut rows = statement. query ( [ ] ) ?;
295
298
while let Some ( row) = rows. next ( ) ? {
@@ -298,6 +301,7 @@ impl SqliteDatabase {
298
301
let vout = row. get ( 2 ) ?;
299
302
let txid: Vec < u8 > = row. get ( 3 ) ?;
300
303
let script: Vec < u8 > = row. get ( 4 ) ?;
304
+ let is_spent_unconfirmed: bool = row. get ( 5 ) ?;
301
305
302
306
let keychain: KeychainKind = serde_json:: from_str ( & keychain) ?;
303
307
@@ -308,19 +312,16 @@ impl SqliteDatabase {
308
312
script_pubkey : script. into ( ) ,
309
313
} ,
310
314
keychain,
315
+ is_spent_unconfirmed,
311
316
} )
312
317
}
313
318
314
319
Ok ( utxos)
315
320
}
316
321
317
- fn select_utxo_by_outpoint (
318
- & self ,
319
- txid : & [ u8 ] ,
320
- vout : u32 ,
321
- ) -> Result < Option < ( u64 , KeychainKind , Script ) > , Error > {
322
+ fn select_utxo_by_outpoint ( & self , txid : & [ u8 ] , vout : u32 ) -> Result < Option < LocalUtxo > , Error > {
322
323
let mut statement = self . connection . prepare_cached (
323
- "SELECT value, keychain, script FROM utxos WHERE txid=:txid AND vout=:vout" ,
324
+ "SELECT value, keychain, script, is_spent_unconfirmed FROM utxos WHERE txid=:txid AND vout=:vout" ,
324
325
) ?;
325
326
let mut rows = statement. query ( named_params ! { ":txid" : txid, ":vout" : vout} ) ?;
326
327
match rows. next ( ) ? {
@@ -329,9 +330,18 @@ impl SqliteDatabase {
329
330
let keychain: String = row. get ( 1 ) ?;
330
331
let keychain: KeychainKind = serde_json:: from_str ( & keychain) ?;
331
332
let script: Vec < u8 > = row. get ( 2 ) ?;
332
- let script: Script = script. into ( ) ;
333
+ let script_pubkey: Script = script. into ( ) ;
334
+ let is_spent_unconfirmed: bool = row. get ( 3 ) ?;
333
335
334
- Ok ( Some ( ( value, keychain, script) ) )
336
+ Ok ( Some ( LocalUtxo {
337
+ outpoint : OutPoint :: new ( deserialize ( & txid) ?, vout) ,
338
+ txout : TxOut {
339
+ value,
340
+ script_pubkey,
341
+ } ,
342
+ keychain,
343
+ is_spent_unconfirmed,
344
+ } ) )
335
345
}
336
346
None => Ok ( None ) ,
337
347
}
@@ -624,6 +634,7 @@ impl BatchOperations for SqliteDatabase {
624
634
utxo. outpoint . vout ,
625
635
& utxo. outpoint . txid ,
626
636
utxo. txout . script_pubkey . as_bytes ( ) ,
637
+ utxo. is_spent_unconfirmed ,
627
638
) ?;
628
639
Ok ( ( ) )
629
640
}
@@ -698,16 +709,9 @@ impl BatchOperations for SqliteDatabase {
698
709
699
710
fn del_utxo ( & mut self , outpoint : & OutPoint ) -> Result < Option < LocalUtxo > , Error > {
700
711
match self . select_utxo_by_outpoint ( & outpoint. txid , outpoint. vout ) ? {
701
- Some ( ( value , keychain , script_pubkey ) ) => {
712
+ Some ( local_utxo ) => {
702
713
self . delete_utxo_by_outpoint ( & outpoint. txid , outpoint. vout ) ?;
703
- Ok ( Some ( LocalUtxo {
704
- outpoint : * outpoint,
705
- txout : TxOut {
706
- value,
707
- script_pubkey,
708
- } ,
709
- keychain,
710
- } ) )
714
+ Ok ( Some ( local_utxo) )
711
715
}
712
716
None => Ok ( None ) ,
713
717
}
@@ -836,17 +840,7 @@ impl Database for SqliteDatabase {
836
840
}
837
841
838
842
fn get_utxo ( & self , outpoint : & OutPoint ) -> Result < Option < LocalUtxo > , Error > {
839
- match self . select_utxo_by_outpoint ( & outpoint. txid , outpoint. vout ) ? {
840
- Some ( ( value, keychain, script_pubkey) ) => Ok ( Some ( LocalUtxo {
841
- outpoint : * outpoint,
842
- txout : TxOut {
843
- value,
844
- script_pubkey,
845
- } ,
846
- keychain,
847
- } ) ) ,
848
- None => Ok ( None ) ,
849
- }
843
+ self . select_utxo_by_outpoint ( & outpoint. txid , outpoint. vout )
850
844
}
851
845
852
846
fn get_raw_tx ( & self , txid : & Txid ) -> Result < Option < Transaction > , Error > {
0 commit comments