📄 tcttest.c
字号:
/************************************************************************************************* * The test cases of the table 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 <tctdb.h>#include "myconf.h"#define RECBUFSIZ 48 // buffer for records/* global variables */const char *g_progname; // program nameunsigned int g_randseed; // random seedint g_dbgfd; // debugging output/* function prototypes */int main(int argc, char **argv);static void usage(void);static void iprintf(const char *format, ...);static void iputchar(int c);static void eprint(TCTDB *tdb, const char *func);static void sysprint(void);static int myrand(int range);static bool iterfunc(const void *kbuf, int ksiz, const void *vbuf, int vsiz, void *op);static int runwrite(int argc, char **argv);static int runread(int argc, char **argv);static int runremove(int argc, char **argv);static int runrcat(int argc, char **argv);static int runmisc(int argc, char **argv);static int runwicked(int argc, char **argv);static int procwrite(const char *path, int rnum, int bnum, int apow, int fpow, bool mt, int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int iflags, int omode, bool rnd);static int procread(const char *path, bool mt, int rcnum, int lcnum, int ncnum, int xmsiz, int omode, bool rnd);static int procremove(const char *path, bool mt, int rcnum, int lcnum, int ncnum, int xmsiz, int omode, bool rnd);static int procrcat(const char *path, int rnum, int bnum, int apow, int fpow, bool mt, int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int iflags, int omode, int pnum, bool dai, bool dad, bool rl, bool ru);static int procmisc(const char *path, int rnum, bool mt, int opts, int omode);static int procwicked(const char *path, int rnum, bool mt, int opts, int omode);/* main routine */int main(int argc, char **argv){ g_progname = argv[0]; const char *ebuf = getenv("TCRNDSEED"); g_randseed = ebuf ? tcatoix(ebuf) : tctime() * 1000; srand(g_randseed); ebuf = getenv("TCDBGFD"); g_dbgfd = ebuf ? tcatoix(ebuf) : UINT16_MAX; if(argc < 2) usage(); int rv = 0; if(!strcmp(argv[1], "write")){ rv = runwrite(argc, argv); } else if(!strcmp(argv[1], "read")){ rv = runread(argc, argv); } else if(!strcmp(argv[1], "remove")){ rv = runremove(argc, argv); } else if(!strcmp(argv[1], "rcat")){ rv = runrcat(argc, argv); } else if(!strcmp(argv[1], "misc")){ rv = runmisc(argc, argv); } else if(!strcmp(argv[1], "wicked")){ rv = runwicked(argc, argv); } else { usage(); } return rv;}/* print the usage and exit */static void usage(void){ fprintf(stderr, "%s: test cases of the table database API of Tokyo Cabinet\n", g_progname); fprintf(stderr, "\n"); fprintf(stderr, "usage:\n"); fprintf(stderr, " %s write [-mt] [-tl] [-td|-tb|-tt|-tx] [-rc num] [-lc num] [-nc num]" " [-xm num] [-ip] [-is] [-in] [-it] [-if] [-nl|-nb] [-rnd]" " path rnum [bnum [apow [fpow]]]\n", g_progname); fprintf(stderr, " %s read [-mt] [-rc num] [-lc num] [-nc num] [-xm num] [-nl|-nb] [-rnd]" " path\n", g_progname); fprintf(stderr, " %s remove [-mt] [-rc num] [-lc num] [-nc num] [-xm num] [-nl|-nb] [-rnd]" " path\n", g_progname); fprintf(stderr, " %s rcat [-mt] [-tl] [-td|-tb|-tt|-tx] [-rc num] [-lc num] [-nc num]" " [-xm num] [-ip] [-is] [-in] [-it] [-if] [-nl|-nb] [-pn num] [-dai|-dad|-rl|-ru]" " path rnum [bnum [apow [fpow]]]\n", g_progname); fprintf(stderr, " %s misc [-mt] [-tl] [-td|-tb|-tt|-tx] [-nl|-nb] path rnum\n", g_progname); fprintf(stderr, " %s wicked [-mt] [-tl] [-td|-tb|-tt|-tx] [-nl|-nb] path rnum\n", g_progname); fprintf(stderr, "\n"); exit(1);}/* print formatted information string and flush the buffer */static void iprintf(const char *format, ...){ va_list ap; va_start(ap, format); vprintf(format, ap); fflush(stdout); va_end(ap);}/* print a character and flush the buffer */static void iputchar(int c){ putchar(c); fflush(stdout);}/* print error message of table database */static void eprint(TCTDB *tdb, const char *func){ const char *path = tctdbpath(tdb); int ecode = tctdbecode(tdb); fprintf(stderr, "%s: %s: %s: error: %d: %s\n", g_progname, path ? path : "-", func, ecode, tctdberrmsg(ecode));}/* print system information */static void sysprint(void){ TCMAP *info = tcsysinfo(); if(info){ tcmapiterinit(info); const char *kbuf; while((kbuf = tcmapiternext2(info)) != NULL){ iprintf("sys_%s: %s\n", kbuf, tcmapiterval2(kbuf)); } tcmapdel(info); }}/* get a random number */static int myrand(int range){ if(range < 2) return 0; int high = (unsigned int)rand() >> 4; int low = range * (rand() / (RAND_MAX + 1.0)); low &= (unsigned int)INT_MAX >> 4; return (high + low) % range;}/* iterator function */static bool iterfunc(const void *kbuf, int ksiz, const void *vbuf, int vsiz, void *op){ unsigned int sum = 0; while(--ksiz >= 0){ sum += ((char *)kbuf)[ksiz]; } while(--vsiz >= 0){ sum += ((char *)vbuf)[vsiz]; } return myrand(100 + (sum & 0xff)) > 0;}/* parse arguments of write command */static int runwrite(int argc, char **argv){ char *path = NULL; char *rstr = NULL; char *bstr = NULL; char *astr = NULL; char *fstr = NULL; bool mt = false; int opts = 0; int rcnum = 0; int lcnum = 0; int ncnum = 0; int xmsiz = -1; int iflags = 0; int omode = 0; bool rnd = false; for(int i = 2; i < argc; i++){ if(!path && argv[i][0] == '-'){ if(!strcmp(argv[i], "-mt")){ mt = true; } else if(!strcmp(argv[i], "-tl")){ opts |= TDBTLARGE; } else if(!strcmp(argv[i], "-td")){ opts |= TDBTDEFLATE; } else if(!strcmp(argv[i], "-tb")){ opts |= TDBTBZIP; } else if(!strcmp(argv[i], "-tt")){ opts |= TDBTTCBS; } else if(!strcmp(argv[i], "-tx")){ opts |= TDBTEXCODEC; } else if(!strcmp(argv[i], "-rc")){ if(++i >= argc) usage(); rcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-lc")){ if(++i >= argc) usage(); lcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nc")){ if(++i >= argc) usage(); ncnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-xm")){ if(++i >= argc) usage(); xmsiz = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-ip")){ iflags |= 1 << 0; } else if(!strcmp(argv[i], "-is")){ iflags |= 1 << 1; } else if(!strcmp(argv[i], "-in")){ iflags |= 1 << 2; } else if(!strcmp(argv[i], "-it")){ iflags |= 1 << 3; } else if(!strcmp(argv[i], "-if")){ iflags |= 1 << 4; } else if(!strcmp(argv[i], "-nl")){ omode |= TDBONOLCK; } else if(!strcmp(argv[i], "-nb")){ omode |= TDBOLCKNB; } else if(!strcmp(argv[i], "-rnd")){ rnd = true; } else { usage(); } } else if(!path){ path = argv[i]; } else if(!rstr){ rstr = argv[i]; } else if(!bstr){ bstr = argv[i]; } else if(!astr){ astr = argv[i]; } else if(!fstr){ fstr = argv[i]; } else { usage(); } } if(!path || !rstr) usage(); int rnum = tcatoix(rstr); if(rnum < 1) usage(); int bnum = bstr ? tcatoix(bstr) : -1; int apow = astr ? tcatoix(astr) : -1; int fpow = fstr ? tcatoix(fstr) : -1; int rv = procwrite(path, rnum, bnum, apow, fpow, mt, opts, rcnum, lcnum, ncnum, xmsiz, iflags, omode, rnd); return rv;}/* parse arguments of read command */static int runread(int argc, char **argv){ char *path = NULL; bool mt = false; int rcnum = 0; int lcnum = 0; int ncnum = 0; int xmsiz = -1; int omode = 0; bool rnd = false; for(int i = 2; i < argc; i++){ if(!path && argv[i][0] == '-'){ if(!strcmp(argv[i], "-mt")){ mt = true; } else if(!strcmp(argv[i], "-rc")){ if(++i >= argc) usage(); rcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-lc")){ if(++i >= argc) usage(); lcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nc")){ if(++i >= argc) usage(); ncnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-xm")){ if(++i >= argc) usage(); xmsiz = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nl")){ omode |= TDBONOLCK; } else if(!strcmp(argv[i], "-nb")){ omode |= TDBOLCKNB; } else if(!strcmp(argv[i], "-rnd")){ rnd = true; } else { usage(); } } else if(!path){ path = argv[i]; } else { usage(); } } if(!path) usage(); int rv = procread(path, mt, rcnum, lcnum, ncnum, xmsiz, omode, rnd); return rv;}/* parse arguments of remove command */static int runremove(int argc, char **argv){ char *path = NULL; bool mt = false; int rcnum = 0; int lcnum = 0; int ncnum = 0; int xmsiz = -1; int omode = 0; bool rnd = false; for(int i = 2; i < argc; i++){ if(!path && argv[i][0] == '-'){ if(!strcmp(argv[i], "-mt")){ mt = true; } else if(!strcmp(argv[i], "-rc")){ if(++i >= argc) usage(); rcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-lc")){ if(++i >= argc) usage(); lcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nc")){ if(++i >= argc) usage(); ncnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-xm")){ if(++i >= argc) usage(); xmsiz = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nl")){ omode |= TDBONOLCK; } else if(!strcmp(argv[i], "-nb")){ omode |= TDBOLCKNB; } else if(!strcmp(argv[i], "-rnd")){ rnd = true; } else { usage(); } } else if(!path){ path = argv[i]; } else { usage(); } } if(!path) usage(); int rv = procremove(path, mt, rcnum, lcnum, ncnum, xmsiz, omode, rnd); return rv;}/* parse arguments of rcat command */static int runrcat(int argc, char **argv){ char *path = NULL; char *rstr = NULL; char *bstr = NULL; char *astr = NULL; char *fstr = NULL; bool mt = false; int opts = 0; int rcnum = 0; int lcnum = 0; int ncnum = 0; int xmsiz = -1; int iflags = 0; int omode = 0; int pnum = 0; bool dai = false; bool dad = false; bool rl = false; bool ru = false; for(int i = 2; i < argc; i++){ if(!path && argv[i][0] == '-'){ if(!strcmp(argv[i], "-mt")){ mt = true; } else if(!strcmp(argv[i], "-tl")){ opts |= TDBTLARGE; } else if(!strcmp(argv[i], "-td")){ opts |= TDBTDEFLATE; } else if(!strcmp(argv[i], "-tb")){ opts |= TDBTBZIP; } else if(!strcmp(argv[i], "-tt")){ opts |= TDBTTCBS; } else if(!strcmp(argv[i], "-tx")){ opts |= TDBTEXCODEC; } else if(!strcmp(argv[i], "-xm")){ if(++i >= argc) usage(); xmsiz = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-rc")){ if(++i >= argc) usage(); rcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-lc")){ if(++i >= argc) usage(); lcnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-nc")){ if(++i >= argc) usage(); ncnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-ip")){ iflags |= 1 << 0; } else if(!strcmp(argv[i], "-is")){ iflags |= 1 << 1; } else if(!strcmp(argv[i], "-in")){ iflags |= 1 << 2; } else if(!strcmp(argv[i], "-it")){ iflags |= 1 << 3; } else if(!strcmp(argv[i], "-if")){ iflags |= 1 << 4; } else if(!strcmp(argv[i], "-nl")){ omode |= TDBONOLCK; } else if(!strcmp(argv[i], "-nb")){ omode |= TDBOLCKNB; } else if(!strcmp(argv[i], "-pn")){ if(++i >= argc) usage(); pnum = tcatoix(argv[i]); } else if(!strcmp(argv[i], "-dai")){ dai = true; } else if(!strcmp(argv[i], "-dad")){ dad = true; } else if(!strcmp(argv[i], "-rl")){ rl = true; } else if(!strcmp(argv[i], "-ru")){ ru = true; } else { usage(); } } else if(!path){ path = argv[i]; } else if(!rstr){ rstr = argv[i]; } else if(!bstr){ bstr = argv[i]; } else if(!astr){ astr = argv[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -