|
- package main
-
- import log "github.com/sirupsen/logrus"
- import "io/ioutil"
- import "github.com/dgraph-io/badger"
- import "github.com/spf13/afero"
- import "github.com/go-redis/redis"
-
- // KeyValueStorer is an interface for the backend kv store used by
- // SteemDataStore
- // it could be fs, badgerdb, whatever
-
- type KVStorer interface {
- Open(string)
- Get(*string) (*string, error)
- Exists(*string) (bool, error)
- Put(*string, *string) error
- Close()
- }
-
- type RedisKVStore struct {
- rc *redis.Client
- }
-
- func NewRedisKVStore(hostname string) *RedisKVStore {
- rkvs := new(RedisKVStore)
- rkvs.Open(hostname) //FIXME(sneak) use viper
- return rkvs
- }
-
- func (self *RedisKVStore) Exists(keyname *string) (bool, error) {
- val, err := self.rc.Exists(*keyname).Result()
- if err != nil {
- return false, err
- }
- if val == int64(1) {
- return true, nil
- } else {
- return false, nil
- }
- }
-
- func (self *RedisKVStore) Get(keyname *string) (*string, error) {
- val, err := self.rc.Get(*keyname).Result()
- if err != nil {
- return nil, err
- }
- return &val, nil
- }
-
- func (self *RedisKVStore) Put(keyname *string, value *string) error {
- err := self.rc.Set(*keyname, *value, 0).Err()
- if err != nil {
- panic("unable to write to redis")
- }
- return nil
- }
-
- func (self *RedisKVStore) Close() {
- self.rc.Close()
- }
-
- func (self *RedisKVStore) Open(hostname string) {
- self.rc = redis.NewClient(&redis.Options{
- Addr: hostname,
- Password: "", // no password set
- DB: 0, // use default DB
- })
-
- _, err := self.rc.Ping().Result()
- if err != nil {
- panic(err)
- }
- }
-
- type AferoFSKVStore struct {
- fs *afero.Fs
- }
-
- // BadgerKVStore is an object that conforms to KeyValueStorer for use
- // by SteemDataStore to persist Steem data
-
- type BadgerKVStore struct {
- db *badger.DB
- }
-
- func NewBadgerKVStore(dir string) *BadgerKVStore {
- kv := new(BadgerKVStore)
- kv.Open(dir)
- return kv
- }
-
- func (kv *BadgerKVStore) 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 *BadgerKVStore) Close() {
- kv.db.Close()
- }
-
- func (kv *BadgerKVStore) 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()
- if err != nil {
- log.Fatal(err)
- }
- return nil
- }
-
- func (kv *BadgerKVStore) Get(key *string) (*string, error) {
- txn := kv.db.NewTransaction(false)
- 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
- }
|