sdk: use a prefix iterator on kvdb for storing relay urls associated with ids.

This commit is contained in:
fiatjaf
2025-01-16 10:25:00 -03:00
parent e1971d12c0
commit 4cf9631c28
6 changed files with 108 additions and 10 deletions

View File

@@ -57,3 +57,28 @@ func (s *Store) Delete(key []byte) error {
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
}
return nil
})
if err == badger.ErrStopIteration {
break
}
if err != nil {
return err
}
}
return nil
})
}

View File

@@ -13,4 +13,8 @@ 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
}

View File

@@ -90,3 +90,23 @@ func (s *Store) Close() error {
s.env.Close()
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)
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
}
}
return nil
})
}

View File

@@ -56,3 +56,18 @@ func (s *Store) Close() error {
s.data = nil
return nil
}
func (s *Store) Scan(prefix []byte, fn func(key []byte, value []byte) bool) error {
s.RLock()
defer s.RUnlock()
prefixStr := string(prefix)
for k, v := range s.data {
if strings.HasPrefix(k, prefixStr) {
if !fn([]byte(k), v) {
break
}
}
}
return nil
}