works but doesn't sync up properly
This commit is contained in:
138
kvstore.go
Normal file
138
kvstore.go
Normal file
@@ -0,0 +1,138 @@
|
||||
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() *RedisKVStore {
|
||||
rkvs := new(RedisKVStore)
|
||||
rkvs.Open("localhost:6379") //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(nil)
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user