Add more bolt utils
This PR extracts out a few more bolt utils from the codebase for easier management. Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>
This commit is contained in:
@@ -19,6 +19,8 @@ package boltutil
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/gogo/protobuf/types"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
@@ -28,6 +30,7 @@ var (
|
||||
bucketKeyLabels = []byte("labels")
|
||||
bucketKeyCreatedAt = []byte("createdat")
|
||||
bucketKeyUpdatedAt = []byte("updatedat")
|
||||
bucketKeyExtensions = []byte("extensions")
|
||||
)
|
||||
|
||||
// ReadLabels reads the labels key from the bucket
|
||||
@@ -145,3 +148,88 @@ func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// WriteExtensions will write a KV map to the given bucket,
|
||||
// where `K` is a string key and `V` is a protobuf's Any type that represents a generic extension.
|
||||
func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error {
|
||||
if len(extensions) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
ebkt, err := bkt.CreateBucketIfNotExists(bucketKeyExtensions)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for name, ext := range extensions {
|
||||
p, err := proto.Marshal(&ext)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ebkt.Put([]byte(name), p); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadExtensions will read back a map of extensions from the given bucket, previously written by WriteExtensions
|
||||
func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) {
|
||||
var (
|
||||
extensions = make(map[string]types.Any)
|
||||
ebkt = bkt.Bucket(bucketKeyExtensions)
|
||||
)
|
||||
|
||||
if ebkt == nil {
|
||||
return extensions, nil
|
||||
}
|
||||
|
||||
if err := ebkt.ForEach(func(k, v []byte) error {
|
||||
var t types.Any
|
||||
if err := proto.Unmarshal(v, &t); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
extensions[string(k)] = t
|
||||
return nil
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return extensions, nil
|
||||
}
|
||||
|
||||
// WriteAny write a protobuf's Any type to the bucket
|
||||
func WriteAny(bkt *bolt.Bucket, name []byte, any *types.Any) error {
|
||||
if any == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
data, err := proto.Marshal(any)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := bkt.Put(name, data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadAny reads back protobuf's Any type from the bucket
|
||||
func ReadAny(bkt *bolt.Bucket, name []byte) (*types.Any, error) {
|
||||
bytes := bkt.Get(name)
|
||||
if bytes == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
out := types.Any{}
|
||||
if err := proto.Unmarshal(bytes, &out); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to unmarshal any")
|
||||
}
|
||||
|
||||
return &out, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user