-
Notifications
You must be signed in to change notification settings - Fork 3
/
badger.go
80 lines (73 loc) · 1.75 KB
/
badger.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
package backend
import (
"github.com/dgraph-io/badger/v4"
"github.com/go-json-experiment/json"
"github.com/pkg/errors"
"net/url"
"time"
)
type badgerdb struct {
ttl time.Duration
db *badger.DB
}
func (b *badgerdb) Pop(key string) (Data, bool, error) {
var data Data
err := b.db.Update(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(key))
if err != nil {
return errors.Wrap(err, "failed getting value")
}
raw, err := item.ValueCopy(nil)
if err != nil {
return errors.Wrap(err, "failed copying value")
}
err = json.Unmarshal(raw, &data)
if err != nil {
return errors.Wrap(err, "failed unmarshalling value")
}
err = txn.Delete([]byte(key))
return errors.Wrap(err, "failed deleting value")
})
if err != nil {
if errors.Is(err, badger.ErrKeyNotFound) {
return Data{}, false, nil
} else {
return Data{}, false, err
}
}
return data, true, nil
}
func (b *badgerdb) Set(key string, value Data) error {
data, err := value.ToBytes()
if err != nil {
return err
}
err = b.db.Update(func(txn *badger.Txn) error {
e := badger.NewEntry([]byte(key), data).WithTTL(b.ttl)
return txn.SetEntry(e)
})
return errors.Wrap(err, "failed setting value")
}
func (b *badgerdb) Cleanup() error {
// ttl is natively supported
return nil
}
func (b *badgerdb) Close() error {
return b.db.Close()
}
func newBadger(urlParsed *url.URL, ttl time.Duration) (Backend, error) {
var opt badger.Options
if urlParsed.Path == "" {
opt = badger.DefaultOptions("").
WithInMemory(true).
WithLogger(nil)
} else {
opt = badger.DefaultOptions(urlParsed.Path).
WithLogger(nil)
}
db, err := badger.Open(opt)
if err != nil {
return nil, errors.Wrap(err, "failed initiating badgerdb")
}
return &badgerdb{ttl: ttl, db: db}, nil
}