-
Notifications
You must be signed in to change notification settings - Fork 0
/
transaction.go
121 lines (97 loc) · 3.78 KB
/
transaction.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package sqlite
import (
"database/sql"
"errors"
our_chain_rpc "github.com/leon123858/go-aid/service/rpc"
)
func BeginTx(client *Client) (tx *sql.Tx, err error) {
if client.Instance == nil {
return nil, client.Error()
}
return client.Instance.Begin()
}
func CommitTx(tx *sql.Tx) (err error) {
if tx == nil {
return errors.New("tx is nil")
}
return tx.Commit()
}
func RollbackTx(tx *sql.Tx) (err error) {
if tx == nil {
return errors.New("tx is nil")
}
return tx.Rollback()
}
func PrepareTx(tx *sql.Tx, sql string) (stmt *sql.Stmt, err error) {
if tx == nil {
return nil, errors.New("tx is nil")
}
return tx.Prepare(sql)
}
func ExecPrepare(stmt *sql.Stmt, args ...interface{}) (result sql.Result, err error) {
if stmt == nil {
return nil, errors.New("stmt is nil")
}
return stmt.Exec(args...)
}
func UtxoCreatePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "INSERT INTO utxo(id, vout, address, amount, is_spent, block_height) VALUES(?, ?, ?, ?, ?, ?)")
}
func UtxoUpdatePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "UPDATE utxo SET is_spent = ? WHERE id = ? AND vout = ?")
}
func UtxoDeletePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "DELETE FROM utxo WHERE block_height = ?")
}
func UtxoCreateExec(stmt *sql.Stmt, item Utxo) (result sql.Result, err error) {
return ExecPrepare(stmt, item.ID, item.Vout, item.Address, item.Amount, item.IsSpent, item.BlockHeight)
}
// UtxoUpdateExec only need item.IsSpent, ID, Vout now
func UtxoUpdateExec(stmt *sql.Stmt, item Utxo) (result sql.Result, err error) {
return ExecPrepare(stmt, item.IsSpent, item.ID, item.Vout)
}
// UtxoDeleteExec only need item.BlockHeight now
func UtxoDeleteExec(stmt *sql.Stmt, item Utxo) (result sql.Result, err error) {
return ExecPrepare(stmt, item.BlockHeight)
}
func BlockCreatePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "INSERT INTO block(height, hash) VALUES(?, ?)")
}
func BlockCreateExec(stmt *sql.Stmt, item Block) (result sql.Result, err error) {
return ExecPrepare(stmt, item.Height, item.Hash)
}
func BlockDeletePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "DELETE FROM block WHERE height = ?")
}
// BlockDeleteExec only need item.Height now
func BlockDeleteExec(stmt *sql.Stmt, item Block) (result sql.Result, err error) {
return ExecPrepare(stmt, item.Height)
}
func TxCreatePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "INSERT INTO tx(txid, pre_txid, pre_vout) VALUES(?, ?, ?)")
}
func TxCreateExec(stmt *sql.Stmt, pre PreUtxo) (result sql.Result, err error) {
return ExecPrepare(stmt, pre.TxID, pre.PreTxID, pre.PreVout)
}
func TxDeletePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "DELETE FROM tx WHERE txid = ?")
}
// TxDeleteExec only need item.TxID now
func TxDeleteExec(stmt *sql.Stmt, item PreUtxo) (result sql.Result, err error) {
return ExecPrepare(stmt, item.TxID)
}
func ContractCreatePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "INSERT INTO contract(txid, contract_address, contract_action, contract_protocol, contract_version) VALUES(?, ?, ?, ?, ?)")
}
func ContractCreateExec(stmt *sql.Stmt, item Contract) (result sql.Result, err error) {
if item.ContractAction == our_chain_rpc.ContractNotExist {
return ExecPrepare(stmt, item.TxID, sql.NullString{}, item.ContractAction, sql.NullString{}, sql.NullString{})
}
return ExecPrepare(stmt, item.TxID, item.ContractAddress, item.ContractAction, item.ContractProtocol, item.ContractVersion)
}
func ContractDeletePrepare(tx *sql.Tx) (stmt *sql.Stmt, err error) {
return PrepareTx(tx, "DELETE FROM contract WHERE txid = ?")
}
func ContractDeleteExec(stmt *sql.Stmt, item Contract) (result sql.Result, err error) {
return ExecPrepare(stmt, item.TxID)
}