| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | //  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.#pragma once#include <memory>#include "db/range_tombstone_fragmenter.h"#include "rocksdb/slice_transform.h"#include "table/get_context.h"#include "table/internal_iterator.h"#include "table/multiget_context.h"#include "table/table_reader_caller.h"namespace ROCKSDB_NAMESPACE {class Iterator;struct ParsedInternalKey;class Slice;class Arena;struct ReadOptions;struct TableProperties;class GetContext;class MultiGetContext;// A Table (also referred to as SST) is a sorted map from strings to strings.// Tables are immutable and persistent.  A Table may be safely accessed from// multiple threads without external synchronization. Table readers are used// for reading various types of table formats supported by rocksdb including// BlockBasedTable, PlainTable and CuckooTable format.class TableReader { public:  virtual ~TableReader() {}  // Returns a new iterator over the table contents.  // The result of NewIterator() is initially invalid (caller must  // call one of the Seek methods on the iterator before using it).  // arena: If not null, the arena needs to be used to allocate the Iterator.  //        When destroying the iterator, the caller will not call "delete"  //        but Iterator::~Iterator() directly. The destructor needs to destroy  //        all the states but those allocated in arena.  // skip_filters: disables checking the bloom filters even if they exist. This  //               option is effective only for block-based table format.  // compaction_readahead_size: its value will only be used if caller =  // kCompaction  virtual InternalIterator* NewIterator(      const ReadOptions&, const SliceTransform* prefix_extractor, Arena* arena,      bool skip_filters, TableReaderCaller caller,      size_t compaction_readahead_size = 0) = 0;  virtual FragmentedRangeTombstoneIterator* NewRangeTombstoneIterator(      const ReadOptions& /*read_options*/) {    return nullptr;  }  // Given a key, return an approximate byte offset in the file where  // the data for that key begins (or would begin if the key were  // present in the file).  The returned value is in terms of file  // bytes, and so includes effects like compression of the underlying data.  // E.g., the approximate offset of the last key in the table will  // be close to the file length.  virtual uint64_t ApproximateOffsetOf(const Slice& key,                                       TableReaderCaller caller) = 0;  // Given start and end keys, return the approximate data size in the file  // between the keys. The returned value is in terms of file bytes, and so  // includes effects like compression of the underlying data.  virtual uint64_t ApproximateSize(const Slice& start, const Slice& end,                                   TableReaderCaller caller) = 0;  // Set up the table for Compaction. Might change some parameters with  // posix_fadvise  virtual void SetupForCompaction() = 0;  virtual std::shared_ptr<const TableProperties> GetTableProperties() const = 0;  // Prepare work that can be done before the real Get()  virtual void Prepare(const Slice& /*target*/) {}  // Report an approximation of how much memory has been used.  virtual size_t ApproximateMemoryUsage() const = 0;  // Calls get_context->SaveValue() repeatedly, starting with  // the entry found after a call to Seek(key), until it returns false.  // May not make such a call if filter policy says that key is not present.  //  // get_context->MarkKeyMayExist needs to be called when it is configured to be  // memory only and the key is not found in the block cache.  //  // readOptions is the options for the read  // key is the key to search for  // skip_filters: disables checking the bloom filters even if they exist. This  //               option is effective only for block-based table format.  virtual Status Get(const ReadOptions& readOptions, const Slice& key,                     GetContext* get_context,                     const SliceTransform* prefix_extractor,                     bool skip_filters = false) = 0;  virtual void MultiGet(const ReadOptions& readOptions,                        const MultiGetContext::Range* mget_range,                        const SliceTransform* prefix_extractor,                        bool skip_filters = false) {    for (auto iter = mget_range->begin(); iter != mget_range->end(); ++iter) {      *iter->s = Get(readOptions, iter->ikey, iter->get_context,                     prefix_extractor, skip_filters);    }  }  // Prefetch data corresponding to a give range of keys  // Typically this functionality is required for table implementations that  // persists the data on a non volatile storage medium like disk/SSD  virtual Status Prefetch(const Slice* begin = nullptr,                          const Slice* end = nullptr) {    (void) begin;    (void) end;    // Default implementation is NOOP.    // The child class should implement functionality when applicable    return Status::OK();  }  // convert db file to a human readable form  virtual Status DumpTable(WritableFile* /*out_file*/) {    return Status::NotSupported("DumpTable() not supported");  }  // check whether there is corruption in this db file  virtual Status VerifyChecksum(const ReadOptions& /*read_options*/,                                TableReaderCaller /*caller*/) {    return Status::NotSupported("VerifyChecksum() not supported");  }};}  // namespace ROCKSDB_NAMESPACE
 |