/
saver.go
80 lines (69 loc) · 2.06 KB
/
saver.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
// SPDX-FileCopyrightText: 2021 The margaret Authors
//
// SPDX-License-Identifier: MIT
package sqlite
import (
"database/sql"
"encoding/hex"
"fmt"
"github.com/pkg/errors"
"go.cryptoscope.co/margaret/internal/persist"
)
func (s SqliteSaver) Put(key persist.Key, data []byte) error {
hexKey := hex.EncodeToString(key)
_, err := s.db.Exec(`insert or replace into persisted_roaring (key,data) VALUES(?,?)`, hexKey, data)
if err != nil {
return errors.Wrap(err, "sqlite/put: failed run delete/insert value")
}
return nil
}
func (s SqliteSaver) PutMultiple(values []persist.KeyValuePair) error {
for i, kv := range values {
err := s.Put(kv.Key, kv.Value)
if err != nil {
return fmt.Errorf("persist/seqlite: failed to put entry %d of %d (%s): %w", i, len(values), kv.Key, err)
}
}
return nil
}
func (s SqliteSaver) Get(key persist.Key) ([]byte, error) {
var data []byte
hexKey := hex.EncodeToString(key)
err := s.db.QueryRow(`SELECT data from persisted_roaring where key = ?`, hexKey).Scan(&data)
if err != nil {
if err == sql.ErrNoRows {
return nil, persist.ErrNotFound
}
return nil, errors.Wrapf(err, "persist/sqlite/get(%s): failed to execute query", hexKey[:5])
}
return data, nil
}
func (s SqliteSaver) List() ([]persist.Key, error) {
var keys []persist.Key
rows, err := s.db.Query(`SELECT key from persisted_roaring`)
if err != nil {
return nil, errors.Wrap(err, "persist/sqlite/list: failed to execute rows query")
}
defer rows.Close()
for rows.Next() {
var k string
err := rows.Scan(&k)
if err != nil {
return nil, errors.Wrap(err, "persist/sqlite/list: failed to scan row result")
}
bk, err := hex.DecodeString(k)
if err != nil {
return nil, errors.Wrapf(err, "persist/sqlite/list: invalid key: %q", k)
}
keys = append(keys, bk)
}
return keys, rows.Err()
}
func (s SqliteSaver) Delete(k persist.Key) error {
hexKey := hex.EncodeToString(k)
_, err := s.db.Exec(`DELETE FROM persisted_roaring WHERE key = ?`, hexKey)
if err != nil {
return errors.Wrapf(err, "sqlite/delete: failed run delete key %q", hexKey)
}
return nil
}