92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
|
package main
|
||
|
|
||
|
import "log"
|
||
|
import "io/ioutil"
|
||
|
import "github.com/dgraph-io/badger"
|
||
|
|
||
|
// SteemDataStore is the object with which the rest of this tool interacts
|
||
|
type SteemDataStore struct {
|
||
|
kv KeyValueStorer
|
||
|
}
|
||
|
|
||
|
func NewSteemDataStore(dir string) *SteemDataStore {
|
||
|
self := new(SteemDataStore)
|
||
|
self.kv = NewBadgerKeyValueStore(dir)
|
||
|
return self
|
||
|
}
|
||
|
|
||
|
func (self *SteemDataStore) StoreBlockOps(blockNum int, blockOps []byte) {
|
||
|
panic("not implemented")
|
||
|
}
|
||
|
|
||
|
// KeyValueStorer is an interface for the backend kv store used by
|
||
|
// SteemDataStore
|
||
|
// it could be fs, badgerdb, whatever
|
||
|
|
||
|
type KeyValueStorer interface {
|
||
|
Open(string)
|
||
|
Get(*string) (*string, error)
|
||
|
Put(*string, *string) error
|
||
|
Close()
|
||
|
}
|
||
|
|
||
|
// BadgerKeyValueStore is an object that conforms to KeyValueStorer for use
|
||
|
// by SteemDataStore to persist Steem data
|
||
|
|
||
|
type BadgerKeyValueStore struct {
|
||
|
db *badger.DB
|
||
|
}
|
||
|
|
||
|
func NewBadgerKeyValueStore(dir string) *BadgerKeyValueStore {
|
||
|
kv := new(BadgerKeyValueStore)
|
||
|
kv.Open(dir)
|
||
|
return kv
|
||
|
}
|
||
|
|
||
|
func (kv *BadgerKeyValueStore) Open(dir string) {
|
||
|
dir, err := ioutil.TempDir("", "badger")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
opts := badger.DefaultOptions
|
||
|
opts.Dir = dir
|
||
|
opts.ValueDir = dir
|
||
|
kv.db, err = badger.Open(opts)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (kv *BadgerKeyValueStore) Close() {
|
||
|
kv.db.Close()
|
||
|
}
|
||
|
|
||
|
func (kv *BadgerKeyValueStore) Put(key *string, value *string) error {
|
||
|
txn := kv.db.NewTransaction(true) // Read-write txn
|
||
|
err := txn.Set([]byte(*key), []byte(*value))
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
err = txn.Commit(nil)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (kv *BadgerKeyValueStore) Get(key *string) (*string, error) {
|
||
|
txn := kv.db.NewTransaction(true) // Read-write txn
|
||
|
item, err := txn.Get([]byte(*key))
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
val, err := item.ValueCopy(nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
s := string(val)
|
||
|
return &s, nil
|
||
|
}
|