forked from OpenBazaar/spvwallet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scan_blocks.go
106 lines (99 loc) · 2.28 KB
/
scan_blocks.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package db
import (
"database/sql"
"fmt"
"github.com/scryinfo/wallet-interface"
"sync"
)
type ScanBlocksDB struct {
db *sql.DB
lock *sync.RWMutex
}
func (sbdb *ScanBlocksDB) Get(blockHash string) (wallet.ScanBlock, error) {
sbdb.lock.RLock()
defer sbdb.lock.RUnlock()
var sbs wallet.ScanBlock
stmt, err := sbdb.db.Prepare("select * from scanBlocks where blockHash=?")
if err != nil {
return sbs, err
}
defer stmt.Close()
var isFixScan int
var blockHeight int
err = stmt.QueryRow(blockHash).Scan(&blockHeight, &isFixScan)
if err != nil {
return sbs, err
}
sbs = wallet.ScanBlock{
BlockHash: blockHash,
BlockHeight: blockHeight,
IsFixScan: isFixScan,
}
return sbs, nil
}
func (sbdb *ScanBlocksDB) Put(blockHash string, blockHeight int, isFixScan int) error {
sbdb.lock.Lock()
defer sbdb.lock.Unlock()
tx, err := sbdb.db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("insert or replace into scanBlocks(blockHash, blockHeight, isFixScan) values(?,?,?)")
defer stmt.Close()
if err != nil {
tx.Rollback()
fmt.Println("err is ", err)
return err
}
_, err = stmt.Exec(blockHash, blockHeight, isFixScan)
if err != nil {
tx.Rollback()
return err
}
tx.Commit()
return nil
}
func (sbdb *ScanBlocksDB) UpdateBlock(blockHash string, isFixScan int) error {
sbdb.lock.Lock()
defer sbdb.lock.Unlock()
tx, err := sbdb.db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("update scanBlocks set isFixScan=? where blockHash=?")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(int(isFixScan), blockHash)
if err != nil {
tx.Rollback()
return err
}
tx.Commit()
return nil
}
func (sbdb *ScanBlocksDB) Delete(blockHash string) error {
sbdb.lock.Lock()
defer sbdb.lock.Unlock()
_, err := sbdb.db.Exec("delete from scanBlocks where blockHash=?", blockHash)
if err != nil {
return err
}
return nil
}
func (sbdb *ScanBlocksDB) GetLatestUnScanBlockHash() (string, error) {
sbdb.lock.RLock()
defer sbdb.lock.RUnlock()
var blockHash string
stmt, err := sbdb.db.Prepare("select scanBlocks.blockHash from scanBlocks where isFixScan=? limit 0,1")
if err != nil {
return blockHash, err
}
defer stmt.Close()
err = stmt.QueryRow(0).Scan(&blockHash)
if err != nil {
return blockHash, err
}
return blockHash, nil
}