| // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. |
| // This source code is licensed under both the GPLv2 (found in the |
| // COPYING file in the root directory) and Apache 2.0 License |
| // (found in the LICENSE.Apache file in the root directory). |
| // 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_ROCKSDB_INCLUDE_ITERATOR_H_ |
| #define STORAGE_ROCKSDB_INCLUDE_ITERATOR_H_ |
| |
| #include <string> |
| #include "rocksdb/cleanable.h" |
| #include "rocksdb/slice.h" |
| #include "rocksdb/status.h" |
| |
| namespace rocksdb { |
| |
| class Iterator : public Cleanable { |
| 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; |
| |
| // Position at the last key in the source that at or before target |
| // The iterator is Valid() after this call iff the source contains |
| // an entry that comes at or before target. |
| virtual void SeekForPrev(const Slice& target) {} |
| |
| // 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. |
| // If non-blocking IO is requested and this operation cannot be |
| // satisfied without doing some IO, then this returns Status::Incomplete(). |
| virtual Status status() const = 0; |
| |
| // If supported, renew the iterator to represent the latest state. The |
| // iterator will be invalidated after the call. Not supported if |
| // ReadOptions.snapshot is given when creating the iterator. |
| virtual Status Refresh() { |
| return Status::NotSupported("Refresh() is not supported"); |
| } |
| |
| // Property "rocksdb.iterator.is-key-pinned": |
| // If returning "1", this means that the Slice returned by key() is valid |
| // as long as the iterator is not deleted. |
| // It is guaranteed to always return "1" if |
| // - Iterator created with ReadOptions::pin_data = true |
| // - DB tables were created with |
| // BlockBasedTableOptions::use_delta_encoding = false. |
| // Property "rocksdb.iterator.super-version-number": |
| // LSM version used by the iterator. The same format as DB Property |
| // kCurrentSuperVersionNumber. See its comment for more information. |
| virtual Status GetProperty(std::string prop_name, std::string* prop); |
| |
| private: |
| // 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 rocksdb |
| |
| #endif // STORAGE_ROCKSDB_INCLUDE_ITERATOR_H_ |