rocksdb/tools/ldb.cc
Zheng Shao be9b862d47 ldb: add "ldb load" command
Summary: This command accepts key-value pairs from stdin with the same format of "ldb dump" command.  This allows us to try out different compression algorithms/block sizes easily.

Test Plan: dump, load, dump, verify the data is the same.

Reviewers: dhruba

Reviewed By: dhruba

CC: leveldb

Differential Revision: https://reviews.facebook.net/D7443
2012-12-19 01:45:59 -08:00

90 lines
2.3 KiB
C++

// Copyright (c) 2012 Facebook. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "util/ldb_cmd.h"
namespace leveldb {
class LDBCommandRunner {
public:
static void PrintHelp(const char* exec_name) {
std::string ret;
ret.append("--- compact ----:\n");
ret.append(exec_name);
ret.append(" compact ");
Compactor::Help(ret);
ret.append("\n--- dump ----:\n");
ret.append(exec_name);
ret.append(" dump ");
DBDumper::Help(ret);
ret.append("\n--- load ----:\n");
ret.append(exec_name);
ret.append(" load ");
DBLoader::Help(ret);
ret.append("\n---reduce_levels ----:\n");
ret.append(exec_name);
ret.append(" reduce_levels ");
ReduceDBLevels::Help(ret);
ret.append("\n---dump_wal----:\n");
ret.append(exec_name);
ret.append(" dump_wal ");
WALDumper::Help(ret);
fprintf(stderr, "%s\n", ret.c_str());
}
static void RunCommand(int argc, char** argv) {
if (argc <= 2) {
PrintHelp(argv[0]);
exit(1);
}
const char* cmd = argv[1];
std::string db_name;
std::vector<std::string> args;
for (int i = 2; i < argc; i++) {
if (strncmp(argv[i], "--db=", strlen("--db=")) == 0) {
db_name = argv[i] + strlen("--db=");
} else {
args.push_back(argv[i]);
}
}
LDBCommand* cmdObj = NULL;
if (strcmp(cmd, "compact") == 0) {
// run compactor
cmdObj = new Compactor(db_name, args);
} else if (strcmp(cmd, "dump") == 0) {
// run dump
cmdObj = new DBDumper(db_name, args);
} else if (strcmp(cmd, "load") == 0) {
// run loader
cmdObj = new DBLoader(db_name, args);
} else if (strcmp(cmd, "reduce_levels") == 0) {
// reduce db levels
cmdObj = new ReduceDBLevels(db_name, args);
} else if (strcmp(cmd, "dump_wal") == 0) {
cmdObj = new WALDumper(args);
} else {
fprintf(stderr, "Unknown command: %s\n", cmd);
PrintHelp(argv[0]);
exit(1);
}
cmdObj->Run();
LDBCommandExecuteResult ret = cmdObj->GetExecuteState();
fprintf(stderr, "%s\n", ret.ToString().c_str());
delete cmdObj;
}
};
}
int main(int argc, char** argv) {
leveldb::LDBCommandRunner::RunCommand(argc, argv);
}