67 lines
1.2 KiB
Go
67 lines
1.2 KiB
Go
package kv
|
|
|
|
import (
|
|
"github.com/cockroachdb/pebble"
|
|
)
|
|
|
|
var Impl *KvImpl
|
|
|
|
type KvImpl struct {
|
|
PebbleDB *pebble.DB
|
|
}
|
|
|
|
func NewPebble(datadir string) *KvImpl {
|
|
db, err := pebble.Open(datadir, &pebble.Options{})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return &KvImpl{
|
|
PebbleDB: db,
|
|
}
|
|
}
|
|
|
|
func (db *KvImpl) PebbleSet(key, val string) error {
|
|
return db.PebbleDB.Set([]byte(key), []byte(val), pebble.Sync)
|
|
}
|
|
|
|
func (db *KvImpl) PebbleGet(key string) ([]byte, error) {
|
|
value, _, err := db.PebbleDB.Get([]byte(key))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return value, nil
|
|
}
|
|
|
|
func (db *KvImpl) PebbleFetch(prefixKey string) (result map[string]string, err error) {
|
|
keyUpperBound := func(b []byte) []byte {
|
|
end := make([]byte, len(b))
|
|
copy(end, b)
|
|
for i := len(end) - 1; i >= 0; i-- {
|
|
end[i] = end[i] + 1
|
|
if end[i] != 0 {
|
|
return end[:i+1]
|
|
}
|
|
}
|
|
return nil // no upper-bound
|
|
}
|
|
|
|
prefixIterOptions := func(prefix []byte) *pebble.IterOptions {
|
|
return &pebble.IterOptions{
|
|
LowerBound: prefix,
|
|
UpperBound: keyUpperBound(prefix),
|
|
}
|
|
}
|
|
|
|
iter, err := db.PebbleDB.NewIter(prefixIterOptions([]byte(prefixKey)))
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for iter.First(); iter.Valid(); iter.Next() {
|
|
result[string(iter.Key())] = string(iter.Value())
|
|
}
|
|
return
|
|
}
|