service/tools/kv/api_tools/kv_service_tools.cpp (245 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <fcntl.h>
#include <getopt.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fstream>
#include "common/proto/signature_info.pb.h"
#include "interface/kv/kv_client.h"
#include "platform/config/resdb_config_utils.h"
using resdb::GenerateReplicaInfo;
using resdb::GenerateResDBConfig;
using resdb::KVClient;
using resdb::ReplicaInfo;
using resdb::ResDBConfig;
void ShowUsage() {
printf(
"--config: config path\n"
"--cmd "
"set/get/set_with_version/get_with_version/get_key_range/"
"get_key_range_with_version/get_top/get_history\n"
"--key key\n"
"--value value, if cmd is a get operation\n"
"--version version of the value, if cmd is vesion based\n"
"--min_key the min key if cmd is get_key_range\n"
"--max_key the max key if cmd is get_key_range\n"
"--min_version, if cmd is get_history\n"
"--max_version, if cmd is get_history\n"
"--top, if cmd is get_top\n"
"\n"
"More examples can be found from README.\n");
}
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"config", required_argument, NULL, 'c'},
{"cmd", required_argument, NULL, 'f'},
{"key", required_argument, NULL, 'K'},
{"value", required_argument, NULL, 'V'},
{"version", required_argument, NULL, 'v'},
{"min_version", required_argument, NULL, 's'},
{"max_version", required_argument, NULL, 'S'},
{"min_key", required_argument, NULL, 'y'},
{"max_key", required_argument, NULL, 'Y'},
{"top", required_argument, NULL, 't'},
};
void OldAPI(char** argv) {
std::string client_config_file = argv[1];
std::string cmd = argv[2];
std::string key;
if (cmd != "getvalues") {
key = argv[3];
}
std::string value;
if (cmd == "set") {
value = argv[4];
}
std::string key2;
if (cmd == "getrange") {
key2 = argv[4];
}
ResDBConfig config = GenerateResDBConfig(client_config_file);
config.SetClientTimeoutMs(100000);
KVClient client(config);
if (cmd == "set") {
int ret = client.Set(key, value);
printf("client set ret = %d\n", ret);
} else if (cmd == "get") {
auto res = client.Get(key);
if (res != nullptr) {
printf("client get value = %s\n", res->c_str());
} else {
printf("client get value fail\n");
}
} else if (cmd == "getvalues") {
auto res = client.GetAllValues();
if (res != nullptr) {
printf("client getvalues value = %s\n", res->c_str());
} else {
printf("client getvalues value fail\n");
}
} else if (cmd == "getrange") {
auto res = client.GetRange(key, key2);
if (res != nullptr) {
printf("client getrange value = %s\n", res->c_str());
} else {
printf("client getrange value fail\n");
}
}
}
int main(int argc, char** argv) {
std::string key;
int version = -1;
int option_index = 0;
int min_version = -1, max_version = -1;
std::string min_key, max_key;
std::string value;
std::string client_config_file;
int top = 0;
char c;
std::string cmd;
if (argc >= 3) {
cmd = argv[2];
if (cmd == "get" || cmd == "set" || cmd == "getvalues" ||
cmd == "getrange") {
OldAPI(argv);
return 0;
}
}
while ((c = getopt_long(argc, argv, "h", long_options, &option_index)) !=
-1) {
switch (c) {
case 'c':
client_config_file = optarg;
break;
case 'f':
cmd = optarg;
break;
case 'K':
key = optarg;
break;
case 'V':
value = optarg;
break;
case 'v':
version = strtoull(optarg, NULL, 10);
break;
case 's':
min_version = strtoull(optarg, NULL, 10);
break;
case 'S':
max_version = strtoull(optarg, NULL, 10);
break;
case 'y':
min_key = optarg;
break;
case 'Y':
max_key = optarg;
break;
case 't':
top = strtoull(optarg, NULL, 10);
break;
case 'h':
ShowUsage();
break;
}
}
ResDBConfig config = GenerateResDBConfig(client_config_file);
config.SetClientTimeoutMs(100000);
KVClient client(config);
if (cmd == "set_with_version") {
if (key.empty() || value.empty() || version < 0) {
ShowUsage();
return 0;
}
int ret = client.Set(key, value, version);
printf("set key = %s, value = %s, version = %d done, ret = %d\n",
key.c_str(), value.c_str(), version, ret);
if (ret == 0) {
usleep(100000);
auto res = client.Get(key, 0);
if (res != nullptr) {
printf("current value = %s\n", res->DebugString().c_str());
} else {
printf("get value fail\n");
}
}
} else if (cmd == "set") {
if (key.empty() || value.empty()) {
ShowUsage();
return 0;
}
int ret = client.Set(key, value);
printf("set key = %s, value = %s done, ret = %d\n", key.c_str(),
value.c_str(), ret);
} else if (cmd == "get_with_version") {
auto res = client.Get(key, version);
if (res != nullptr) {
printf("get key = %s, value = %s\n", key.c_str(),
res->DebugString().c_str());
} else {
printf("get value fail\n");
}
} else if (cmd == "get") {
auto res = client.Get(key);
if (res != nullptr) {
printf("get key = %s value = %s\n", key.c_str(), res->c_str());
} else {
printf("get value fail\n");
}
} else if (cmd == "get_top") {
auto res = client.GetKeyTopHistory(key, top);
if (res != nullptr) {
printf("key = %s, top %d\n value = %s\n", key.c_str(), top,
res->DebugString().c_str());
} else {
printf("get key = %s top %d value fail\n", key.c_str(), top);
}
} else if (cmd == "get_history") {
if (key.empty() || min_version < 0 || max_version < 0 ||
max_version < min_version) {
ShowUsage();
return 0;
}
auto res = client.GetKeyHistory(key, min_version, max_version);
if (res != nullptr) {
printf(
"get history key = %s, min version = %d, max version = %d\n value = "
"%s\n",
key.c_str(), min_version, max_version, res->DebugString().c_str());
} else {
printf(
"get history key = %s, min version = %d, max version = %d value "
"fail\n",
key.c_str(), min_version, max_version);
}
} else if (cmd == "get_key_range") {
if (min_key.empty() || max_key.empty() || min_key > max_key) {
ShowUsage();
return 0;
}
auto res = client.GetRange(min_key, max_key);
if (res != nullptr) {
printf("getrange min key = %s, max key = %s\n value = %s\n",
min_key.c_str(), max_key.c_str(), (*res).c_str());
} else {
printf("getrange value fail, min key = %s, max key = %s\n",
min_key.c_str(), max_key.c_str());
}
} else if (cmd == "get_key_range_with_version") {
if (min_key.empty() || max_key.empty() || min_key > max_key) {
ShowUsage();
return 0;
}
printf("min key = %s max key = %s\n", min_key.c_str(), max_key.c_str());
auto res = client.GetKeyRange(min_key, max_key);
if (res != nullptr) {
printf("getrange min key = %s, max key = %s\n value = %s\n",
min_key.c_str(), max_key.c_str(), res->DebugString().c_str());
} else {
printf("getrange value fail, min key = %s, max key = %s\n",
min_key.c_str(), max_key.c_str());
}
} else {
ShowUsage();
}
}