-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
database.go
123 lines (107 loc) · 2.64 KB
/
database.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
122
123
package ocrbootstrap
import (
"context"
"database/sql"
"github.com/lib/pq"
"github.com/pkg/errors"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"github.com/smartcontractkit/chainlink/v2/core/logger"
)
type db struct {
*sql.DB
oracleSpecID int32
lggr logger.Logger
}
var _ ocrtypes.ConfigDatabase = &db{}
// NewDB returns a new DB scoped to this oracleSpecID
func NewDB(sqldb *sql.DB, bootstrapSpecID int32, lggr logger.Logger) *db {
return &db{sqldb, bootstrapSpecID, lggr}
}
func (d *db) ReadConfig(ctx context.Context) (c *ocrtypes.ContractConfig, err error) {
q := d.QueryRowContext(ctx, `
SELECT
config_digest,
config_count,
signers,
transmitters,
f,
onchain_config,
offchain_config_version,
offchain_config
FROM bootstrap_contract_configs
WHERE bootstrap_spec_id = $1
LIMIT 1`, d.oracleSpecID)
c = new(ocrtypes.ContractConfig)
digest := []byte{}
signers := [][]byte{}
transmitters := [][]byte{}
err = q.Scan(
&digest,
&c.ConfigCount,
(*pq.ByteaArray)(&signers),
(*pq.ByteaArray)(&transmitters),
&c.F,
&c.OnchainConfig,
&c.OffchainConfigVersion,
&c.OffchainConfig,
)
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
} else if err != nil {
return nil, errors.Wrap(err, "ReadConfig failed")
}
copy(c.ConfigDigest[:], digest)
c.Signers = []ocrtypes.OnchainPublicKey{}
for _, s := range signers {
c.Signers = append(c.Signers, s)
}
c.Transmitters = []ocrtypes.Account{}
for _, t := range transmitters {
transmitter := ocrtypes.Account(t)
c.Transmitters = append(c.Transmitters, transmitter)
}
return
}
func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error {
var signers [][]byte
for _, s := range c.Signers {
signers = append(signers, []byte(s))
}
_, err := d.ExecContext(ctx, `
INSERT INTO bootstrap_contract_configs (
bootstrap_spec_id,
config_digest,
config_count,
signers,
transmitters,
f,
onchain_config,
offchain_config_version,
offchain_config,
created_at,
updated_at
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW())
ON CONFLICT (bootstrap_spec_id) DO UPDATE SET
config_digest = EXCLUDED.config_digest,
config_count = EXCLUDED.config_count,
signers = EXCLUDED.signers,
transmitters = EXCLUDED.transmitters,
f = EXCLUDED.f,
onchain_config = EXCLUDED.onchain_config,
offchain_config_version = EXCLUDED.offchain_config_version,
offchain_config = EXCLUDED.offchain_config,
updated_at = NOW()
`,
d.oracleSpecID,
c.ConfigDigest,
c.ConfigCount,
pq.ByteaArray(signers),
c.Transmitters,
c.F,
c.OnchainConfig,
c.OffchainConfigVersion,
c.OffchainConfig,
)
return errors.Wrap(err, "WriteConfig failed")
}