mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-08-28 06:41:53 +02:00
sdk: actually no, let's store all relay urls together in the same kvdb key.
This commit is contained in:
@@ -58,27 +58,31 @@ func (s *Store) Close() error {
|
||||
return s.db.Close()
|
||||
}
|
||||
|
||||
func (s *Store) Scan(prefix []byte, fn func(key []byte, value []byte) bool) error {
|
||||
return s.db.View(func(txn *badger.Txn) error {
|
||||
it := txn.NewIterator(badger.DefaultIteratorOptions)
|
||||
defer it.Close()
|
||||
|
||||
for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() {
|
||||
item := it.Item()
|
||||
err := item.Value(func(v []byte) error {
|
||||
k := item.Key()
|
||||
if !fn(k, v) {
|
||||
return badger.ErrStopIteration
|
||||
}
|
||||
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 == badger.ErrStopIteration {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if err != badger.ErrKeyNotFound {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
newVal, err := f(val)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if newVal == nil {
|
||||
return txn.Delete(key)
|
||||
}
|
||||
return txn.Set(key, newVal)
|
||||
})
|
||||
}
|
||||
|
@@ -14,7 +14,9 @@ type KVStore interface {
|
||||
// Close releases any resources held by the store
|
||||
Close() error
|
||||
|
||||
// Scan iterates through all keys with the given prefix.
|
||||
// For each key-value pair, fn is called. If fn returns false, iteration stops.
|
||||
Scan(prefix []byte, fn func(key []byte, value []byte) bool) error
|
||||
// Update atomically modifies a value for a given key.
|
||||
// The function f receives the current value (nil if not found)
|
||||
// and returns the new value to be set.
|
||||
// If f returns nil, the key is deleted.
|
||||
Update(key []byte, f func([]byte) ([]byte, error)) error
|
||||
}
|
||||
|
@@ -91,22 +91,26 @@ func (s *Store) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Store) Scan(prefix []byte, fn func(key []byte, value []byte) bool) error {
|
||||
return s.env.View(func(txn *lmdb.Txn) error {
|
||||
cursor, err := txn.OpenCursor(s.dbi)
|
||||
func (s *Store) Update(key []byte, f func([]byte) ([]byte, error)) error {
|
||||
return s.env.Update(func(txn *lmdb.Txn) error {
|
||||
var val []byte
|
||||
v, err := txn.Get(s.dbi, key)
|
||||
if err == nil {
|
||||
// make a copy since v is only valid during the transaction
|
||||
val = make([]byte, len(v))
|
||||
copy(val, v)
|
||||
} else if !lmdb.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
newVal, err := f(val)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer cursor.Close()
|
||||
|
||||
for k, v, err := cursor.Get(prefix, nil, lmdb.SetRange); err == nil; k, v, err = cursor.Get(nil, nil, lmdb.Next) {
|
||||
if !bytes.HasPrefix(k, prefix) {
|
||||
break
|
||||
}
|
||||
if !fn(k, v) {
|
||||
break
|
||||
}
|
||||
if newVal == nil {
|
||||
return txn.Del(s.dbi, key, nil)
|
||||
}
|
||||
return nil
|
||||
return txn.Put(s.dbi, key, newVal, 0)
|
||||
})
|
||||
}
|
||||
|
@@ -57,17 +57,29 @@ func (s *Store) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Store) Scan(prefix []byte, fn func(key []byte, value []byte) bool) error {
|
||||
s.RLock()
|
||||
defer s.RUnlock()
|
||||
func (s *Store) Update(key []byte, f func([]byte) ([]byte, error)) error {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
|
||||
prefixStr := string(prefix)
|
||||
for k, v := range s.data {
|
||||
if strings.HasPrefix(k, prefixStr) {
|
||||
if !fn([]byte(k), v) {
|
||||
break
|
||||
}
|
||||
}
|
||||
var val []byte
|
||||
if v, ok := s.data[string(key)]; ok {
|
||||
// Return a copy to prevent modification of stored data
|
||||
val = make([]byte, len(v))
|
||||
copy(val, v)
|
||||
}
|
||||
|
||||
newVal, err := f(val)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if newVal == nil {
|
||||
delete(s.data, string(key))
|
||||
} else {
|
||||
// Store a copy to prevent modification of stored data
|
||||
cp := make([]byte, len(newVal))
|
||||
copy(cp, newVal)
|
||||
s.data[string(key)] = cp
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user