@@ -12,16 +12,27 @@ import (
12
12
13
13
// SaveAccount saves the given account information for the given block height and timestamp
14
14
func (db BigDipperDb ) SaveAccount (account exported.Account , height int64 , timestamp time.Time ) error {
15
- accStmt := `INSERT INTO account (address) VALUES ($1) ON CONFLICT DO NOTHING`
16
- _ , err := db .Sql .Exec (accStmt , account .GetAddress ().String ())
15
+ stmt := `INSERT INTO account (address) VALUES ($1) ON CONFLICT DO NOTHING`
16
+ _ , err := db .Sql .Exec (stmt , account .GetAddress ().String ())
17
17
if err != nil {
18
18
return err
19
19
}
20
20
21
- balStmt := `INSERT INTO balance (address, coins, height, timestamp)
22
- VALUES ($1, $2::coin[], $3, $4) ON CONFLICT DO NOTHING`
23
- _ , err = db .Sql .Exec (balStmt ,
24
- account .GetAddress ().String (), pq .Array (dbtypes .NewDbCoins (account .GetCoins ())), height , timestamp )
21
+ coins := pq .Array (dbtypes .NewDbCoins (account .GetCoins ()))
22
+
23
+ stmt = `
24
+ INSERT INTO account_balance (address, coins)
25
+ VALUES ($1, $2)
26
+ ON CONFLICT (address) DO UPDATE SET coins = excluded.coins`
27
+ _ , err = db .Sql .Exec (stmt , account .GetAddress ().String (), coins )
28
+ if err != nil {
29
+ return err
30
+ }
31
+
32
+ stmt = `
33
+ INSERT INTO account_balance_history (address, coins, height, timestamp)
34
+ VALUES ($1, $2::coin[], $3, $4) ON CONFLICT DO NOTHING`
35
+ _ , err = db .Sql .Exec (stmt , account .GetAddress ().String (), coins , height , timestamp )
25
36
return err
26
37
}
27
38
@@ -32,36 +43,57 @@ func (db BigDipperDb) SaveAccounts(accounts []exported.Account, height int64, ti
32
43
return nil
33
44
}
34
45
35
- accountsStmt := "INSERT INTO account (address) VALUES "
36
- var accountParams []interface {}
46
+ accQry := `INSERT INTO account (address) VALUES `
47
+ var accParams []interface {}
48
+
49
+ balQry := `INSERT INTO account_balance (address, coins) VALUES `
50
+ var balParams []interface {}
37
51
38
- balancesStmt := " INSERT INTO balance (address, coins, height, timestamp) VALUES "
39
- var balanceParams []interface {}
52
+ balHisQry := ` INSERT INTO account_balance_history (address, coins, height, timestamp) VALUES `
53
+ var bHisParams []interface {}
40
54
41
55
for i , account := range accounts {
42
- a1 := i * 1 // Starting position for
43
- b1 := i * 4 // Starting position for balances insertion
56
+ ai := i * 1
57
+ accQry += fmt .Sprintf ("($%d)," , ai + 1 )
58
+ accParams = append (accParams , account .GetAddress ().String ())
44
59
45
- accountsStmt += fmt .Sprintf ("($%d)," , a1 + 1 )
46
- accountParams = append (accountParams , account .GetAddress ().String ())
60
+ coins := pq .Array (dbtypes .NewDbCoins (account .GetCoins ()))
47
61
48
- balancesStmt += fmt .Sprintf ("($%d,$%d,$%d,$%d)," , b1 + 1 , b1 + 2 , b1 + 3 , b1 + 4 )
49
- balanceParams = append (balanceParams ,
50
- account .GetAddress ().String (), pq .Array (dbtypes .NewDbCoins (account .GetCoins ())), height , timestamp )
62
+ bi := i * 2
63
+ balQry += fmt .Sprintf ("($%d, $%d)," , bi + 1 , bi + 2 )
64
+ balParams = append (balParams , account .GetAddress ().String (), coins )
65
+
66
+ bHi := i * 4
67
+ balHisQry += fmt .Sprintf ("($%d,$%d,$%d,$%d)," , bHi + 1 , bHi + 2 , bHi + 3 , bHi + 4 )
68
+ bHisParams = append (bHisParams , account .GetAddress ().String (), coins , height , timestamp )
51
69
}
52
70
53
71
// Store the accounts
54
- accountsStmt = accountsStmt [:len (accountsStmt )- 1 ] // Remove trailing ","
55
- accountsStmt += " ON CONFLICT DO NOTHING"
56
- _ , err := db .Sql .Exec (accountsStmt , accountParams ... )
72
+ accQry = accQry [:len (accQry )- 1 ] // Remove trailing ","
73
+ accQry += " ON CONFLICT (address) DO NOTHING"
74
+ _ , err := db .Sql .Exec (accQry , accParams ... )
75
+ if err != nil {
76
+ return err
77
+ }
78
+
79
+ // Remove all the existing balances
80
+ _ , err = db .Sql .Exec (`DELETE FROM account_balance WHERE TRUE` )
81
+ if err != nil {
82
+ return err
83
+ }
84
+
85
+ // Insert the current balances
86
+ balQry = balQry [:len (balQry )- 1 ] // Remove trailing ","
87
+ balQry += " ON CONFLICT (address) DO NOTHING"
88
+ _ , err = db .Sql .Exec (balQry , balParams ... )
57
89
if err != nil {
58
90
return err
59
91
}
60
92
61
- // Store the balances
62
- balancesStmt = balancesStmt [:len (balancesStmt )- 1 ] // Remove trailing ","
63
- balancesStmt += " ON CONFLICT DO NOTHING"
64
- _ , err = db .Sql .Exec (balancesStmt , balanceParams ... )
93
+ // Store the balances histories
94
+ balHisQry = balHisQry [:len (balHisQry )- 1 ] // Remove trailing ","
95
+ balHisQry += " ON CONFLICT (address, height) DO NOTHING"
96
+ _ , err = db .Sql .Exec (balHisQry , bHisParams ... )
65
97
return err
66
98
}
67
99
0 commit comments