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 }