|
Packit |
807167 |
/*************************************************************************************************
|
|
Packit |
807167 |
* The command line utility of the polymorphic database
|
|
Packit |
807167 |
* Copyright (C) 2009-2012 FAL Labs
|
|
Packit |
807167 |
* This file is part of Kyoto Cabinet.
|
|
Packit |
807167 |
* This program is free software: you can redistribute it and/or modify it under the terms of
|
|
Packit |
807167 |
* the GNU General Public License as published by the Free Software Foundation, either version
|
|
Packit |
807167 |
* 3 of the License, or any later version.
|
|
Packit |
807167 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
Packit |
807167 |
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
807167 |
* See the GNU General Public License for more details.
|
|
Packit |
807167 |
* You should have received a copy of the GNU General Public License along with this program.
|
|
Packit |
807167 |
* If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
807167 |
*************************************************************************************************/
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
#include <kcpolydb.h>
|
|
Packit |
807167 |
#include "cmdcommon.h"
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// global variables
|
|
Packit |
807167 |
const char* g_progname; // program name
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// function prototypes
|
|
Packit |
807167 |
int main(int argc, char** argv);
|
|
Packit |
807167 |
static void usage();
|
|
Packit |
807167 |
static void dberrprint(kc::BasicDB* db, const char* info);
|
|
Packit |
807167 |
static int32_t runcreate(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runinform(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runset(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runremove(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runget(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runlist(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runclear(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runimport(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runcopy(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t rundump(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runload(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runmerge(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runsetbulk(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runremovebulk(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t rungetbulk(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runcheck(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t proccreate(const char* path, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procinform(const char* path, int32_t oflags, bool st);
|
|
Packit |
807167 |
static int32_t procset(const char* path, const char* kbuf, size_t ksiz,
|
|
Packit |
807167 |
const char* vbuf, size_t vsiz, int32_t oflags, int32_t mode);
|
|
Packit |
807167 |
static int32_t procremove(const char* path, const char* kbuf, size_t ksiz, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procget(const char* path, const char* kbuf, size_t ksiz,
|
|
Packit |
807167 |
int32_t oflags, bool rm, bool px, bool pz);
|
|
Packit |
807167 |
static int32_t proclist(const char* path, const char*kbuf, size_t ksiz, int32_t oflags,
|
|
Packit |
807167 |
int32_t mode, bool des, int64_t max, bool rm, bool pv, bool px);
|
|
Packit |
807167 |
static int32_t procclear(const char* path, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procimport(const char* path, const char* file, int32_t oflags, bool sx);
|
|
Packit |
807167 |
static int32_t proccopy(const char* path, const char* file, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procdump(const char* path, const char* file, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procload(const char* path, const char* file, int32_t oflags);
|
|
Packit |
807167 |
static int32_t procmerge(const char* path, int32_t oflags, kc::PolyDB::MergeMode mode,
|
|
Packit |
807167 |
const std::vector<std::string>& srcpaths);
|
|
Packit |
807167 |
static int32_t procsetbulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::map<std::string, std::string>& recs);
|
|
Packit |
807167 |
static int32_t procremovebulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::vector<std::string>& keys);
|
|
Packit |
807167 |
static int32_t procgetbulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::vector<std::string>& keys, bool px);
|
|
Packit |
807167 |
static int32_t proccheck(const char* path, int32_t oflags);
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// main routine
|
|
Packit |
807167 |
int main(int argc, char** argv) {
|
|
Packit |
807167 |
g_progname = argv[0];
|
|
Packit |
807167 |
kc::setstdiobin();
|
|
Packit |
807167 |
if (argc < 2) usage();
|
|
Packit |
807167 |
int32_t rv = 0;
|
|
Packit |
807167 |
if (!std::strcmp(argv[1], "create")) {
|
|
Packit |
807167 |
rv = runcreate(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "inform")) {
|
|
Packit |
807167 |
rv = runinform(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "set")) {
|
|
Packit |
807167 |
rv = runset(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "remove")) {
|
|
Packit |
807167 |
rv = runremove(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "get")) {
|
|
Packit |
807167 |
rv = runget(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "list")) {
|
|
Packit |
807167 |
rv = runlist(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "clear")) {
|
|
Packit |
807167 |
rv = runclear(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "import")) {
|
|
Packit |
807167 |
rv = runimport(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "copy")) {
|
|
Packit |
807167 |
rv = runcopy(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "dump")) {
|
|
Packit |
807167 |
rv = rundump(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "load")) {
|
|
Packit |
807167 |
rv = runload(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "merge")) {
|
|
Packit |
807167 |
rv = runmerge(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "setbulk")) {
|
|
Packit |
807167 |
rv = runsetbulk(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "removebulk")) {
|
|
Packit |
807167 |
rv = runremovebulk(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "getbulk")) {
|
|
Packit |
807167 |
rv = rungetbulk(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "check")) {
|
|
Packit |
807167 |
rv = runcheck(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "version") || !std::strcmp(argv[1], "--version")) {
|
|
Packit |
807167 |
printversion();
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// print the usage and exit
|
|
Packit |
807167 |
static void usage() {
|
|
Packit |
807167 |
eprintf("%s: the command line utility of the polymorphic database of Kyoto Cabinet\n",
|
|
Packit |
807167 |
g_progname);
|
|
Packit |
807167 |
eprintf("\n");
|
|
Packit |
807167 |
eprintf("usage:\n");
|
|
Packit |
807167 |
eprintf(" %s create [-otr] [-onl|-otl|-onr] path\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s inform [-onl|-otl|-onr] [-st] path\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s set [-onl|-otl|-onr] [-add|-rep|-app|-inci|-incd] [-sx] path key value\n",
|
|
Packit |
807167 |
g_progname);
|
|
Packit |
807167 |
eprintf(" %s remove [-onl|-otl|-onr] [-sx] path key\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s get [-onl|-otl|-onr] [-rm] [-sx] [-px] [-pz] path key\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s list [-onl|-otl|-onr] [-mp|-mr|-ms] [-des] [-max num] [-rm] [-sx] [-pv] [-px]"
|
|
Packit |
807167 |
" path [key]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s clear [-onl|-otl|-onr] path\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s import [-onl|-otl|-onr] [-sx] path [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s copy [-onl|-otl|-onr] path file\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s dump [-onl|-otl|-onr] path [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s load [-otr] [-onl|-otl|-onr] path [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s merge [-onl|-otl|-onr] [-add|-rep|-app] path src...\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s setbulk [-onl|-otl|-onr] [-sx] path key value ...\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s removebulk [-onl|-otl|-onr] [-sx] path key ...\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s getbulk [-onl|-otl|-onr] [-sx] [-px] path key ...\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s check [-onl|-otl|-onr] path\n", g_progname);
|
|
Packit |
807167 |
eprintf("\n");
|
|
Packit |
807167 |
std::exit(1);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// print error message of database
|
|
Packit |
807167 |
static void dberrprint(kc::BasicDB* db, const char* info) {
|
|
Packit |
807167 |
const kc::BasicDB::Error& err = db->error();
|
|
Packit |
807167 |
eprintf("%s: %s: %s: %d: %s: %s\n",
|
|
Packit |
807167 |
g_progname, info, db->path().c_str(), err.code(), err.name(), err.message());
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of create command
|
|
Packit |
807167 |
static int32_t runcreate(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRUNCATE;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = proccreate(path, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of inform command
|
|
Packit |
807167 |
static int32_t runinform(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool st = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-st")) {
|
|
Packit |
807167 |
st = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procinform(path, oflags, st);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of set command
|
|
Packit |
807167 |
static int32_t runset(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* kstr = NULL;
|
|
Packit |
807167 |
const char* vstr = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-add")) {
|
|
Packit |
807167 |
mode = 'a';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-rep")) {
|
|
Packit |
807167 |
mode = 'r';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-app")) {
|
|
Packit |
807167 |
mode = 'c';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-inci")) {
|
|
Packit |
807167 |
mode = 'i';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-incd")) {
|
|
Packit |
807167 |
mode = 'd';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!kstr) {
|
|
Packit |
807167 |
kstr = argv[i];
|
|
Packit |
807167 |
} else if (!vstr) {
|
|
Packit |
807167 |
vstr = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path || !kstr || !vstr) usage();
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
char* vbuf;
|
|
Packit |
807167 |
size_t vsiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
vbuf = kc::hexdecode(vstr, &vsiz);
|
|
Packit |
807167 |
vstr = vbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
vsiz = std::strlen(vstr);
|
|
Packit |
807167 |
vbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procset(path, kstr, ksiz, vstr, vsiz, oflags, mode);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
delete[] vbuf;
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of remove command
|
|
Packit |
807167 |
static int32_t runremove(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* kstr = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!kstr) {
|
|
Packit |
807167 |
kstr = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path || !kstr) usage();
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procremove(path, kstr, ksiz, oflags);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of get command
|
|
Packit |
807167 |
static int32_t runget(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* kstr = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool rm = false;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
bool px = false;
|
|
Packit |
807167 |
bool pz = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-rm")) {
|
|
Packit |
807167 |
rm = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-px")) {
|
|
Packit |
807167 |
px = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-pz")) {
|
|
Packit |
807167 |
pz = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!kstr) {
|
|
Packit |
807167 |
kstr = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path || !kstr) usage();
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procget(path, kstr, ksiz, oflags, rm, px, pz);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of list command
|
|
Packit |
807167 |
static int32_t runlist(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* kstr = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
bool des = false;
|
|
Packit |
807167 |
int64_t max = -1;
|
|
Packit |
807167 |
bool rm = false;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
bool pv = false;
|
|
Packit |
807167 |
bool px = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-mp")) {
|
|
Packit |
807167 |
mode = 'p';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-mr")) {
|
|
Packit |
807167 |
mode = 'r';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-ms")) {
|
|
Packit |
807167 |
mode = 's';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-des")) {
|
|
Packit |
807167 |
des = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-max")) {
|
|
Packit |
807167 |
if (++i >= argc) usage();
|
|
Packit |
807167 |
max = kc::atoix(argv[i]);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-rm")) {
|
|
Packit |
807167 |
rm = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-pv")) {
|
|
Packit |
807167 |
pv = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-px")) {
|
|
Packit |
807167 |
px = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!kstr) {
|
|
Packit |
807167 |
kstr = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
char* kbuf = NULL;
|
|
Packit |
807167 |
size_t ksiz = 0;
|
|
Packit |
807167 |
if (kstr) {
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = new char[ksiz+1];
|
|
Packit |
807167 |
std::memcpy(kbuf, kstr, ksiz);
|
|
Packit |
807167 |
kbuf[ksiz] = '\0';
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = proclist(path, kbuf, ksiz, oflags, mode, des, max, rm, pv, px);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of clear command
|
|
Packit |
807167 |
static int32_t runclear(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procclear(path, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of import command
|
|
Packit |
807167 |
static int32_t runimport(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procimport(path, file, oflags, sx);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of copy command
|
|
Packit |
807167 |
static int32_t runcopy(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path || !file) usage();
|
|
Packit |
807167 |
int32_t rv = proccopy(path, file, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of dump command
|
|
Packit |
807167 |
static int32_t rundump(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procdump(path, file, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of load command
|
|
Packit |
807167 |
static int32_t runload(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRUNCATE;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procload(path, file, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of merge command
|
|
Packit |
807167 |
static int32_t runmerge(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
kc::PolyDB::MergeMode mode = kc::PolyDB::MSET;
|
|
Packit |
807167 |
std::vector<std::string> srcpaths;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-add")) {
|
|
Packit |
807167 |
mode = kc::PolyDB::MADD;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-rep")) {
|
|
Packit |
807167 |
mode = kc::PolyDB::MREPLACE;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-app")) {
|
|
Packit |
807167 |
mode = kc::PolyDB::MAPPEND;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
srcpaths.push_back(argv[i]);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path && srcpaths.size() < 1) usage();
|
|
Packit |
807167 |
int32_t rv = procmerge(path, oflags, mode, srcpaths);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of setbulk command
|
|
Packit |
807167 |
static int32_t runsetbulk(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
std::map<std::string, std::string> recs;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
const char* kstr = argv[i];
|
|
Packit |
807167 |
if (++i >= argc) usage();
|
|
Packit |
807167 |
const char* vstr = argv[i];
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
char* vbuf;
|
|
Packit |
807167 |
size_t vsiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
vbuf = kc::hexdecode(vstr, &vsiz);
|
|
Packit |
807167 |
vstr = vbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
vsiz = std::strlen(vstr);
|
|
Packit |
807167 |
vbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::string key(kstr, ksiz);
|
|
Packit |
807167 |
std::string value(vstr, vsiz);
|
|
Packit |
807167 |
recs[key] = value;
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
delete[] vbuf;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procsetbulk(path, oflags, recs);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of removebulk command
|
|
Packit |
807167 |
static int32_t runremovebulk(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
std::vector<std::string> keys;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
const char* kstr = argv[i];
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::string key(kstr, ksiz);
|
|
Packit |
807167 |
keys.push_back(key);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procremovebulk(path, oflags, keys);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of getbulk command
|
|
Packit |
807167 |
static int32_t rungetbulk(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
std::vector<std::string> keys;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
bool sx = false;
|
|
Packit |
807167 |
bool px = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-sx")) {
|
|
Packit |
807167 |
sx = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-px")) {
|
|
Packit |
807167 |
px = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
const char* kstr = argv[i];
|
|
Packit |
807167 |
char* kbuf;
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
kbuf = kc::hexdecode(kstr, &ksiz);
|
|
Packit |
807167 |
kstr = kbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ksiz = std::strlen(kstr);
|
|
Packit |
807167 |
kbuf = NULL;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::string key(kstr, ksiz);
|
|
Packit |
807167 |
keys.push_back(key);
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = procgetbulk(path, oflags, keys, px);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of check command
|
|
Packit |
807167 |
static int32_t runcheck(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* path = NULL;
|
|
Packit |
807167 |
int32_t oflags = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-otl")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::OTRYLOCK;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-onr")) {
|
|
Packit |
807167 |
oflags |= kc::PolyDB::ONOREPAIR;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!path) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
path = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!path) usage();
|
|
Packit |
807167 |
int32_t rv = proccheck(path, oflags);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform create command
|
|
Packit |
807167 |
static int32_t proccreate(const char* path, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | kc::PolyDB::OCREATE | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform inform command
|
|
Packit |
807167 |
static int32_t procinform(const char* path, int32_t oflags, bool st) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (st) {
|
|
Packit |
807167 |
std::map<std::string, std::string> status;
|
|
Packit |
807167 |
if (db.status(&status)) {
|
|
Packit |
807167 |
std::map<std::string, std::string>::iterator it = status.begin();
|
|
Packit |
807167 |
std::map<std::string, std::string>::iterator itend = status.end();
|
|
Packit |
807167 |
while (it != itend) {
|
|
Packit |
807167 |
oprintf("%s: %s\n", it->first.c_str(), it->second.c_str());
|
|
Packit |
807167 |
++it;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::status failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
oprintf("count: %lld\n", (long long)db.count());
|
|
Packit |
807167 |
oprintf("size: %lld\n", (long long)db.size());
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform set command
|
|
Packit |
807167 |
static int32_t procset(const char* path, const char* kbuf, size_t ksiz,
|
|
Packit |
807167 |
const char* vbuf, size_t vsiz, int32_t oflags, int32_t mode) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
default: {
|
|
Packit |
807167 |
if (!db.set(kbuf, ksiz, vbuf, vsiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::set failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'a': {
|
|
Packit |
807167 |
if (!db.add(kbuf, ksiz, vbuf, vsiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::add failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'r': {
|
|
Packit |
807167 |
if (!db.replace(kbuf, ksiz, vbuf, vsiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::replace failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'c': {
|
|
Packit |
807167 |
if (!db.append(kbuf, ksiz, vbuf, vsiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::append failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'i': {
|
|
Packit |
807167 |
int64_t onum = db.increment(kbuf, ksiz, kc::atoi(vbuf));
|
|
Packit |
807167 |
if (onum == kc::INT64MIN) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::increment failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
oprintf("%lld\n", (long long)onum);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'd': {
|
|
Packit |
807167 |
double onum = db.increment_double(kbuf, ksiz, kc::atof(vbuf));
|
|
Packit |
807167 |
if (kc::chknan(onum)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::increment_double failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
oprintf("%f\n", onum);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform remove command
|
|
Packit |
807167 |
static int32_t procremove(const char* path, const char* kbuf, size_t ksiz, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (!db.remove(kbuf, ksiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::remove failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform get command
|
|
Packit |
807167 |
static int32_t procget(const char* path, const char* kbuf, size_t ksiz,
|
|
Packit |
807167 |
int32_t oflags, bool rm, bool px, bool pz) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
uint32_t omode = rm ? kc::PolyDB::OWRITER : kc::PolyDB::OREADER;
|
|
Packit |
807167 |
if (!db.open(path, omode | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
char* vbuf;
|
|
Packit |
807167 |
size_t vsiz;
|
|
Packit |
807167 |
if (rm) {
|
|
Packit |
807167 |
vbuf = db.seize(kbuf, ksiz, &vsiz);
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
vbuf = db.get(kbuf, ksiz, &vsiz);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (vbuf) {
|
|
Packit |
807167 |
printdata(vbuf, vsiz, px);
|
|
Packit |
807167 |
if (!pz) oprintf("\n");
|
|
Packit |
807167 |
delete[] vbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::get failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform list command
|
|
Packit |
807167 |
static int32_t proclist(const char* path, const char*kbuf, size_t ksiz, int32_t oflags,
|
|
Packit |
807167 |
int32_t mode, bool des, int64_t max, bool rm, bool pv, bool px) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
uint32_t omode = rm ? kc::PolyDB::OWRITER : kc::PolyDB::OREADER;
|
|
Packit |
807167 |
if (!db.open(path, omode | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
class VisitorImpl : public kc::DB::Visitor {
|
|
Packit |
807167 |
public:
|
|
Packit |
807167 |
explicit VisitorImpl(bool rm, bool pv, bool px) : rm_(rm), pv_(pv), px_(px) {}
|
|
Packit |
807167 |
private:
|
|
Packit |
807167 |
const char* visit_full(const char* kbuf, size_t ksiz,
|
|
Packit |
807167 |
const char* vbuf, size_t vsiz, size_t* sp) {
|
|
Packit |
807167 |
printdata(kbuf, ksiz, px_);
|
|
Packit |
807167 |
if (pv_) {
|
|
Packit |
807167 |
oprintf("\t");
|
|
Packit |
807167 |
printdata(vbuf, vsiz, px_);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf("\n");
|
|
Packit |
807167 |
return rm_ ? REMOVE : NOP;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool rm_;
|
|
Packit |
807167 |
bool pv_;
|
|
Packit |
807167 |
bool px_;
|
|
Packit |
807167 |
} visitor(rm, pv, px);
|
|
Packit |
807167 |
class Printer {
|
|
Packit |
807167 |
public:
|
|
Packit |
807167 |
static bool print(kc::BasicDB* db, const std::vector<std::string>& keys,
|
|
Packit |
807167 |
bool des, bool rm, bool pv, bool px) {
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (des) {
|
|
Packit |
807167 |
for (int64_t i = (int64_t)keys.size() - 1; i >= 0; i--) {
|
|
Packit |
807167 |
if (!proc_one(db, keys[i], rm, pv, px)) err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
std::vector<std::string>::const_iterator it = keys.begin();
|
|
Packit |
807167 |
std::vector<std::string>::const_iterator itend = keys.end();
|
|
Packit |
807167 |
while (it != itend) {
|
|
Packit |
807167 |
if (!proc_one(db, *it, rm, pv, px)) err = true;
|
|
Packit |
807167 |
++it;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return !err;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
private:
|
|
Packit |
807167 |
static bool proc_one(kc::BasicDB* db, const std::string& key, bool rm, bool pv, bool px) {
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
printdata(key.data(), key.size(), px);
|
|
Packit |
807167 |
if (pv) {
|
|
Packit |
807167 |
size_t vsiz;
|
|
Packit |
807167 |
char* vbuf = db->get(key.data(), key.size(), &vsiz);
|
|
Packit |
807167 |
if (vbuf) {
|
|
Packit |
807167 |
oprintf("\t");
|
|
Packit |
807167 |
printdata(vbuf, vsiz, px);
|
|
Packit |
807167 |
delete[] vbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(db, "DB::get failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf("\n");
|
|
Packit |
807167 |
if (rm && !db->remove(key.data(), key.size())) {
|
|
Packit |
807167 |
dberrprint(db, "DB::remove failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return !err;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
};
|
|
Packit |
807167 |
if (mode == 'p') {
|
|
Packit |
807167 |
std::vector<std::string> keys;
|
|
Packit |
807167 |
if (db.match_prefix(std::string(kbuf, ksiz), &keys, max) >= 0) {
|
|
Packit |
807167 |
if (!Printer::print(&db, keys, des, rm, pv, px)) err = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::match_prefix failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (mode == 'r') {
|
|
Packit |
807167 |
std::vector<std::string> keys;
|
|
Packit |
807167 |
if (db.match_regex(std::string(kbuf, ksiz), &keys, max) >= 0) {
|
|
Packit |
807167 |
if (!Printer::print(&db, keys, des, rm, pv, px)) err = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::match_regex failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (mode == 's') {
|
|
Packit |
807167 |
size_t range = ksiz / 3 + 1;
|
|
Packit |
807167 |
std::vector<std::string> keys;
|
|
Packit |
807167 |
if (db.match_similar(std::string(kbuf, ksiz), range, false, &keys, max) >= 0) {
|
|
Packit |
807167 |
if (!Printer::print(&db, keys, des, rm, pv, px)) err = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::match_similar failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (kbuf || des || max >= 0) {
|
|
Packit |
807167 |
if (max < 0) max = kc::INT64MAX;
|
|
Packit |
807167 |
kc::PolyDB::Cursor cur(&db);
|
|
Packit |
807167 |
if (des) {
|
|
Packit |
807167 |
if (kbuf) {
|
|
Packit |
807167 |
if (!cur.jump_back(kbuf, ksiz) && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::jump failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (!cur.jump_back() && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::jump failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
while (!err && max > 0) {
|
|
Packit |
807167 |
if (!cur.accept(&visitor, rm, true)) {
|
|
Packit |
807167 |
if (db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::accept failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
max--;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (kbuf) {
|
|
Packit |
807167 |
if (!cur.jump(kbuf, ksiz) && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::jump failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (!cur.jump() && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::jump failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
while (!err && max > 0) {
|
|
Packit |
807167 |
if (!cur.accept(&visitor, rm, true)) {
|
|
Packit |
807167 |
if (db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::accept failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
max--;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (!db.iterate(&visitor, rm)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::iterate failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform clear command
|
|
Packit |
807167 |
static int32_t procclear(const char* path, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (!db.clear()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::clear failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform import command
|
|
Packit |
807167 |
static int32_t procimport(const char* path, const char* file, int32_t oflags, bool sx) {
|
|
Packit |
807167 |
std::istream *is = &std::cin;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | kc::PolyDB::OCREATE | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
int64_t cnt = 0;
|
|
Packit |
807167 |
std::string line;
|
|
Packit |
807167 |
std::vector<std::string> fields;
|
|
Packit |
807167 |
while (!err && mygetline(is, &line)) {
|
|
Packit |
807167 |
cnt++;
|
|
Packit |
807167 |
kc::strsplit(line, '\t', &fields);
|
|
Packit |
807167 |
if (sx) {
|
|
Packit |
807167 |
std::vector<std::string>::iterator it = fields.begin();
|
|
Packit |
807167 |
std::vector<std::string>::iterator itend = fields.end();
|
|
Packit |
807167 |
while (it != itend) {
|
|
Packit |
807167 |
size_t esiz;
|
|
Packit |
807167 |
char* ebuf = kc::hexdecode(it->c_str(), &esiz;;
|
|
Packit |
807167 |
it->clear();
|
|
Packit |
807167 |
it->append(ebuf, esiz);
|
|
Packit |
807167 |
delete[] ebuf;
|
|
Packit |
807167 |
++it;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
switch (fields.size()) {
|
|
Packit |
807167 |
case 2: {
|
|
Packit |
807167 |
if (!db.set(fields[0], fields[1])) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::set failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 1: {
|
|
Packit |
807167 |
if (!db.remove(fields[0]) && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::remove failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oputchar('.');
|
|
Packit |
807167 |
if (cnt % 50 == 0) oprintf(" (%lld)\n", (long long)cnt);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (cnt % 50 > 0) oprintf(" (%lld)\n", (long long)cnt);
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform copy command
|
|
Packit |
807167 |
static int32_t proccopy(const char* path, const char* file, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
DotChecker checker(&std::cout, -100);
|
|
Packit |
807167 |
if (!db.copy(file, &checker)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::copy failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!err) oprintf("%lld blocks were copied successfully\n", (long long)checker.count());
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform dump command
|
|
Packit |
807167 |
static int32_t procdump(const char* path, const char* file, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
DotChecker checker(&std::cout, 1000);
|
|
Packit |
807167 |
if (!db.dump_snapshot(file, &checker)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::dump_snapshot");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
if (!err) oprintf("%lld records were dumped successfully\n", (long long)checker.count());
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (!db.dump_snapshot(&std::cout)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::dump_snapshot");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform load command
|
|
Packit |
807167 |
static int32_t procload(const char* path, const char* file, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | kc::PolyDB::OCREATE | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
DotChecker checker(&std::cout, -1000);
|
|
Packit |
807167 |
if (!db.load_snapshot(file, &checker)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::load_snapshot");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
if (!err) oprintf("%lld records were loaded successfully\n", (long long)checker.count());
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
DotChecker checker(&std::cout, -1000);
|
|
Packit |
807167 |
if (!db.load_snapshot(&std::cin)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::load_snapshot");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
if (!err) oprintf("%lld records were loaded successfully\n", (long long)checker.count());
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform merge command
|
|
Packit |
807167 |
static int32_t procmerge(const char* path, int32_t oflags, kc::PolyDB::MergeMode mode,
|
|
Packit |
807167 |
const std::vector<std::string>& srcpaths) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | kc::PolyDB::OCREATE | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
kc::BasicDB** srcary = new kc::BasicDB*[srcpaths.size()];
|
|
Packit |
807167 |
size_t srcnum = 0;
|
|
Packit |
807167 |
std::vector<std::string>::const_iterator it = srcpaths.begin();
|
|
Packit |
807167 |
std::vector<std::string>::const_iterator itend = srcpaths.end();
|
|
Packit |
807167 |
while (it != itend) {
|
|
Packit |
807167 |
const std::string srcpath = *it;
|
|
Packit |
807167 |
kc::PolyDB* srcdb = new kc::PolyDB;
|
|
Packit |
807167 |
if (srcdb->open(srcpath, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
srcary[srcnum++] = srcdb;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(srcdb, "DB::open failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
delete srcdb;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
++it;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
DotChecker checker(&std::cout, 1000);
|
|
Packit |
807167 |
if (!db.merge(srcary, srcnum, mode, &checker)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::merge failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
for (size_t i = 0; i < srcnum; i++) {
|
|
Packit |
807167 |
kc::BasicDB* srcdb = srcary[i];
|
|
Packit |
807167 |
if (!srcdb->close()) {
|
|
Packit |
807167 |
dberrprint(srcdb, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
delete srcdb;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
delete[] srcary;
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!err) oprintf("%lld records were merged successfully\n", (long long)checker.count());
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform setbulk command
|
|
Packit |
807167 |
static int32_t procsetbulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::map<std::string, std::string>& recs) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (db.set_bulk(recs) != (int64_t)recs.size()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::set_bulk failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform removebulk command
|
|
Packit |
807167 |
static int32_t procremovebulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::vector<std::string>& keys) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OWRITER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
if (db.remove_bulk(keys) < 0) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::remove_bulk failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform getbulk command
|
|
Packit |
807167 |
static int32_t procgetbulk(const char* path, int32_t oflags,
|
|
Packit |
807167 |
const std::vector<std::string>& keys, bool px) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
std::map<std::string, std::string> recs;
|
|
Packit |
807167 |
if (db.get_bulk(keys, &recs) >= 0) {
|
|
Packit |
807167 |
std::map<std::string, std::string>::iterator it = recs.begin();
|
|
Packit |
807167 |
std::map<std::string, std::string>::iterator itend = recs.end();
|
|
Packit |
807167 |
while (it != itend) {
|
|
Packit |
807167 |
printdata(it->first.data(), it->first.size(), px);
|
|
Packit |
807167 |
oprintf("\t");
|
|
Packit |
807167 |
printdata(it->second.data(), it->second.size(), px);
|
|
Packit |
807167 |
oprintf("\n");
|
|
Packit |
807167 |
++it;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::get_bulk failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform check command
|
|
Packit |
807167 |
static int32_t proccheck(const char* path, int32_t oflags) {
|
|
Packit |
807167 |
kc::PolyDB db;
|
|
Packit |
807167 |
db.tune_logger(stdlogger(g_progname, &std::cerr));
|
|
Packit |
807167 |
if (!db.open(path, kc::PolyDB::OREADER | oflags)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::open failed");
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
kc::PolyDB::Cursor cur(&db);
|
|
Packit |
807167 |
if (!cur.jump() && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::jump failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int64_t cnt = 0;
|
|
Packit |
807167 |
while (!err) {
|
|
Packit |
807167 |
size_t ksiz;
|
|
Packit |
807167 |
const char* vbuf;
|
|
Packit |
807167 |
size_t vsiz;
|
|
Packit |
807167 |
char* kbuf = cur.get(&ksiz, &vbuf, &vsiz);
|
|
Packit |
807167 |
if (kbuf) {
|
|
Packit |
807167 |
cnt++;
|
|
Packit |
807167 |
size_t rsiz;
|
|
Packit |
807167 |
char* rbuf = db.get(kbuf, ksiz, &rsiz);
|
|
Packit |
807167 |
if (rbuf) {
|
|
Packit |
807167 |
if (rsiz != vsiz || std::memcmp(rbuf, vbuf, rsiz)) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::get failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
delete[] rbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "DB::get failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
delete[] kbuf;
|
|
Packit |
807167 |
if (cnt % 1000 == 0) {
|
|
Packit |
807167 |
oputchar('.');
|
|
Packit |
807167 |
if (cnt % 50000 == 0) oprintf(" (%lld)\n", (long long)cnt);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
if (db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::get failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!cur.step() && db.error() != kc::BasicDB::Error::NOREC) {
|
|
Packit |
807167 |
dberrprint(&db, "Cursor::step failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
oprintf(" (end)\n");
|
|
Packit |
807167 |
if (db.count() != cnt) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::count failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& rpath = db.path();
|
|
Packit |
807167 |
kc::File::Status sbuf;
|
|
Packit |
807167 |
if (kc::File::status(rpath, &sbuf)) {
|
|
Packit |
807167 |
if (!sbuf.isdir && db.size() != sbuf.size) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::size failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
dberrprint(&db, "File::status failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!db.close()) {
|
|
Packit |
807167 |
dberrprint(&db, "DB::close failed");
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!err) oprintf("%lld records were checked successfully\n", (long long)cnt);
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// END OF FILE
|