// 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). // #pragma once #include #include "rocksdb/comparator.h" #include "rocksdb/iterator.h" #include "rocksdb/status.h" namespace rocksdb { class PinnedIteratorsManager; class InternalIterator : public Cleanable { public: InternalIterator() {} virtual ~InternalIterator() {} // 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 first 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) = 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. // 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; // Pass the PinnedIteratorsManager to the Iterator, most Iterators dont // communicate with PinnedIteratorsManager so default implementation is no-op // but for Iterators that need to communicate with PinnedIteratorsManager // they will implement this function and use the passed pointer to communicate // with PinnedIteratorsManager. virtual void SetPinnedItersMgr(PinnedIteratorsManager* pinned_iters_mgr) {} // If true, this means that the Slice returned by key() is valid as long as // PinnedIteratorsManager::ReleasePinnedData is not called and the // Iterator is not deleted. // // IsKeyPinned() is guaranteed to always return true if // - Iterator is created with ReadOptions::pin_data = true // - DB tables were created with BlockBasedTableOptions::use_delta_encoding // set to false. virtual bool IsKeyPinned() const { return false; } // If true, this means that the Slice returned by value() is valid as long as // PinnedIteratorsManager::ReleasePinnedData is not called and the // Iterator is not deleted. virtual bool IsValuePinned() const { return false; } virtual Status GetProperty(std::string prop_name, std::string* prop) { return Status::NotSupported(""); } protected: void SeekForPrevImpl(const Slice& target, const Comparator* cmp) { Seek(target); if (!Valid()) { SeekToLast(); } while (Valid() && cmp->Compare(target, key()) < 0) { Prev(); } } private: // No copying allowed InternalIterator(const InternalIterator&) = delete; InternalIterator& operator=(const InternalIterator&) = delete; }; // Return an empty iterator (yields nothing). extern InternalIterator* NewEmptyInternalIterator(); // Return an empty iterator with the specified status. extern InternalIterator* NewErrorInternalIterator(const Status& status); } // namespace rocksdb