// 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 #include "options/options_helper.h" #include "options/options_sanity_check.h" #include "rocksdb/env.h" #include "rocksdb/options.h" #include "table/block_based_table_factory.h" namespace rocksdb { #ifndef ROCKSDB_LITE #define ROCKSDB_OPTION_FILE_MAJOR 1 #define ROCKSDB_OPTION_FILE_MINOR 1 enum OptionSection : char { kOptionSectionVersion = 0, kOptionSectionDBOptions, kOptionSectionCFOptions, kOptionSectionTableOptions, kOptionSectionUnknown }; static const std::string opt_section_titles[] = { "Version", "DBOptions", "CFOptions", "TableOptions/", "Unknown"}; Status PersistRocksDBOptions(const DBOptions& db_opt, const std::vector& cf_names, const std::vector& cf_opts, const std::string& file_name, Env* env); extern bool AreEqualOptions( const char* opt1, const char* opt2, const OptionTypeInfo& type_info, const std::string& opt_name, const std::unordered_map* opt_map); class RocksDBOptionsParser { public: explicit RocksDBOptionsParser(); ~RocksDBOptionsParser() {} void Reset(); Status Parse(const std::string& file_name, Env* env, bool ignore_unknown_options = false); static std::string TrimAndRemoveComment(const std::string& line, const bool trim_only = false); const DBOptions* db_opt() const { return &db_opt_; } const std::unordered_map* db_opt_map() const { return &db_opt_map_; } const std::vector* cf_opts() const { return &cf_opts_; } const std::vector* cf_names() const { return &cf_names_; } const std::vector>* cf_opt_maps() const { return &cf_opt_maps_; } const ColumnFamilyOptions* GetCFOptions(const std::string& name) { return GetCFOptionsImpl(name); } size_t NumColumnFamilies() { return cf_opts_.size(); } static Status VerifyRocksDBOptionsFromFile( const DBOptions& db_opt, const std::vector& cf_names, const std::vector& cf_opts, const std::string& file_name, Env* env, OptionsSanityCheckLevel sanity_check_level = kSanityLevelExactMatch, bool ignore_unknown_options = false); static Status VerifyDBOptions( const DBOptions& base_opt, const DBOptions& new_opt, const std::unordered_map* new_opt_map = nullptr, OptionsSanityCheckLevel sanity_check_level = kSanityLevelExactMatch); static Status VerifyCFOptions( const ColumnFamilyOptions& base_opt, const ColumnFamilyOptions& new_opt, const std::unordered_map* new_opt_map = nullptr, OptionsSanityCheckLevel sanity_check_level = kSanityLevelExactMatch); static Status VerifyTableFactory( const TableFactory* base_tf, const TableFactory* file_tf, OptionsSanityCheckLevel sanity_check_level = kSanityLevelExactMatch); static Status ExtraParserCheck(const RocksDBOptionsParser& input_parser); protected: bool IsSection(const std::string& line); Status ParseSection(OptionSection* section, std::string* title, std::string* argument, const std::string& line, const int line_num); Status CheckSection(const OptionSection section, const std::string& section_arg, const int line_num); Status ParseStatement(std::string* name, std::string* value, const std::string& line, const int line_num); Status EndSection(const OptionSection section, const std::string& title, const std::string& section_arg, const std::unordered_map& opt_map, bool ignore_unknown_options); Status ValidityCheck(); Status InvalidArgument(const int line_num, const std::string& message); Status ParseVersionNumber(const std::string& ver_name, const std::string& ver_string, const int max_count, int* version); ColumnFamilyOptions* GetCFOptionsImpl(const std::string& name) { assert(cf_names_.size() == cf_opts_.size()); for (size_t i = 0; i < cf_names_.size(); ++i) { if (cf_names_[i] == name) { return &cf_opts_[i]; } } return nullptr; } private: DBOptions db_opt_; std::unordered_map db_opt_map_; std::vector cf_names_; std::vector cf_opts_; std::vector> cf_opt_maps_; bool has_version_section_; bool has_db_options_; bool has_default_cf_options_; int db_version[3]; int opt_file_version[3]; }; #endif // !ROCKSDB_LITE } // namespace rocksdb