forked from AplaProject/go-apla
/
bolt_storage.go
127 lines (106 loc) · 2.51 KB
/
bolt_storage.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
124
125
126
127
package storage
import (
"encoding/json"
"github.com/GenesisKernel/go-genesis/tools/update_server/model"
"github.com/boltdb/bolt"
"github.com/pkg/errors"
)
type BoltStorage struct {
bolt *bolt.DB
open bool
}
var bucketName = []byte("builds")
// NewBoltStorage is creating bolt storage
func NewBoltStorage(filename string) (BoltStorage, error) {
var err error
var db BoltStorage
db.bolt, err = bolt.Open(filename, 0600, nil)
if err != nil {
return db, errors.Wrapf(err, "opening boltdb file storage")
}
db.open = true
// We need to check all buckets to availability before doing some stuff
err = db.bolt.Update(func(tx *bolt.Tx) error {
_, err := tx.CreateBucketIfNotExists(bucketName)
if err != nil {
return errors.Wrapf(err, "creating bucket")
}
return nil
})
if err != nil {
return db, errors.Wrapf(err, "updating storage")
}
return db, nil
}
func (db *BoltStorage) GetVersionsList() ([]model.Version, error) {
var result []model.Version
err := db.bolt.View(func(tx *bolt.Tx) error {
c := tx.Bucket(bucketName).Cursor()
for k, _ := c.First(); k != nil; k, _ = c.Next() {
kv, err := model.NewVersion(string(k))
if err != nil {
return err
}
result = append(result, kv)
}
return nil
})
if err != nil {
return nil, err
}
return result, nil
}
func (db *BoltStorage) Get(binary model.Build) (model.Build, error) {
var fb model.Build
if binary.String() == "" {
return fb, errors.Errorf("wrong system")
}
err := db.bolt.View(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
ub := b.Get([]byte(binary.String()))
if ub != nil {
err := json.Unmarshal(ub, &fb)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return fb, err
}
return fb, nil
}
func (db *BoltStorage) Add(binary model.Build) error {
aeb, err := db.Get(binary)
if err != nil {
return err
}
if aeb.String() != "" {
return errors.Errorf("version %s already exists in storage", binary.String())
}
if binary.String() == "" {
return errors.Errorf("wrong system")
}
return db.bolt.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
jb, err := json.Marshal(binary)
if err != nil {
return err
}
err = b.Put([]byte(binary.String()), jb)
if err != nil {
return err
}
return nil
})
}
func (db *BoltStorage) Delete(binary model.Build) error {
if binary.String() == "" {
return errors.Errorf("wrong system")
}
return db.bolt.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
return b.Delete([]byte(binary.String()))
})
}