📄 tcamgr.c
字号:
/************************************************************************************************* * The command line utility of the abstract database API * Copyright (C) 2006-2009 Mikio Hirabayashi * This file is part of Tokyo Cabinet. * Tokyo Cabinet is free software; you can redistribute it and/or modify it under the terms of * the GNU Lesser General Public License as published by the Free Software Foundation; either * version 2.1 of the License or any later version. Tokyo Cabinet 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 Lesser General Public * License for more details. * You should have received a copy of the GNU Lesser General Public License along with Tokyo * Cabinet; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA. *************************************************************************************************/#include <tcutil.h>#include <tcbdb.h>#include <tcadb.h>#include "myconf.h"/* global variables */const char *g_progname; // program name/* function prototypes */int main(int argc, char **argv);static void usage(void);static void printerr(TCADB *adb);static int sepstrtochr(const char *str);static char *strtozsv(const char *str, int sep, int *sp);static int printdata(const char *ptr, int size, bool px, int sep);static bool mapbdbproc(void *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, void *op);static int runcreate(int argc, char **argv);static int runinform(int argc, char **argv);static int runput(int argc, char **argv);static int runout(int argc, char **argv);static int runget(int argc, char **argv);static int runlist(int argc, char **argv);static int runoptimize(int argc, char **argv);static int runmisc(int argc, char **argv);static int runmap(int argc, char **argv);static int runversion(int argc, char **argv);static int proccreate(const char *name);static int procinform(const char *name);static int procput(const char *name, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int dmode);static int procout(const char *name, const char *kbuf, int ksiz);static int procget(const char *name, const char *kbuf, int ksiz, int sep, bool px, bool pz);static int proclist(const char *name, int sep, int max, bool pv, bool px, const char *fmstr);static int procoptimize(const char *name, const char *params);static int procmisc(const char *name, const char *func, const TCLIST *args, int sep, bool px);static int procmap(const char *name, const char *dest, const char *fmstr);static int procversion(void);/* main routine */int main(int argc, char **argv){ g_progname = argv[0]; if(argc < 2) usage(); int rv = 0; if(!strcmp(argv[1], "create")){ rv = runcreate(argc, argv); } else if(!strcmp(argv[1], "inform")){ rv = runinform(argc, argv); } else if(!strcmp(argv[1], "put")){ rv = runput(argc, argv); } else if(!strcmp(argv[1], "out")){ rv = runout(argc, argv); } else if(!strcmp(argv[1], "get")){ rv = runget(argc, argv); } else if(!strcmp(argv[1], "list")){ rv = runlist(argc, argv); } else if(!strcmp(argv[1], "optimize")){ rv = runoptimize(argc, argv); } else if(!strcmp(argv[1], "misc")){ rv = runmisc(argc, argv); } else if(!strcmp(argv[1], "map")){ rv = runmap(argc, argv); } else if(!strcmp(argv[1], "version") || !strcmp(argv[1], "--version")){ rv = runversion(argc, argv); } else { usage(); } return rv;}/* print the usage and exit */static void usage(void){ fprintf(stderr, "%s: the command line utility of the abstract database API\n", g_progname); fprintf(stderr, "\n"); fprintf(stderr, "usage:\n"); fprintf(stderr, " %s create name\n", g_progname); fprintf(stderr, " %s inform name\n", g_progname); fprintf(stderr, " %s put [-sx] [-sep chr] [-dk|-dc|-dai|-dad] name key value\n", g_progname); fprintf(stderr, " %s out [-sx] [-sep chr] name key\n", g_progname); fprintf(stderr, " %s get [-sx] [-sep chr] [-px] [-pz] name key\n", g_progname); fprintf(stderr, " %s list [-sep chr] [-m num] [-pv] [-px] [-fm str] name\n", g_progname); fprintf(stderr, " %s optimize name [params]\n", g_progname); fprintf(stderr, " %s misc [-sx] [-sep chr] [-px] name func [arg...]\n", g_progname); fprintf(stderr, " %s map [-fm str] name dest\n", g_progname); fprintf(stderr, " %s version\n", g_progname); fprintf(stderr, "\n"); exit(1);}/* get the character of separation string */static int sepstrtochr(const char *str){ if(!strcmp(str, "\\t")) return '\t'; if(!strcmp(str, "\\r")) return '\r'; if(!strcmp(str, "\\n")) return '\n'; return *(unsigned char *)str;}/* encode a string as a zero separaterd string */static char *strtozsv(const char *str, int sep, int *sp){ int size = strlen(str); char *buf = tcmemdup(str, size); for(int i = 0; i < size; i++){ if(buf[i] == sep) buf[i] = '\0'; } *sp = size; return buf;}/* print error information */static void printerr(TCADB *adb){ const char *path = tcadbpath(adb); fprintf(stderr, "%s: %s: error\n", g_progname, path ? path : "-");}/* print record data */static int printdata(const char *ptr, int size, bool px, int sep){ int len = 0; while(size-- > 0){ if(px){ if(len > 0) putchar(' '); len += printf("%02X", *(unsigned char *)ptr); } else if(sep > 0){ if(*ptr == '\0'){ putchar(sep); } else { putchar(*ptr); } len++; } else { putchar(*ptr); len++; } ptr++; } return len;}/* mapping function */static bool mapbdbproc(void *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, void *op){ bool err = false; if(!tcadbmapbdbemit(map, kbuf, ksiz, vbuf, vsiz)) err = true; return !err;}/* parse arguments of create command */static int runcreate(int argc, char **argv){ char *name = NULL; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ usage(); } else if(!name){ name = argv[i]; } else { usage(); } } if(!name) usage(); int rv = proccreate(name); return rv;}/* parse arguments of inform command */static int runinform(int argc, char **argv){ char *name = NULL; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ usage(); } else if(!name){ name = argv[i]; } else { usage(); } } if(!name) usage(); name = tcsprintf("%s#mode=r", name); int rv = procinform(name); tcfree(name); return rv;}/* parse arguments of put command */static int runput(int argc, char **argv){ char *name = NULL; char *key = NULL; char *value = NULL; int dmode = 0; bool sx = false; int sep = -1; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-dk")){ dmode = -1; } else if(!strcmp(argv[i], "-dc")){ dmode = 1; } else if(!strcmp(argv[i], "-dai")){ dmode = 10; } else if(!strcmp(argv[i], "-dad")){ dmode = 11; } else if(!strcmp(argv[i], "-sx")){ sx = true; } else if(!strcmp(argv[i], "-sep")){ if(++i >= argc) usage(); sep = sepstrtochr(argv[i]); } else { usage(); } } else if(!name){ name = argv[i]; } else if(!key){ key = argv[i]; } else if(!value){ value = argv[i]; } else { usage(); } } if(!name || !key || !value) usage(); char *kbuf, *vbuf; int ksiz, vsiz; if(sx){ kbuf = tchexdecode(key, &ksiz); vbuf = tchexdecode(value, &vsiz); } else if(sep > 0){ kbuf = strtozsv(key, sep, &ksiz); vbuf = strtozsv(value, sep, &vsiz); } else { ksiz = strlen(key); kbuf = tcmemdup(key, ksiz); vsiz = strlen(value); vbuf = tcmemdup(value, vsiz); } int rv = procput(name, kbuf, ksiz, vbuf, vsiz, dmode); tcfree(vbuf); tcfree(kbuf); return rv;}/* parse arguments of out command */static int runout(int argc, char **argv){ char *name = NULL; char *key = NULL; bool sx = false; int sep = -1; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-sx")){ sx = true; } else if(!strcmp(argv[i], "-sep")){ if(++i >= argc) usage(); sep = sepstrtochr(argv[i]); } else { usage(); } } else if(!name){ name = argv[i]; } else if(!key){ key = argv[i]; } else { usage(); } } if(!name || !key) usage(); int ksiz; char *kbuf; if(sx){ kbuf = tchexdecode(key, &ksiz); } else if(sep > 0){ kbuf = strtozsv(key, sep, &ksiz); } else { ksiz = strlen(key); kbuf = tcmemdup(key, ksiz); } int rv = procout(name, kbuf, ksiz); tcfree(kbuf); return rv;}/* parse arguments of get command */static int runget(int argc, char **argv){ char *name = NULL; char *key = NULL; bool sx = false; int sep = -1; bool px = false; bool pz = false; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-sx")){ sx = true; } else if(!strcmp(argv[i], "-sep")){ if(++i >= argc) usage(); sep = sepstrtochr(argv[i]); } else if(!strcmp(argv[i], "-px")){ px = true; } else if(!strcmp(argv[i], "-pz")){ pz = true; } else { usage(); } } else if(!name){ name = argv[i]; } else if(!key){ key = argv[i]; } else { usage(); } } if(!name || !key) usage(); int ksiz; char *kbuf; if(sx){ kbuf = tchexdecode(key, &ksiz); } else if(sep > 0){ kbuf = strtozsv(key, sep, &ksiz); } else { ksiz = strlen(key); kbuf = tcmemdup(key, ksiz); } name = tcsprintf("%s#mode=r", name); int rv = procget(name, kbuf, ksiz, sep, px, pz); tcfree(name); tcfree(kbuf); return rv;}/* parse arguments of list command */static int runlist(int argc, char **argv){ char *name = NULL; int sep = -1; int max = -1; bool pv = false; bool px = false; char *fmstr = NULL; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-sep")){ if(++i >= argc) usage(); sep = sepstrtochr(argv[i]); } else if(!strcmp(argv[i], "-m")){ if(++i >= argc) usage(); max = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-pv")){ pv = true; } else if(!strcmp(argv[i], "-px")){ px = true; } else if(!strcmp(argv[i], "-fm")){ if(++i >= argc) usage(); fmstr = argv[i]; } else { usage(); } } else if(!name){ name = argv[i]; } else { usage(); } } if(!name) usage(); name = tcsprintf("%s#mode=r", name); int rv = proclist(name, sep, max, pv, px, fmstr); tcfree(name); return rv;}/* parse arguments of optimize command */static int runoptimize(int argc, char **argv){ char *name = NULL; char *params = NULL; for(int i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ usage(); } else if(!name){ name = argv[i]; } else if(!params){ params = argv[i]; } else { usage(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -