-
Notifications
You must be signed in to change notification settings - Fork 0
/
dataStore.go
101 lines (84 loc) · 1.94 KB
/
dataStore.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
package durcov
import (
"errors"
"github.com/jackc/pgx"
)
// DataStore describes an API to store expected data
type DataStore interface {
SetDBConnection(pgxpool *pgx.ConnPool)
StoreData(data *Data) error
}
// CovidDataStore represents a connection API to store expected Covid data
type CovidDataStore struct {
pgxpool *pgx.ConnPool
}
// SetDBConnection sets the connection to the backing database.
// Must be set before calling StoreData
func (c *CovidDataStore) SetDBConnection(pgxpool *pgx.ConnPool) {
c.pgxpool = pgxpool
}
// StoreData stores given data in the database,
// Note: StoreData overwrites existing data in the database.
func (c *CovidDataStore) StoreData(data *Data) error {
if c.pgxpool == nil {
return errors.New("Database connection not set on data store")
}
tx, err := c.pgxpool.Begin()
if err != nil {
return err
}
defer tx.Rollback()
_, err = tx.Exec("TRUNCATE covid_stats")
if err != nil {
return err
}
err = storeBatchCovidData(tx, data)
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
return err
}
return nil
}
func storeBatchCovidData(tx *pgx.Tx, data *Data) error {
source := [][]interface{}{}
globalData := []interface{}{
"GLOBAL",
"Global",
"global",
data.global.stats.totalConfirmed,
data.global.stats.totalDeaths,
data.global.stats.totalRecovered,
data.global.stats.date,
}
source = append(source, globalData)
for _, country := range data.countries {
countryData := []interface{}{
country.code,
country.name,
country.slug,
country.stats.totalConfirmed,
country.stats.totalDeaths,
country.stats.totalRecovered,
country.stats.date,
}
source = append(source, countryData)
}
tableName := pgx.Identifier{"covid_stats"}
columns := []string{
"id",
"name",
"slug",
"confirmed",
"deaths",
"recovered",
"collected_at",
}
_, err := tx.CopyFrom(tableName, columns, pgx.CopyFromRows(source))
if err != nil {
return err
}
return nil
}