blob: b9eb1035fb2583379a793ff5de29458c8d4f7609 [file] [log] [blame]
// 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
#ifndef ROCKSDB_LITE
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <functional>
#include <map>
#include <sstream>
#include <string>
#include <vector>
#include "rocksdb/env.h"
#include "rocksdb/iterator.h"
#include "rocksdb/ldb_tool.h"
#include "rocksdb/options.h"
#include "rocksdb/slice.h"
#include "rocksdb/utilities/db_ttl.h"
#include "rocksdb/utilities/ldb_cmd_execute_result.h"
namespace rocksdb {
class LDBCommand {
public:
// Command-line arguments
static const std::string ARG_DB;
static const std::string ARG_PATH;
static const std::string ARG_HEX;
static const std::string ARG_KEY_HEX;
static const std::string ARG_VALUE_HEX;
static const std::string ARG_CF_NAME;
static const std::string ARG_TTL;
static const std::string ARG_TTL_START;
static const std::string ARG_TTL_END;
static const std::string ARG_TIMESTAMP;
static const std::string ARG_TRY_LOAD_OPTIONS;
static const std::string ARG_IGNORE_UNKNOWN_OPTIONS;
static const std::string ARG_FROM;
static const std::string ARG_TO;
static const std::string ARG_MAX_KEYS;
static const std::string ARG_BLOOM_BITS;
static const std::string ARG_FIX_PREFIX_LEN;
static const std::string ARG_COMPRESSION_TYPE;
static const std::string ARG_COMPRESSION_MAX_DICT_BYTES;
static const std::string ARG_BLOCK_SIZE;
static const std::string ARG_AUTO_COMPACTION;
static const std::string ARG_DB_WRITE_BUFFER_SIZE;
static const std::string ARG_WRITE_BUFFER_SIZE;
static const std::string ARG_FILE_SIZE;
static const std::string ARG_CREATE_IF_MISSING;
static const std::string ARG_NO_VALUE;
struct ParsedParams {
std::string cmd;
std::vector<std::string> cmd_params;
std::map<std::string, std::string> option_map;
std::vector<std::string> flags;
};
static LDBCommand* SelectCommand(const ParsedParams& parsed_parms);
static LDBCommand* InitFromCmdLineArgs(
const std::vector<std::string>& args, const Options& options,
const LDBOptions& ldb_options,
const std::vector<ColumnFamilyDescriptor>* column_families,
const std::function<LDBCommand*(const ParsedParams&)>& selector =
SelectCommand);
static LDBCommand* InitFromCmdLineArgs(
int argc, char** argv, const Options& options,
const LDBOptions& ldb_options,
const std::vector<ColumnFamilyDescriptor>* column_families);
bool ValidateCmdLineOptions();
virtual Options PrepareOptionsForOpenDB();
virtual void SetDBOptions(Options options) { options_ = options; }
virtual void SetColumnFamilies(
const std::vector<ColumnFamilyDescriptor>* column_families) {
if (column_families != nullptr) {
column_families_ = *column_families;
} else {
column_families_.clear();
}
}
void SetLDBOptions(const LDBOptions& ldb_options) {
ldb_options_ = ldb_options;
}
virtual bool NoDBOpen() { return false; }
virtual ~LDBCommand() { CloseDB(); }
/* Run the command, and return the execute result. */
void Run();
virtual void DoCommand() = 0;
LDBCommandExecuteResult GetExecuteState() { return exec_state_; }
void ClearPreviousRunState() { exec_state_.Reset(); }
// Consider using Slice::DecodeHex directly instead if you don't need the
// 0x prefix
static std::string HexToString(const std::string& str);
// Consider using Slice::ToString(true) directly instead if
// you don't need the 0x prefix
static std::string StringToHex(const std::string& str);
static const char* DELIM;
protected:
LDBCommandExecuteResult exec_state_;
std::string db_path_;
std::string column_family_name_;
DB* db_;
DBWithTTL* db_ttl_;
std::map<std::string, ColumnFamilyHandle*> cf_handles_;
/**
* true implies that this command can work if the db is opened in read-only
* mode.
*/
bool is_read_only_;
/** If true, the key is input/output as hex in get/put/scan/delete etc. */
bool is_key_hex_;
/** If true, the value is input/output as hex in get/put/scan/delete etc. */
bool is_value_hex_;
/** If true, the value is treated as timestamp suffixed */
bool is_db_ttl_;
// If true, the kvs are output with their insert/modify timestamp in a ttl db
bool timestamp_;
// If true, try to construct options from DB's option files.
bool try_load_options_;
bool ignore_unknown_options_;
bool create_if_missing_;
/**
* Map of options passed on the command-line.
*/
const std::map<std::string, std::string> option_map_;
/**
* Flags passed on the command-line.
*/
const std::vector<std::string> flags_;
/** List of command-line options valid for this command */
const std::vector<std::string> valid_cmd_line_options_;
bool ParseKeyValue(const std::string& line, std::string* key,
std::string* value, bool is_key_hex, bool is_value_hex);
LDBCommand(const std::map<std::string, std::string>& options,
const std::vector<std::string>& flags, bool is_read_only,
const std::vector<std::string>& valid_cmd_line_options);
void OpenDB();
void CloseDB();
ColumnFamilyHandle* GetCfHandle();
static std::string PrintKeyValue(const std::string& key,
const std::string& value, bool is_key_hex,
bool is_value_hex);
static std::string PrintKeyValue(const std::string& key,
const std::string& value, bool is_hex);
/**
* Return true if the specified flag is present in the specified flags vector
*/
static bool IsFlagPresent(const std::vector<std::string>& flags,
const std::string& flag) {
return (std::find(flags.begin(), flags.end(), flag) != flags.end());
}
static std::string HelpRangeCmdArgs();
/**
* A helper function that returns a list of command line options
* used by this command. It includes the common options and the ones
* passed in.
*/
static std::vector<std::string> BuildCmdLineOptions(
std::vector<std::string> options);
bool ParseIntOption(const std::map<std::string, std::string>& options,
const std::string& option, int& value,
LDBCommandExecuteResult& exec_state);
bool ParseStringOption(const std::map<std::string, std::string>& options,
const std::string& option, std::string* value);
Options options_;
std::vector<ColumnFamilyDescriptor> column_families_;
LDBOptions ldb_options_;
private:
/**
* Interpret command line options and flags to determine if the key
* should be input/output in hex.
*/
bool IsKeyHex(const std::map<std::string, std::string>& options,
const std::vector<std::string>& flags);
/**
* Interpret command line options and flags to determine if the value
* should be input/output in hex.
*/
bool IsValueHex(const std::map<std::string, std::string>& options,
const std::vector<std::string>& flags);
/**
* Returns the value of the specified option as a boolean.
* default_val is used if the option is not found in options.
* Throws an exception if the value of the option is not
* "true" or "false" (case insensitive).
*/
bool ParseBooleanOption(const std::map<std::string, std::string>& options,
const std::string& option, bool default_val);
/**
* Converts val to a boolean.
* val must be either true or false (case insensitive).
* Otherwise an exception is thrown.
*/
bool StringToBool(std::string val);
};
class LDBCommandRunner {
public:
static void PrintHelp(const LDBOptions& ldb_options, const char* exec_name);
static void RunCommand(
int argc, char** argv, Options options, const LDBOptions& ldb_options,
const std::vector<ColumnFamilyDescriptor>* column_families);
};
} // namespace rocksdb
#endif // ROCKSDB_LITE