BlockstoreIterator trait with implementation for badger
This commit is contained in:
parent
68a83500bc
commit
d476a3db2c
@ -97,6 +97,7 @@ type Blockstore struct {
|
|||||||
|
|
||||||
var _ blockstore.Blockstore = (*Blockstore)(nil)
|
var _ blockstore.Blockstore = (*Blockstore)(nil)
|
||||||
var _ blockstore.Viewer = (*Blockstore)(nil)
|
var _ blockstore.Viewer = (*Blockstore)(nil)
|
||||||
|
var _ blockstore.BlockstoreIterator = (*Blockstore)(nil)
|
||||||
var _ io.Closer = (*Blockstore)(nil)
|
var _ io.Closer = (*Blockstore)(nil)
|
||||||
|
|
||||||
// Open creates a new badger-backed blockstore, with the supplied options.
|
// Open creates a new badger-backed blockstore, with the supplied options.
|
||||||
@ -442,6 +443,52 @@ func (b *Blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
|||||||
return ch, nil
|
return ch, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implementation of BlockstoreIterator interface
|
||||||
|
func (b *Blockstore) ForEachKey(f func(cid.Cid) error) error {
|
||||||
|
if atomic.LoadInt64(&b.state) != stateOpen {
|
||||||
|
return ErrBlockstoreClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
txn := b.DB.NewTransaction(false)
|
||||||
|
defer txn.Discard()
|
||||||
|
|
||||||
|
opts := badger.IteratorOptions{PrefetchSize: 100}
|
||||||
|
if b.prefixing {
|
||||||
|
opts.Prefix = b.prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := txn.NewIterator(opts)
|
||||||
|
defer iter.Close()
|
||||||
|
|
||||||
|
for iter.Rewind(); iter.Valid(); iter.Next() {
|
||||||
|
if atomic.LoadInt64(&b.state) != stateOpen {
|
||||||
|
return ErrBlockstoreClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
k := iter.Item().Key()
|
||||||
|
if b.prefixing {
|
||||||
|
k = k[b.prefixLen:]
|
||||||
|
}
|
||||||
|
|
||||||
|
klen := base32.RawStdEncoding.DecodedLen(len(k))
|
||||||
|
buf := make([]byte, klen)
|
||||||
|
|
||||||
|
n, err := base32.RawStdEncoding.Decode(buf, k)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c := cid.NewCidV1(cid.Raw, buf[:n])
|
||||||
|
|
||||||
|
err = f(c)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// HashOnRead implements Blockstore.HashOnRead. It is not supported by this
|
// HashOnRead implements Blockstore.HashOnRead. It is not supported by this
|
||||||
// blockstore.
|
// blockstore.
|
||||||
func (b *Blockstore) HashOnRead(_ bool) {
|
func (b *Blockstore) HashOnRead(_ bool) {
|
||||||
|
@ -30,6 +30,11 @@ type BatchDeleter interface {
|
|||||||
DeleteMany(cids []cid.Cid) error
|
DeleteMany(cids []cid.Cid) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlockstoreIterator is a trait for efficient iteration
|
||||||
|
type BlockstoreIterator interface {
|
||||||
|
ForEachKey(func(cid.Cid) error) error
|
||||||
|
}
|
||||||
|
|
||||||
// WrapIDStore wraps the underlying blockstore in an "identity" blockstore.
|
// WrapIDStore wraps the underlying blockstore in an "identity" blockstore.
|
||||||
// The ID store filters out all puts for blocks with CIDs using the "identity"
|
// The ID store filters out all puts for blocks with CIDs using the "identity"
|
||||||
// hash function. It also extracts inlined blocks from CIDs using the identity
|
// hash function. It also extracts inlined blocks from CIDs using the identity
|
||||||
|
Loading…
Reference in New Issue
Block a user