// 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 #include "db/db_impl/db_impl.h" namespace ROCKSDB_NAMESPACE { // TODO: Share common structure with CompactedDBImpl and DBImplSecondary class DBImplReadOnly : public DBImpl { public: DBImplReadOnly(const DBOptions& options, const std::string& dbname); // No copying allowed DBImplReadOnly(const DBImplReadOnly&) = delete; void operator=(const DBImplReadOnly&) = delete; virtual ~DBImplReadOnly(); // Implementations of the DB interface using DB::Get; virtual Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family, const Slice& key, PinnableSlice* value) override; Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family, const Slice& key, PinnableSlice* value, std::string* timestamp) override; // TODO: Implement ReadOnly MultiGet? using DBImpl::NewIterator; virtual Iterator* NewIterator(const ReadOptions&, ColumnFamilyHandle* column_family) override; virtual Status NewIterators( const ReadOptions& options, const std::vector& column_families, std::vector* iterators) override; using DBImpl::Put; virtual Status Put(const WriteOptions& /*options*/, ColumnFamilyHandle* /*column_family*/, const Slice& /*key*/, const Slice& /*value*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::PutEntity; Status PutEntity(const WriteOptions& /* options */, ColumnFamilyHandle* /* column_family */, const Slice& /* key */, const WideColumns& /* columns */) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::Merge; virtual Status Merge(const WriteOptions& /*options*/, ColumnFamilyHandle* /*column_family*/, const Slice& /*key*/, const Slice& /*value*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::Delete; virtual Status Delete(const WriteOptions& /*options*/, ColumnFamilyHandle* /*column_family*/, const Slice& /*key*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::SingleDelete; virtual Status SingleDelete(const WriteOptions& /*options*/, ColumnFamilyHandle* /*column_family*/, const Slice& /*key*/) override { return Status::NotSupported("Not supported operation in read only mode."); } virtual Status Write(const WriteOptions& /*options*/, WriteBatch* /*updates*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::CompactRange; virtual Status CompactRange(const CompactRangeOptions& /*options*/, ColumnFamilyHandle* /*column_family*/, const Slice* /*begin*/, const Slice* /*end*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::CompactFiles; virtual Status CompactFiles( const CompactionOptions& /*compact_options*/, ColumnFamilyHandle* /*column_family*/, const std::vector& /*input_file_names*/, const int /*output_level*/, const int /*output_path_id*/ = -1, std::vector* const /*output_file_names*/ = nullptr, CompactionJobInfo* /*compaction_job_info*/ = nullptr) override { return Status::NotSupported("Not supported operation in read only mode."); } virtual Status DisableFileDeletions() override { return Status::NotSupported("Not supported operation in read only mode."); } virtual Status EnableFileDeletions(bool /*force*/) override { return Status::NotSupported("Not supported operation in read only mode."); } virtual Status GetLiveFiles(std::vector& ret, uint64_t* manifest_file_size, bool /*flush_memtable*/) override { return DBImpl::GetLiveFiles(ret, manifest_file_size, false /* flush_memtable */); } using DBImpl::Flush; virtual Status Flush(const FlushOptions& /*options*/, ColumnFamilyHandle* /*column_family*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DBImpl::SyncWAL; virtual Status SyncWAL() override { return Status::NotSupported("Not supported operation in read only mode."); } using DB::IngestExternalFile; virtual Status IngestExternalFile( ColumnFamilyHandle* /*column_family*/, const std::vector& /*external_files*/, const IngestExternalFileOptions& /*ingestion_options*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DB::CreateColumnFamilyWithImport; virtual Status CreateColumnFamilyWithImport( const ColumnFamilyOptions& /*options*/, const std::string& /*column_family_name*/, const ImportColumnFamilyOptions& /*import_options*/, const ExportImportFilesMetaData& /*metadata*/, ColumnFamilyHandle** /*handle*/) override { return Status::NotSupported("Not supported operation in read only mode."); } using DB::ClipColumnFamily; virtual Status ClipColumnFamily(ColumnFamilyHandle* /*column_family*/, const Slice& /*begin*/, const Slice& /*end*/) override { return Status::NotSupported("Not supported operation in read only mode."); } // FIXME: some missing overrides for more "write" functions protected: Status FlushForGetLiveFiles() override { // No-op for read-only DB return Status::OK(); } private: // A "helper" function for DB::OpenForReadOnly without column families // to reduce unnecessary I/O // It has the same functionality as DB::OpenForReadOnly with column families // but does not check the existence of dbname in the file system static Status OpenForReadOnlyWithoutCheck( const DBOptions& db_options, const std::string& dbname, const std::vector& column_families, std::vector* handles, DB** dbptr, bool error_if_wal_file_exists = false); friend class DB; }; } // namespace ROCKSDB_NAMESPACE