summaryrefslogtreecommitdiff
path: root/plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc')
-rw-r--r--plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc1531
1 files changed, 0 insertions, 1531 deletions
diff --git a/plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc b/plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc
deleted file mode 100644
index adaff1f84c..0000000000
--- a/plugins/Dbx_kyoto/src/kyotocabinet/kchashmgr.cc
+++ /dev/null
@@ -1,1531 +0,0 @@
-/*************************************************************************************************
- * The command line utility of the file hash database
- * Copyright (C) 2009-2012 FAL Labs
- * This file is part of Kyoto Cabinet.
- * This program is free software: you can redistribute it and/or modify it under the terms of
- * the GNU General Public License as published by the Free Software Foundation, either version
- * 3 of the License, or any later version.
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License along with this program.
- * If not, see <http://www.gnu.org/licenses/>.
- *************************************************************************************************/
-
-
-#include <kchashdb.h>
-#include "cmdcommon.h"
-
-
-// global variables
-const char* g_progname; // program name
-
-
-// function prototypes
-int main(int argc, char** argv);
-static void usage();
-static void dberrprint(kc::BasicDB* db, const char* info);
-static int32_t runcreate(int argc, char** argv);
-static int32_t runinform(int argc, char** argv);
-static int32_t runset(int argc, char** argv);
-static int32_t runremove(int argc, char** argv);
-static int32_t runget(int argc, char** argv);
-static int32_t runlist(int argc, char** argv);
-static int32_t runclear(int argc, char** argv);
-static int32_t runimport(int argc, char** argv);
-static int32_t runcopy(int argc, char** argv);
-static int32_t rundump(int argc, char** argv);
-static int32_t runload(int argc, char** argv);
-static int32_t rundefrag(int argc, char** argv);
-static int32_t runcheck(int argc, char** argv);
-static int32_t runsetbulk(int argc, char** argv);
-static int32_t runremovebulk(int argc, char** argv);
-static int32_t rungetbulk(int argc, char** argv);
-static int32_t proccreate(const char* path, int32_t oflags,
- int32_t apow, int32_t fpow, int32_t opts, int64_t bnum);
-static int32_t procinform(const char* path, int32_t oflags, bool st);
-static int32_t procset(const char* path, const char* kbuf, size_t ksiz,
- const char* vbuf, size_t vsiz, int32_t oflags, int32_t mode);
-static int32_t procremove(const char* path, const char* kbuf, size_t ksiz, int32_t oflags);
-static int32_t procget(const char* path, const char* kbuf, size_t ksiz,
- int32_t oflags, bool rm, bool px, bool pz);
-static int32_t proclist(const char* path, const char*kbuf, size_t ksiz, int32_t oflags,
- int64_t max, bool rm, bool pv, bool px);
-static int32_t procclear(const char* path, int32_t oflags);
-static int32_t procimport(const char* path, const char* file, int32_t oflags, bool sx);
-static int32_t proccopy(const char* path, const char* file, int32_t oflags);
-static int32_t procdump(const char* path, const char* file, int32_t oflags);
-static int32_t procload(const char* path, const char* file, int32_t oflags);
-static int32_t procdefrag(const char* path, int32_t oflags);
-static int32_t procsetbulk(const char* path, int32_t oflags,
- const std::map<std::string, std::string>& recs);
-static int32_t procremovebulk(const char* path, int32_t oflags,
- const std::vector<std::string>& keys);
-static int32_t procgetbulk(const char* path, int32_t oflags,
- const std::vector<std::string>& keys, bool px);
-static int32_t proccheck(const char* path, int32_t oflags);
-
-
-// main routine
-int main(int argc, char** argv) {
- g_progname = argv[0];
- kc::setstdiobin();
- if (argc < 2) usage();
- int32_t rv = 0;
- if (!std::strcmp(argv[1], "create")) {
- rv = runcreate(argc, argv);
- } else if (!std::strcmp(argv[1], "inform")) {
- rv = runinform(argc, argv);
- } else if (!std::strcmp(argv[1], "set")) {
- rv = runset(argc, argv);
- } else if (!std::strcmp(argv[1], "remove")) {
- rv = runremove(argc, argv);
- } else if (!std::strcmp(argv[1], "get")) {
- rv = runget(argc, argv);
- } else if (!std::strcmp(argv[1], "list")) {
- rv = runlist(argc, argv);
- } else if (!std::strcmp(argv[1], "clear")) {
- rv = runclear(argc, argv);
- } else if (!std::strcmp(argv[1], "import")) {
- rv = runimport(argc, argv);
- } else if (!std::strcmp(argv[1], "copy")) {
- rv = runcopy(argc, argv);
- } else if (!std::strcmp(argv[1], "dump")) {
- rv = rundump(argc, argv);
- } else if (!std::strcmp(argv[1], "load")) {
- rv = runload(argc, argv);
- } else if (!std::strcmp(argv[1], "defrag")) {
- rv = rundefrag(argc, argv);
- } else if (!std::strcmp(argv[1], "setbulk")) {
- rv = runsetbulk(argc, argv);
- } else if (!std::strcmp(argv[1], "removebulk")) {
- rv = runremovebulk(argc, argv);
- } else if (!std::strcmp(argv[1], "getbulk")) {
- rv = rungetbulk(argc, argv);
- } else if (!std::strcmp(argv[1], "check")) {
- rv = runcheck(argc, argv);
- } else if (!std::strcmp(argv[1], "version") || !std::strcmp(argv[1], "--version")) {
- printversion();
- } else {
- usage();
- }
- return rv;
-}
-
-
-// print the usage and exit
-static void usage() {
- eprintf("%s: the command line utility of the file hash database of Kyoto Cabinet\n",
- g_progname);
- eprintf("\n");
- eprintf("usage:\n");
- eprintf(" %s create [-otr] [-onl|-otl|-onr] [-apow num] [-fpow num] [-ts] [-tl] [-tc]"
- " [-bnum num] path\n", g_progname);
- eprintf(" %s inform [-onl|-otl|-onr] [-st] path\n", g_progname);
- eprintf(" %s set [-onl|-otl|-onr] [-add|-rep|-app|-inci|-incd] [-sx] path key value\n",
- g_progname);
- eprintf(" %s remove [-onl|-otl|-onr] [-sx] path key\n", g_progname);
- eprintf(" %s get [-onl|-otl|-onr] [-rm] [-sx] [-px] [-pz] path key\n", g_progname);
- eprintf(" %s list [-onl|-otl|-onr] [-max num] [-rm] [-sx] [-pv] [-px] path [key]\n",
- g_progname);
- eprintf(" %s clear [-onl|-otl|-onr] path\n", g_progname);
- eprintf(" %s import [-onl|-otl|-onr] [-sx] path [file]\n", g_progname);
- eprintf(" %s copy [-onl|-otl|-onr] path file\n", g_progname);
- eprintf(" %s dump [-onl|-otl|-onr] path [file]\n", g_progname);
- eprintf(" %s load [-otr] [-onl|-otl|-onr] path [file]\n", g_progname);
- eprintf(" %s defrag [-onl|-otl|-onr] path\n", g_progname);
- eprintf(" %s setbulk [-onl|-otl|-onr] [-sx] path key value ...\n", g_progname);
- eprintf(" %s removebulk [-onl|-otl|-onr] [-sx] path key ...\n", g_progname);
- eprintf(" %s getbulk [-onl|-otl|-onr] [-sx] [-px] path key ...\n", g_progname);
- eprintf(" %s check [-onl|-otl|-onr] path\n", g_progname);
- eprintf("\n");
- std::exit(1);
-}
-
-
-// print error message of database
-static void dberrprint(kc::BasicDB* db, const char* info) {
- const kc::BasicDB::Error& err = db->error();
- eprintf("%s: %s: %s: %d: %s: %s\n",
- g_progname, info, db->path().c_str(), err.code(), err.name(), err.message());
-}
-
-
-// parse arguments of create command
-static int32_t runcreate(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- int32_t oflags = 0;
- int32_t apow = -1;
- int32_t fpow = -1;
- int32_t opts = 0;
- int64_t bnum = -1;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-otr")) {
- oflags |= kc::HashDB::OTRUNCATE;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-apow")) {
- if (++i >= argc) usage();
- apow = kc::atoix(argv[i]);
- } else if (!std::strcmp(argv[i], "-fpow")) {
- if (++i >= argc) usage();
- fpow = kc::atoix(argv[i]);
- } else if (!std::strcmp(argv[i], "-ts")) {
- opts |= kc::HashDB::TSMALL;
- } else if (!std::strcmp(argv[i], "-tl")) {
- opts |= kc::HashDB::TLINEAR;
- } else if (!std::strcmp(argv[i], "-tc")) {
- opts |= kc::HashDB::TCOMPRESS;
- } else if (!std::strcmp(argv[i], "-bnum")) {
- if (++i >= argc) usage();
- bnum = kc::atoix(argv[i]);
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = proccreate(path, oflags, apow, fpow, opts, bnum);
- return rv;
-}
-
-
-// parse arguments of inform command
-static int32_t runinform(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- int32_t oflags = 0;
- bool st = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-st")) {
- st = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procinform(path, oflags, st);
- return rv;
-}
-
-
-// parse arguments of set command
-static int32_t runset(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* kstr = NULL;
- const char* vstr = NULL;
- int32_t oflags = 0;
- int32_t mode = 0;
- bool sx = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-add")) {
- mode = 'a';
- } else if (!std::strcmp(argv[i], "-rep")) {
- mode = 'r';
- } else if (!std::strcmp(argv[i], "-app")) {
- mode = 'c';
- } else if (!std::strcmp(argv[i], "-inci")) {
- mode = 'i';
- } else if (!std::strcmp(argv[i], "-incd")) {
- mode = 'd';
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!kstr) {
- kstr = argv[i];
- } else if (!vstr) {
- vstr = argv[i];
- } else {
- usage();
- }
- }
- if (!path || !kstr || !vstr) usage();
- char* kbuf;
- size_t ksiz;
- char* vbuf;
- size_t vsiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- vbuf = kc::hexdecode(vstr, &vsiz);
- vstr = vbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- vsiz = std::strlen(vstr);
- vbuf = NULL;
- }
- int32_t rv = procset(path, kstr, ksiz, vstr, vsiz, oflags, mode);
- delete[] kbuf;
- delete[] vbuf;
- return rv;
-}
-
-
-// parse arguments of remove command
-static int32_t runremove(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* kstr = NULL;
- int32_t oflags = 0;
- bool sx = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!kstr) {
- kstr = argv[i];
- } else {
- usage();
- }
- }
- if (!path || !kstr) usage();
- char* kbuf;
- size_t ksiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- }
- int32_t rv = procremove(path, kstr, ksiz, oflags);
- delete[] kbuf;
- return rv;
-}
-
-
-// parse arguments of get command
-static int32_t runget(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* kstr = NULL;
- int32_t oflags = 0;
- bool rm = false;
- bool sx = false;
- bool px = false;
- bool pz = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-rm")) {
- rm = true;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else if (!std::strcmp(argv[i], "-px")) {
- px = true;
- } else if (!std::strcmp(argv[i], "-pz")) {
- pz = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!kstr) {
- kstr = argv[i];
- } else {
- usage();
- }
- }
- if (!path || !kstr) usage();
- char* kbuf;
- size_t ksiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- }
- int32_t rv = procget(path, kstr, ksiz, oflags, rm, px, pz);
- delete[] kbuf;
- return rv;
-}
-
-
-// parse arguments of list command
-static int32_t runlist(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* kstr = NULL;
- int32_t oflags = 0;
- int64_t max = -1;
- bool rm = false;
- bool sx = false;
- bool pv = false;
- bool px = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-max")) {
- if (++i >= argc) usage();
- max = kc::atoix(argv[i]);
- } else if (!std::strcmp(argv[i], "-rm")) {
- rm = true;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else if (!std::strcmp(argv[i], "-pv")) {
- pv = true;
- } else if (!std::strcmp(argv[i], "-px")) {
- px = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!kstr) {
- kstr = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- char* kbuf = NULL;
- size_t ksiz = 0;
- if (kstr) {
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = new char[ksiz+1];
- std::memcpy(kbuf, kstr, ksiz);
- kbuf[ksiz] = '\0';
- }
- }
- int32_t rv = proclist(path, kbuf, ksiz, oflags, max, rm, pv, px);
- delete[] kbuf;
- return rv;
-}
-
-
-// parse arguments of clear command
-static int32_t runclear(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procclear(path, oflags);
- return rv;
-}
-
-
-// parse arguments of import command
-static int32_t runimport(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* file = NULL;
- int32_t oflags = 0;
- bool sx = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!file) {
- file = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procimport(path, file, oflags, sx);
- return rv;
-}
-
-
-// parse arguments of copy command
-static int32_t runcopy(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* file = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!file) {
- file = argv[i];
- } else {
- usage();
- }
- }
- if (!path || !file) usage();
- int32_t rv = proccopy(path, file, oflags);
- return rv;
-}
-
-
-// parse arguments of dump command
-static int32_t rundump(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* file = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!file) {
- file = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procdump(path, file, oflags);
- return rv;
-}
-
-
-// parse arguments of load command
-static int32_t runload(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- const char* file = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-otr")) {
- oflags |= kc::HashDB::OTRUNCATE;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else if (!file) {
- file = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procload(path, file, oflags);
- return rv;
-}
-
-
-// parse arguments of defrag command
-static int32_t rundefrag(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = procdefrag(path, oflags);
- return rv;
-}
-
-
-// parse arguments of setbulk command
-static int32_t runsetbulk(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- std::map<std::string, std::string> recs;
- int32_t oflags = 0;
- bool sx = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- const char* kstr = argv[i];
- if (++i >= argc) usage();
- const char* vstr = argv[i];
- char* kbuf;
- size_t ksiz;
- char* vbuf;
- size_t vsiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- vbuf = kc::hexdecode(vstr, &vsiz);
- vstr = vbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- vsiz = std::strlen(vstr);
- vbuf = NULL;
- }
- std::string key(kstr, ksiz);
- std::string value(vstr, vsiz);
- recs[key] = value;
- delete[] kbuf;
- delete[] vbuf;
- }
- }
- if (!path) usage();
- int32_t rv = procsetbulk(path, oflags, recs);
- return rv;
-}
-
-
-// parse arguments of removebulk command
-static int32_t runremovebulk(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- std::vector<std::string> keys;
- int32_t oflags = 0;
- bool sx = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- const char* kstr = argv[i];
- char* kbuf;
- size_t ksiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- }
- std::string key(kstr, ksiz);
- keys.push_back(key);
- delete[] kbuf;
- }
- }
- if (!path) usage();
- int32_t rv = procremovebulk(path, oflags, keys);
- return rv;
-}
-
-
-// parse arguments of getbulk command
-static int32_t rungetbulk(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- std::vector<std::string> keys;
- int32_t oflags = 0;
- bool sx = false;
- bool px = false;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else if (!std::strcmp(argv[i], "-sx")) {
- sx = true;
- } else if (!std::strcmp(argv[i], "-px")) {
- px = true;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- const char* kstr = argv[i];
- char* kbuf;
- size_t ksiz;
- if (sx) {
- kbuf = kc::hexdecode(kstr, &ksiz);
- kstr = kbuf;
- } else {
- ksiz = std::strlen(kstr);
- kbuf = NULL;
- }
- std::string key(kstr, ksiz);
- keys.push_back(key);
- delete[] kbuf;
- }
- }
- if (!path) usage();
- int32_t rv = procgetbulk(path, oflags, keys, px);
- return rv;
-}
-
-
-// parse arguments of check command
-static int32_t runcheck(int argc, char** argv) {
- bool argbrk = false;
- const char* path = NULL;
- int32_t oflags = 0;
- for (int32_t i = 2; i < argc; i++) {
- if (!argbrk && argv[i][0] == '-') {
- if (!std::strcmp(argv[i], "--")) {
- argbrk = true;
- } else if (!std::strcmp(argv[i], "-onl")) {
- oflags |= kc::HashDB::ONOLOCK;
- } else if (!std::strcmp(argv[i], "-otl")) {
- oflags |= kc::HashDB::OTRYLOCK;
- } else if (!std::strcmp(argv[i], "-onr")) {
- oflags |= kc::HashDB::ONOREPAIR;
- } else {
- usage();
- }
- } else if (!path) {
- argbrk = true;
- path = argv[i];
- } else {
- usage();
- }
- }
- if (!path) usage();
- int32_t rv = proccheck(path, oflags);
- return rv;
-}
-
-
-// perform create command
-static int32_t proccreate(const char* path, int32_t oflags,
- int32_t apow, int32_t fpow, int32_t opts, int64_t bnum) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (apow >= 0) db.tune_alignment(apow);
- if (fpow >= 0) db.tune_fbp(fpow);
- if (opts > 0) db.tune_options(opts);
- if (bnum > 0) db.tune_buckets(bnum);
- if (!db.open(path, kc::HashDB::OWRITER | kc::HashDB::OCREATE | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform inform command
-static int32_t procinform(const char* path, int32_t oflags, bool st) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OREADER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (st) {
- std::map<std::string, std::string> status;
- status["opaque"] = "";
- status["fbpnum_used"] = "";
- status["bnum_used"] = "";
- if (db.status(&status)) {
- uint32_t type = kc::atoi(status["type"].c_str());
- oprintf("type: %s (%s) (type=0x%02X)\n",
- kc::BasicDB::typecname(type), kc::BasicDB::typestring(type), type);
- uint32_t rtype = kc::atoi(status["realtype"].c_str());
- if (rtype > 0 && rtype != type)
- oprintf("real type: %s (%s) (realtype=0x%02X)\n",
- kc::BasicDB::typecname(rtype), kc::BasicDB::typestring(rtype), rtype);
- uint32_t chksum = kc::atoi(status["chksum"].c_str());
- oprintf("format version: %s (libver=%s.%s) (chksum=0x%02X)\n", status["fmtver"].c_str(),
- status["libver"].c_str(), status["librev"].c_str(), chksum);
- oprintf("path: %s\n", status["path"].c_str());
- int32_t flags = kc::atoi(status["flags"].c_str());
- oprintf("status flags:");
- if (flags & kc::HashDB::FOPEN) oprintf(" open");
- if (flags & kc::HashDB::FFATAL) oprintf(" fatal");
- oprintf(" (flags=%d)", flags);
- if (kc::atoi(status["recovered"].c_str()) > 0) oprintf(" (recovered)");
- if (kc::atoi(status["reorganized"].c_str()) > 0) oprintf(" (reorganized)");
- if (kc::atoi(status["trimmed"].c_str()) > 0) oprintf(" (trimmed)");
- oprintf("\n", flags);
- int32_t apow = kc::atoi(status["apow"].c_str());
- oprintf("alignment: %d (apow=%d)\n", 1 << apow, apow);
- int32_t fpow = kc::atoi(status["fpow"].c_str());
- int32_t fbpnum = fpow > 0 ? 1 << fpow : 0;
- int32_t fbpused = kc::atoi(status["fbpnum_used"].c_str());
- int64_t frgcnt = kc::atoi(status["frgcnt"].c_str());
- oprintf("free block pool: %d (fpow=%d) (used=%d) (frg=%lld)\n",
- fbpnum, fpow, fbpused, (long long)frgcnt);
- int32_t opts = kc::atoi(status["opts"].c_str());
- oprintf("options:");
- if (opts & kc::HashDB::TSMALL) oprintf(" small");
- if (opts & kc::HashDB::TLINEAR) oprintf(" linear");
- if (opts & kc::HashDB::TCOMPRESS) oprintf(" compress");
- oprintf(" (opts=%d)\n", opts);
- if (status["opaque"].size() >= 16) {
- const char* opaque = status["opaque"].c_str();
- oprintf("opaque:");
- if (std::count(opaque, opaque + 16, 0) != 16) {
- for (int32_t i = 0; i < 16; i++) {
- oprintf(" %02X", ((unsigned char*)opaque)[i]);
- }
- } else {
- oprintf(" 0");
- }
- oprintf("\n");
- }
- int64_t bnum = kc::atoi(status["bnum"].c_str());
- int64_t bnumused = kc::atoi(status["bnum_used"].c_str());
- int64_t count = kc::atoi(status["count"].c_str());
- double load = 0;
- if (count > 0 && bnumused > 0) {
- load = (double)count / bnumused;
- if (!(opts & kc::HashDB::TLINEAR)) load = std::log(load + 1) / std::log(2.0);
- }
- oprintf("buckets: %lld (used=%lld) (load=%.2f)\n",
- (long long)bnum, (long long)bnumused, load);
- std::string cntstr = unitnumstr(count);
- oprintf("count: %lld (%s)\n", count, cntstr.c_str());
- int64_t size = kc::atoi(status["size"].c_str());
- int64_t msiz = kc::atoi(status["msiz"].c_str());
- int64_t realsize = kc::atoi(status["realsize"].c_str());
- std::string sizestr = unitnumstrbyte(size);
- oprintf("size: %lld (%s) (map=%lld)", size, sizestr.c_str(), (long long)msiz);
- if (size != realsize) oprintf(" (gap=%lld)", (long long)(realsize - size));
- oprintf("\n");
- } else {
- dberrprint(&db, "DB::status failed");
- err = true;
- }
- } else {
- uint8_t flags = db.flags();
- if (flags != 0) {
- oprintf("status:");
- if (flags & kc::HashDB::FOPEN) oprintf(" open");
- if (flags & kc::HashDB::FFATAL) oprintf(" fatal");
- oprintf("\n");
- }
- oprintf("count: %lld\n", (long long)db.count());
- oprintf("size: %lld\n", (long long)db.size());
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform set command
-static int32_t procset(const char* path, const char* kbuf, size_t ksiz,
- const char* vbuf, size_t vsiz, int32_t oflags, int32_t mode) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- switch (mode) {
- default: {
- if (!db.set(kbuf, ksiz, vbuf, vsiz)) {
- dberrprint(&db, "DB::set failed");
- err = true;
- }
- break;
- }
- case 'a': {
- if (!db.add(kbuf, ksiz, vbuf, vsiz)) {
- dberrprint(&db, "DB::add failed");
- err = true;
- }
- break;
- }
- case 'r': {
- if (!db.replace(kbuf, ksiz, vbuf, vsiz)) {
- dberrprint(&db, "DB::replace failed");
- err = true;
- }
- break;
- }
- case 'c': {
- if (!db.append(kbuf, ksiz, vbuf, vsiz)) {
- dberrprint(&db, "DB::append failed");
- err = true;
- }
- break;
- }
- case 'i': {
- int64_t onum = db.increment(kbuf, ksiz, kc::atoi(vbuf));
- if (onum == kc::INT64MIN) {
- dberrprint(&db, "DB::increment failed");
- err = true;
- } else {
- oprintf("%lld\n", (long long)onum);
- }
- break;
- }
- case 'd': {
- double onum = db.increment_double(kbuf, ksiz, kc::atof(vbuf));
- if (kc::chknan(onum)) {
- dberrprint(&db, "DB::increment_double failed");
- err = true;
- } else {
- oprintf("%f\n", onum);
- }
- break;
- }
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform remove command
-static int32_t procremove(const char* path, const char* kbuf, size_t ksiz, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (!db.remove(kbuf, ksiz)) {
- dberrprint(&db, "DB::remove failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform get command
-static int32_t procget(const char* path, const char* kbuf, size_t ksiz,
- int32_t oflags, bool rm, bool px, bool pz) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- uint32_t omode = rm ? kc::HashDB::OWRITER : kc::HashDB::OREADER;
- if (!db.open(path, omode | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- char* vbuf;
- size_t vsiz;
- if (rm) {
- vbuf = db.seize(kbuf, ksiz, &vsiz);
- } else {
- vbuf = db.get(kbuf, ksiz, &vsiz);
- }
- if (vbuf) {
- printdata(vbuf, vsiz, px);
- if (!pz) oprintf("\n");
- delete[] vbuf;
- } else {
- dberrprint(&db, "DB::get failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform list command
-static int32_t proclist(const char* path, const char*kbuf, size_t ksiz, int32_t oflags,
- int64_t max, bool rm, bool pv, bool px) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- uint32_t omode = rm ? kc::HashDB::OWRITER : kc::HashDB::OREADER;
- if (!db.open(path, omode | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- class VisitorImpl : public kc::DB::Visitor {
- public:
- explicit VisitorImpl(bool rm, bool pv, bool px) : rm_(rm), pv_(pv), px_(px) {}
- private:
- const char* visit_full(const char* kbuf, size_t ksiz,
- const char* vbuf, size_t vsiz, size_t* sp) {
- printdata(kbuf, ksiz, px_);
- if (pv_) {
- oprintf("\t");
- printdata(vbuf, vsiz, px_);
- }
- oprintf("\n");
- return rm_ ? REMOVE : NOP;
- }
- bool rm_;
- bool pv_;
- bool px_;
- } visitor(rm, pv, px);
- if (kbuf || max >= 0) {
- if (max < 0) max = kc::INT64MAX;
- kc::HashDB::Cursor cur(&db);
- if (kbuf) {
- if (!cur.jump(kbuf, ksiz) && db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "Cursor::jump failed");
- err = true;
- }
- } else {
- if (!cur.jump() && db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "Cursor::jump failed");
- err = true;
- }
- }
- while (!err && max > 0) {
- if (!cur.accept(&visitor, rm, true)) {
- if (db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "Cursor::accept failed");
- err = true;
- }
- break;
- }
- max--;
- }
- } else {
- if (!db.iterate(&visitor, rm)) {
- dberrprint(&db, "DB::iterate failed");
- err = true;
- }
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform clear command
-static int32_t procclear(const char* path, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (!db.clear()) {
- dberrprint(&db, "DB::clear failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform import command
-static int32_t procimport(const char* path, const char* file, int32_t oflags, bool sx) {
- std::istream *is = &std::cin;
- std::ifstream ifs;
- if (file) {
- ifs.open(file, std::ios_base::in | std::ios_base::binary);
- if (!ifs) {
- eprintf("%s: %s: open error\n", g_progname, file);
- return 1;
- }
- is = &ifs;
- }
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | kc::HashDB::OCREATE | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- int64_t cnt = 0;
- std::string line;
- std::vector<std::string> fields;
- while (!err && mygetline(is, &line)) {
- cnt++;
- kc::strsplit(line, '\t', &fields);
- if (sx) {
- std::vector<std::string>::iterator it = fields.begin();
- std::vector<std::string>::iterator itend = fields.end();
- while (it != itend) {
- size_t esiz;
- char* ebuf = kc::hexdecode(it->c_str(), &esiz);
- it->clear();
- it->append(ebuf, esiz);
- delete[] ebuf;
- ++it;
- }
- }
- switch (fields.size()) {
- case 2: {
- if (!db.set(fields[0], fields[1])) {
- dberrprint(&db, "DB::set failed");
- err = true;
- }
- break;
- }
- case 1: {
- if (!db.remove(fields[0]) && db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "DB::remove failed");
- err = true;
- }
- break;
- }
- }
- oputchar('.');
- if (cnt % 50 == 0) oprintf(" (%lld)\n", (long long)cnt);
- }
- if (cnt % 50 > 0) oprintf(" (%lld)\n", (long long)cnt);
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform copy command
-static int32_t proccopy(const char* path, const char* file, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OREADER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- DotChecker checker(&std::cout, -100);
- if (!db.copy(file, &checker)) {
- dberrprint(&db, "DB::copy failed");
- err = true;
- }
- oprintf(" (end)\n");
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- if (!err) oprintf("%lld blocks were copied successfully\n", (long long)checker.count());
- return err ? 1 : 0;
-}
-
-
-// perform dump command
-static int32_t procdump(const char* path, const char* file, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OREADER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (file) {
- DotChecker checker(&std::cout, 1000);
- if (!db.dump_snapshot(file)) {
- dberrprint(&db, "DB::dump_snapshot");
- err = true;
- }
- oprintf(" (end)\n");
- if (!err) oprintf("%lld records were dumped successfully\n", (long long)checker.count());
- } else {
- if (!db.dump_snapshot(&std::cout)) {
- dberrprint(&db, "DB::dump_snapshot");
- err = true;
- }
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform load command
-static int32_t procload(const char* path, const char* file, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | kc::HashDB::OCREATE | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (file) {
- DotChecker checker(&std::cout, -1000);
- if (!db.load_snapshot(file)) {
- dberrprint(&db, "DB::load_snapshot");
- err = true;
- }
- oprintf(" (end)\n");
- if (!err) oprintf("%lld records were loaded successfully\n", (long long)checker.count());
- } else {
- DotChecker checker(&std::cout, -1000);
- if (!db.load_snapshot(&std::cin)) {
- dberrprint(&db, "DB::load_snapshot");
- err = true;
- }
- oprintf(" (end)\n");
- if (!err) oprintf("%lld records were loaded successfully\n", (long long)checker.count());
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform defrag command
-static int32_t procdefrag(const char* path, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (!db.defrag(0)) {
- dberrprint(&db, "DB::defrag failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform setbulk command
-static int32_t procsetbulk(const char* path, int32_t oflags,
- const std::map<std::string, std::string>& recs) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (db.set_bulk(recs) != (int64_t)recs.size()) {
- dberrprint(&db, "DB::set_bulk failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform removebulk command
-static int32_t procremovebulk(const char* path, int32_t oflags,
- const std::vector<std::string>& keys) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OWRITER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- if (db.remove_bulk(keys) < 0) {
- dberrprint(&db, "DB::remove_bulk failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform getbulk command
-static int32_t procgetbulk(const char* path, int32_t oflags,
- const std::vector<std::string>& keys, bool px) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OREADER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- std::map<std::string, std::string> recs;
- if (db.get_bulk(keys, &recs) >= 0) {
- std::map<std::string, std::string>::iterator it = recs.begin();
- std::map<std::string, std::string>::iterator itend = recs.end();
- while (it != itend) {
- printdata(it->first.data(), it->first.size(), px);
- oprintf("\t");
- printdata(it->second.data(), it->second.size(), px);
- oprintf("\n");
- ++it;
- }
- } else {
- dberrprint(&db, "DB::get_bulk failed");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- return err ? 1 : 0;
-}
-
-
-// perform check command
-static int32_t proccheck(const char* path, int32_t oflags) {
- kc::HashDB db;
- db.tune_logger(stdlogger(g_progname, &std::cerr));
- if (!db.open(path, kc::HashDB::OREADER | oflags)) {
- dberrprint(&db, "DB::open failed");
- return 1;
- }
- bool err = false;
- kc::HashDB::Cursor cur(&db);
- if (!cur.jump() && db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "DB::jump failed");
- err = true;
- }
- int64_t cnt = 0;
- while (!err) {
- size_t ksiz;
- const char* vbuf;
- size_t vsiz;
- char* kbuf = cur.get(&ksiz, &vbuf, &vsiz);
- if (kbuf) {
- cnt++;
- size_t rsiz;
- char* rbuf = db.get(kbuf, ksiz, &rsiz);
- if (rbuf) {
- if (rsiz != vsiz || std::memcmp(rbuf, vbuf, rsiz)) {
- dberrprint(&db, "DB::get failed");
- err = true;
- }
- delete[] rbuf;
- } else {
- dberrprint(&db, "DB::get failed");
- err = true;
- }
- delete[] kbuf;
- if (cnt % 1000 == 0) {
- oputchar('.');
- if (cnt % 50000 == 0) oprintf(" (%lld)\n", (long long)cnt);
- }
- } else {
- if (db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "Cursor::get failed");
- err = true;
- }
- break;
- }
- if (!cur.step() && db.error() != kc::BasicDB::Error::NOREC) {
- dberrprint(&db, "Cursor::step failed");
- err = true;
- }
- }
- oprintf(" (end)\n");
- if (db.count() != cnt) {
- dberrprint(&db, "DB::count failed");
- err = true;
- }
- kc::File::Status sbuf;
- if (kc::File::status(path, &sbuf)) {
- if (db.size() != sbuf.size && sbuf.size % (1 << 20) != 0) {
- dberrprint(&db, "DB::size failed");
- err = true;
- }
- } else {
- dberrprint(&db, "File::status failed");
- err = true;
- }
- if (db.flags() & kc::HashDB::FFATAL) {
- dberrprint(&db, "DB::flags indicated fatal error");
- err = true;
- }
- if (!db.close()) {
- dberrprint(&db, "DB::close failed");
- err = true;
- }
- if (!err) oprintf("%lld records were checked successfully\n", (long long)cnt);
- return err ? 1 : 0;
-}
-
-
-
-// END OF FILE