package writecache import ( "errors" "fmt" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/metaerr" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" "github.com/cockroachdb/pebble" ) // ErrNoDefaultBucket is returned by IterateDB when default bucket for objects is missing. var ErrNoDefaultBucket = errors.New("no default bucket") // IterateDB iterates over all objects stored in bbolt.DB instance and passes them to f until error return. // It is assumed that db is an underlying database of some WriteCache instance. // // Returns ErrNoDefaultBucket if there is no default bucket in db. // // DB must not be nil and should be opened. func IterateDB(db *pebble.DB, f func(oid.Address) error) error { it, err := db.NewIter(nil) if err != nil { return metaerr.Wrap(err) } for v := it.First(); v; v = it.Next() { var addr oid.Address err := addr.DecodeString(string(it.Key())) if err != nil { _ = it.Close() return fmt.Errorf("could not parse object address: %w", err) } if err := f(addr); err != nil { _ = it.Close() return err } } return metaerr.Wrap(it.Close()) }