steem-block-db/db.go

92 lines
1.9 KiB
Go
Raw Normal View History

2018-10-28 16:31:26 +00:00
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
}