forked from stellar/go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
queries_trade.go
88 lines (70 loc) · 2.12 KB
/
queries_trade.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
package tickerdb
import (
"math"
"strings"
"time"
)
// BulkInsertTrades inserts a slice of trades in the database. Trades
// that are already in the database (i.e. millennium_id already exists)
// are ignored.
func (s *TickerSession) BulkInsertTrades(trades []Trade) (err error) {
if len(trades) <= 50 {
return performInsertTrades(s, trades)
}
chunks := chunkifyDBTrades(trades, 50)
for _, chunk := range chunks {
err = performInsertTrades(s, chunk)
if err != nil {
return
}
}
return
}
// GetLastTrade returns the newest Trade object in the database.
func (s *TickerSession) GetLastTrade() (trade Trade, err error) {
err = s.GetRaw(&trade, "SELECT * FROM trades ORDER BY ledger_close_time DESC LIMIT 1")
return
}
// DeleteOldTrades deletes trades in the database older than minDate.
func (s *TickerSession) DeleteOldTrades(minDate time.Time) error {
_, err := s.ExecRaw("DELETE FROM trades WHERE ledger_close_time < ?", minDate)
return err
}
// chunkifyDBTrades transforms a slice into a slice of chunks (also slices) of chunkSize
// e.g.: Chunkify([b, c, d, e, f], 2) = [[b c] [d e] [f]]
func chunkifyDBTrades(sl []Trade, chunkSize int) [][]Trade {
var chunkedSlice [][]Trade
numChunks := int(math.Ceil(float64(len(sl)) / float64(chunkSize)))
start := 0
length := len(sl)
for i := 0; i < numChunks; i++ {
end := start + chunkSize
if end > length {
end = length
}
chunk := sl[start:end]
chunkedSlice = append(chunkedSlice, chunk)
start = end
}
return chunkedSlice
}
func performInsertTrades(s *TickerSession, trades []Trade) (err error) {
var t Trade
var placeholders string
var dbValues []interface{}
dbFields := getDBFieldTags(t, true)
dbFieldsString := strings.Join(dbFields, ", ")
for i, trade := range trades {
v := getDBFieldValues(trade, true)
placeholders += "(" + generatePlaceholders(v) + ")"
dbValues = append(dbValues, v...)
if i != len(trades)-1 {
placeholders += ","
}
}
qs := "INSERT INTO trades (" + dbFieldsString + ")"
qs += " VALUES " + placeholders
qs += " ON CONFLICT ON CONSTRAINT trades_millennium_id_key DO NOTHING;"
_, err = s.ExecRaw(qs, dbValues...)
return
}