get rid of badger everywhere, including as an sdk/hints backend.

This commit is contained in:
fiatjaf
2025-09-03 21:33:39 -03:00
parent a09429236e
commit cd398b94b5
16 changed files with 359 additions and 444 deletions
-90
View File
@@ -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)
})
}
+96
View File
@@ -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)
})
}