func (l *LevelDBPersistence) ForEach(decoder storage.RecordDecoder, filter storage.RecordFilter, operator storage.RecordOperator) (scannedEntireCorpus bool, err error) { var ( iterator = l.NewIterator(true) valid bool ) defer iterator.Close() for valid = iterator.SeekToFirst(); valid; valid = iterator.Next() { err = iterator.GetError() if err != nil { return } decodedKey, decodeErr := decoder.DecodeKey(iterator.Key()) if decodeErr != nil { continue } decodedValue, decodeErr := decoder.DecodeValue(iterator.Value()) if decodeErr != nil { continue } switch filter.Filter(decodedKey, decodedValue) { case storage.STOP: return case storage.SKIP: continue case storage.ACCEPT: opErr := operator.Operate(decodedKey, decodedValue) if opErr != nil { if opErr.Continuable { continue } break } } } scannedEntireCorpus = true return }
func (s stream) forEach(decoder storage.RecordDecoder, filter storage.RecordFilter, operator storage.RecordOperator) (scannedEntireCorpus bool, err error) { if s.values.Len() == 0 { return } iterator := s.values.SeekToLast() defer iterator.Close() for !(iterator.Key() == nil || iterator.Value() == nil) { decodedKey, decodeErr := decoder.DecodeKey(iterator.Key()) if decodeErr != nil { panic(decodeErr) } decodedValue, decodeErr := decoder.DecodeValue(iterator.Value()) if decodeErr != nil { panic(decodeErr) } switch filter.Filter(decodedKey, decodedValue) { case storage.STOP: return case storage.SKIP: continue case storage.ACCEPT: opErr := operator.Operate(decodedKey, decodedValue) if opErr != nil { if opErr.Continuable { continue } break } } if !iterator.Previous() { break } } scannedEntireCorpus = true return }
// ForEach implements raw.ForEacher. func (l *LevelDBPersistence) ForEach(decoder storage.RecordDecoder, filter storage.RecordFilter, operator storage.RecordOperator) (scannedEntireCorpus bool, err error) { iterator, err := l.NewIterator(true) if err != nil { return false, err } defer iterator.Close() for valid := iterator.SeekToFirst(); valid; valid = iterator.Next() { if err = iterator.Error(); err != nil { return false, err } decodedKey, decodeErr := decoder.DecodeKey(iterator.rawKey()) if decodeErr != nil { continue } decodedValue, decodeErr := decoder.DecodeValue(iterator.RawValue()) if decodeErr != nil { continue } switch filter.Filter(decodedKey, decodedValue) { case storage.Stop: return case storage.Skip: continue case storage.Accept: opErr := operator.Operate(decodedKey, decodedValue) if opErr != nil { if opErr.Continuable { continue } break } } } return true, nil }