get rid of badger everywhere, including as an sdk/hints backend.
This commit is contained in:
@@ -1,90 +0,0 @@
|
||||
package badger
|
||||
|
||||
import (
|
||||
"github.com/dgraph-io/badger/v4"
|
||||
"fiatjaf.com/nostr/sdk/kvstore"
|
||||
)
|
||||
|
||||
var _ kvstore.KVStore = (*Store)(nil)
|
||||
|
||||
type Store struct {
|
||||
db *badger.DB
|
||||
}
|
||||
|
||||
func NewStore(path string) (*Store, error) {
|
||||
opts := badger.DefaultOptions(path)
|
||||
db, err := badger.Open(opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Store{db: db}, nil
|
||||
}
|
||||
|
||||
func (s *Store) Get(key []byte) ([]byte, error) {
|
||||
var valCopy []byte
|
||||
err := s.db.View(func(txn *badger.Txn) error {
|
||||
item, err := txn.Get(key)
|
||||
if err == badger.ErrKeyNotFound {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return item.Value(func(val []byte) error {
|
||||
valCopy = make([]byte, len(val))
|
||||
copy(valCopy, val)
|
||||
return nil
|
||||
})
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return valCopy, nil
|
||||
}
|
||||
|
||||
func (s *Store) Set(key []byte, value []byte) error {
|
||||
return s.db.Update(func(txn *badger.Txn) error {
|
||||
return txn.Set(key, value)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Store) Delete(key []byte) error {
|
||||
return s.db.Update(func(txn *badger.Txn) error {
|
||||
return txn.Delete(key)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Store) Close() error {
|
||||
return s.db.Close()
|
||||
}
|
||||
|
||||
func (s *Store) Update(key []byte, f func([]byte) ([]byte, error)) error {
|
||||
return s.db.Update(func(txn *badger.Txn) error {
|
||||
var val []byte
|
||||
item, err := txn.Get(key)
|
||||
if err == nil {
|
||||
err = item.Value(func(v []byte) error {
|
||||
val = make([]byte, len(v))
|
||||
copy(val, v)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if err != badger.ErrKeyNotFound {
|
||||
return err
|
||||
}
|
||||
|
||||
newVal, err := f(val)
|
||||
if err == kvstore.NoOp {
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if newVal == nil {
|
||||
return txn.Delete(key)
|
||||
}
|
||||
return txn.Set(key, newVal)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package bbolt
|
||||
|
||||
import (
|
||||
"fiatjaf.com/nostr/sdk/kvstore"
|
||||
"go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
var _ kvstore.KVStore = (*Store)(nil)
|
||||
|
||||
var (
|
||||
defaultBucket = []byte("default")
|
||||
)
|
||||
|
||||
type Store struct {
|
||||
db *bbolt.DB
|
||||
bucket []byte
|
||||
}
|
||||
|
||||
func NewStore(path string) (*Store, error) {
|
||||
db, err := bbolt.Open(path, 0600, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Create the default bucket
|
||||
err = db.Update(func(tx *bbolt.Tx) error {
|
||||
_, err := tx.CreateBucketIfNotExists(defaultBucket)
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
db.Close()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Store{db: db, bucket: defaultBucket}, nil
|
||||
}
|
||||
|
||||
func (s *Store) Get(key []byte) ([]byte, error) {
|
||||
var val []byte
|
||||
err := s.db.View(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(s.bucket)
|
||||
if b == nil {
|
||||
return nil
|
||||
}
|
||||
val = b.Get(key)
|
||||
if val != nil {
|
||||
// Make a copy since bbolt reuses the slice
|
||||
valCopy := make([]byte, len(val))
|
||||
copy(valCopy, val)
|
||||
val = valCopy
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return val, err
|
||||
}
|
||||
|
||||
func (s *Store) Set(key []byte, value []byte) error {
|
||||
return s.db.Update(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(s.bucket)
|
||||
return b.Put(key, value)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Store) Delete(key []byte) error {
|
||||
return s.db.Update(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(s.bucket)
|
||||
return b.Delete(key)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Store) Close() error {
|
||||
return s.db.Close()
|
||||
}
|
||||
|
||||
func (s *Store) Update(key []byte, f func([]byte) ([]byte, error)) error {
|
||||
return s.db.Update(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(s.bucket)
|
||||
var val []byte
|
||||
if v := b.Get(key); v != nil {
|
||||
val = make([]byte, len(v))
|
||||
copy(val, v)
|
||||
}
|
||||
|
||||
newVal, err := f(val)
|
||||
if err == kvstore.NoOp {
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if newVal == nil {
|
||||
return b.Delete(key)
|
||||
}
|
||||
return b.Put(key, newVal)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user