forked from TrueCloudLab/frostfs-node
42 lines
976 B
Go
42 lines
976 B
Go
|
package localstore
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"go.uber.org/zap"
|
||
|
)
|
||
|
|
||
|
func (l *localstore) Iterate(filter FilterPipeline, handler MetaHandler) error {
|
||
|
if handler == nil {
|
||
|
return ErrEmptyMetaHandler
|
||
|
} else if filter == nil {
|
||
|
filter = NewFilter(&FilterParams{
|
||
|
Name: "SKIPPING_FILTER",
|
||
|
FilterFunc: SkippingFilterFunc,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
return l.metaBucket.Iterate(func(_, v []byte) bool {
|
||
|
meta := new(ObjectMeta)
|
||
|
if err := meta.Unmarshal(v); err != nil {
|
||
|
l.log.Error("unmarshal meta bucket item failure", zap.Error(err))
|
||
|
} else if filter.Pass(context.TODO(), meta).Code() == CodePass {
|
||
|
return !handler(meta)
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// ListItems iterates over Iterator with FilterPipeline and returns all passed items.
|
||
|
func ListItems(it Iterator, f FilterPipeline) ([]ListItem, error) {
|
||
|
res := make([]ListItem, 0)
|
||
|
err := it.Iterate(f, func(meta *ObjectMeta) (stop bool) {
|
||
|
res = append(res, ListItem{
|
||
|
ObjectMeta: *meta,
|
||
|
})
|
||
|
return
|
||
|
})
|
||
|
|
||
|
return res, err
|
||
|
}
|