36a5f8ed7f
- Replace raw slice comparison with a call to user comparator. Added test for custom comparators. - Fix end of namespace comments. - Fixed bug in picking inputs for a level-0 compaction. When finding overlapping files, the covered range may expand as files are added to the input set. We now correctly expand the range when this happens instead of continuing to use the old range. For example, suppose L0 contains files with the following ranges: F1: a .. d F2: c .. g F3: f .. j and the initial compaction target is F3. We used to search for range f..j which yielded {F2,F3}. However we now expand the range as soon as another file is added. In this case, when F2 is added, we expand the range to c..j and restart the search. That picks up file F1 as well. This change fixes a bug related to deleted keys showing up incorrectly after a compaction as described in Issue 44. (Sync with upstream @25072954)
101 lines
3.4 KiB
C++
101 lines
3.4 KiB
C++
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
//
|
|
// An iterator yields a sequence of key/value pairs from a source.
|
|
// The following class defines the interface. Multiple implementations
|
|
// are provided by this library. In particular, iterators are provided
|
|
// to access the contents of a Table or a DB.
|
|
//
|
|
// Multiple threads can invoke const methods on an Iterator without
|
|
// external synchronization, but if any of the threads may call a
|
|
// non-const method, all threads accessing the same Iterator must use
|
|
// external synchronization.
|
|
|
|
#ifndef STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
|
|
#define STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
|
|
|
|
#include "leveldb/slice.h"
|
|
#include "leveldb/status.h"
|
|
|
|
namespace leveldb {
|
|
|
|
class Iterator {
|
|
public:
|
|
Iterator();
|
|
virtual ~Iterator();
|
|
|
|
// An iterator is either positioned at a key/value pair, or
|
|
// not valid. This method returns true iff the iterator is valid.
|
|
virtual bool Valid() const = 0;
|
|
|
|
// Position at the first key in the source. The iterator is Valid()
|
|
// after this call iff the source is not empty.
|
|
virtual void SeekToFirst() = 0;
|
|
|
|
// Position at the last key in the source. The iterator is
|
|
// Valid() after this call iff the source is not empty.
|
|
virtual void SeekToLast() = 0;
|
|
|
|
// Position at the first key in the source that at or past target
|
|
// The iterator is Valid() after this call iff the source contains
|
|
// an entry that comes at or past target.
|
|
virtual void Seek(const Slice& target) = 0;
|
|
|
|
// Moves to the next entry in the source. After this call, Valid() is
|
|
// true iff the iterator was not positioned at the last entry in the source.
|
|
// REQUIRES: Valid()
|
|
virtual void Next() = 0;
|
|
|
|
// Moves to the previous entry in the source. After this call, Valid() is
|
|
// true iff the iterator was not positioned at the first entry in source.
|
|
// REQUIRES: Valid()
|
|
virtual void Prev() = 0;
|
|
|
|
// Return the key for the current entry. The underlying storage for
|
|
// the returned slice is valid only until the next modification of
|
|
// the iterator.
|
|
// REQUIRES: Valid()
|
|
virtual Slice key() const = 0;
|
|
|
|
// Return the value for the current entry. The underlying storage for
|
|
// the returned slice is valid only until the next modification of
|
|
// the iterator.
|
|
// REQUIRES: !AtEnd() && !AtStart()
|
|
virtual Slice value() const = 0;
|
|
|
|
// If an error has occurred, return it. Else return an ok status.
|
|
virtual Status status() const = 0;
|
|
|
|
// Clients are allowed to register function/arg1/arg2 triples that
|
|
// will be invoked when this iterator is destroyed.
|
|
//
|
|
// Note that unlike all of the preceding methods, this method is
|
|
// not abstract and therefore clients should not override it.
|
|
typedef void (*CleanupFunction)(void* arg1, void* arg2);
|
|
void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2);
|
|
|
|
private:
|
|
struct Cleanup {
|
|
CleanupFunction function;
|
|
void* arg1;
|
|
void* arg2;
|
|
Cleanup* next;
|
|
};
|
|
Cleanup cleanup_;
|
|
|
|
// No copying allowed
|
|
Iterator(const Iterator&);
|
|
void operator=(const Iterator&);
|
|
};
|
|
|
|
// Return an empty iterator (yields nothing).
|
|
extern Iterator* NewEmptyIterator();
|
|
|
|
// Return an empty iterator with the specified status.
|
|
extern Iterator* NewErrorIterator(const Status& status);
|
|
|
|
} // namespace leveldb
|
|
|
|
#endif // STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
|