⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tctmttest.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 3 页
字号:
    } else {      usage();    }  }  if(!path || !tstr || !rstr) usage();  int tnum = tcatoix(tstr);  int rnum = tcatoix(rstr);  if(tnum < 1 || rnum < 1) usage();  int bnum = bstr ? tcatoix(bstr) : -1;  int apow = astr ? tcatoix(astr) : -1;  int fpow = fstr ? tcatoix(fstr) : -1;  int rv = proctypical(path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz,                       omode, rratio);  return rv;}/* perform write command */static int procwrite(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,                     int opts, int rcnum, int lcnum, int ncnum, int xmsiz,                     int iflags, int omode, bool rnd){  iprintf("<Writing Test>\n  seed=%u  path=%s  tnum=%d  rnum=%d  bnum=%d  apow=%d  fpow=%d"          "  opts=%d  rcnum=%d  lcnum=%d  ncnum=%d  xmsiz=%d  iflags=%d  omode=%d  rnd=%d\n\n",          g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz,          iflags, omode, rnd);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(!tctdbsetmutex(tdb)){    eprint(tdb, "tctdbsetmutex");    err = true;  }  if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){    eprint(tdb, "tctdbsetcodecfunc");    err = true;  }  if(!tctdbtune(tdb, bnum, apow, fpow, opts)){    eprint(tdb, "tctdbtune");    err = true;  }  if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){    eprint(tdb, "tctdbsetcache");    err = true;  }  if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){    eprint(tdb, "tctdbsetxmsiz");    err = true;  }  if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  if((iflags & (1 << 0)) && !tctdbsetindex(tdb, "", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if((iflags & (1 << 1)) && !tctdbsetindex(tdb, "str", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if((iflags & (1 << 2)) && !tctdbsetindex(tdb, "num", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if((iflags & (1 << 3)) && !tctdbsetindex(tdb, "type", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if((iflags & (1 << 4)) && !tctdbsetindex(tdb, "flag", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  TARGWRITE targs[tnum];  pthread_t threads[tnum];  if(tnum == 1){    targs[0].tdb = tdb;    targs[0].rnum = rnum;    targs[0].rnd = rnd;    targs[0].id = 0;    if(threadwrite(targs) != NULL) err = true;  } else {    for(int i = 0; i < tnum; i++){      targs[i].tdb = tdb;      targs[i].rnum = rnum;      targs[i].rnd = rnd;      targs[i].id = i;      if(pthread_create(threads + i, NULL, threadwrite, targs + i) != 0){        eprint(tdb, "pthread_create");        targs[i].id = -1;        err = true;      }    }    for(int i = 0; i < tnum; i++){      if(targs[i].id == -1) continue;      void *rv;      if(pthread_join(threads[i], &rv) != 0){        eprint(tdb, "pthread_join");        err = true;      } else if(rv){        err = true;      }    }  }  iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));  iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));  sysprint();  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  tctdbdel(tdb);  iprintf("time: %.3f\n", tctime() - stime);  iprintf("%s\n\n", err ? "error" : "ok");  return err ? 1 : 0;}/* perform read command */static int procread(const char *path, int tnum, int rcnum, int lcnum, int ncnum, int xmsiz,                    int omode, bool rnd){  iprintf("<Reading Test>\n  seed=%u  path=%s  tnum=%d  rcnum=%d  lcnum=%d  ncnum=%d  xmsiz=%d"          "  omode=%d  rnd=%d\n\n",          g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, omode, rnd);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(!tctdbsetmutex(tdb)){    eprint(tdb, "tctdbsetmutex");    err = true;  }  if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){    eprint(tdb, "tctdbsetcodecfunc");    err = true;  }  if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){    eprint(tdb, "tctdbsetcache");    err = true;  }  if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){    eprint(tdb, "tctdbsetxmsiz");    err = true;  }  if(!tctdbopen(tdb, path, TDBOREADER | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  int rnum = tctdbrnum(tdb) / tnum;  TARGREAD targs[tnum];  pthread_t threads[tnum];  if(tnum == 1){    targs[0].tdb = tdb;    targs[0].rnum = rnum;    targs[0].rnd = rnd;    targs[0].id = 0;    if(threadread(targs) != NULL) err = true;  } else {    for(int i = 0; i < tnum; i++){      targs[i].tdb = tdb;      targs[i].rnum = rnum;      targs[i].rnd = rnd;      targs[i].id = i;      if(pthread_create(threads + i, NULL, threadread, targs + i) != 0){        eprint(tdb, "pthread_create");        targs[i].id = -1;        err = true;      }    }    for(int i = 0; i < tnum; i++){      if(targs[i].id == -1) continue;      void *rv;      if(pthread_join(threads[i], &rv) != 0){        eprint(tdb, "pthread_join");        err = true;      } else if(rv){        err = true;      }    }  }  iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));  iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));  sysprint();  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  tctdbdel(tdb);  iprintf("time: %.3f\n", tctime() - stime);  iprintf("%s\n\n", err ? "error" : "ok");  return err ? 1 : 0;}/* perform remove command */static int procremove(const char *path, int tnum, int rcnum, int lcnum, int ncnum, int xmsiz,                      int omode, bool rnd){  iprintf("<Removing Test>\n  seed=%u  path=%s  tnum=%d  rcnum=%d  lcnum=%d  ncnum=%d  xmsiz=%d"          "  omode=%d  rnd=%d\n\n",          g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, omode, rnd);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(!tctdbsetmutex(tdb)){    eprint(tdb, "tctdbsetmutex");    err = true;  }  if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){    eprint(tdb, "tctdbsetcodecfunc");    err = true;  }  if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){    eprint(tdb, "tctdbsetcache");    err = true;  }  if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){    eprint(tdb, "tctdbsetxmsiz");    err = true;  }  if(!tctdbopen(tdb, path, TDBOWRITER | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  int rnum = tctdbrnum(tdb) / tnum;  TARGREMOVE targs[tnum];  pthread_t threads[tnum];  if(tnum == 1){    targs[0].tdb = tdb;    targs[0].rnum = rnum;    targs[0].rnd = rnd;    targs[0].id = 0;    if(threadremove(targs) != NULL) err = true;  } else {    for(int i = 0; i < tnum; i++){      targs[i].tdb = tdb;      targs[i].rnum = rnum;      targs[i].rnd = rnd;      targs[i].id = i;      if(pthread_create(threads + i, NULL, threadremove, targs + i) != 0){        eprint(tdb, "pthread_create");        targs[i].id = -1;        err = true;      }    }    for(int i = 0; i < tnum; i++){      if(targs[i].id == -1) continue;      void *rv;      if(pthread_join(threads[i], &rv) != 0){        eprint(tdb, "pthread_join");        err = true;      } else if(rv){        err = true;      }    }  }  iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));  iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));  sysprint();  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  tctdbdel(tdb);  iprintf("time: %.3f\n", tctime() - stime);  iprintf("%s\n\n", err ? "error" : "ok");  return err ? 1 : 0;}/* perform wicked command */static int procwicked(const char *path, int tnum, int rnum, int opts, int omode){  iprintf("<Writing Test>\n  seed=%u  path=%s  tnum=%d  rnum=%d  opts=%d  omode=%d\n\n",          g_randseed, path, tnum, rnum, opts, omode);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(!tctdbsetmutex(tdb)){    eprint(tdb, "tctdbsetmutex");    err = true;  }  if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){    eprint(tdb, "tctdbsetcodecfunc");    err = true;  }  if(!tctdbtune(tdb, rnum / 50, 2, -1, opts)){    eprint(tdb, "tctdbtune");    err = true;  }  if(!tctdbsetcache(tdb, rnum / 10, 128, 256)){    eprint(tdb, "tctdbsetcache");    err = true;  }  if(!tctdbsetxmsiz(tdb, rnum * sizeof(int))){    eprint(tdb, "tctdbsetxmsiz");    err = true;  }  if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "flag", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbiterinit(tdb)){    eprint(tdb, "tctdbiterinit");    err = true;  }  TARGWICKED targs[tnum];  pthread_t threads[tnum];  if(tnum == 1){    targs[0].tdb = tdb;    targs[0].rnum = rnum;    targs[0].id = 0;    if(threadwicked(targs) != NULL) err = true;  } else {    for(int i = 0; i < tnum; i++){      targs[i].tdb = tdb;      targs[i].rnum = rnum;      targs[i].id = i;      if(pthread_create(threads + i, NULL, threadwicked, targs + i) != 0){        eprint(tdb, "pthread_create");        targs[i].id = -1;        err = true;      }    }    for(int i = 0; i < tnum; i++){      if(targs[i].id == -1) continue;      void *rv;      if(pthread_join(threads[i], &rv) != 0){        eprint(tdb, "pthread_join");        err = true;      } else if(rv){        err = true;      }    }  }  iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));  iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));  sysprint();  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  tctdbdel(tdb);  iprintf("time: %.3f\n", tctime() - stime);  iprintf("%s\n\n", err ? "error" : "ok");  return err ? 1 : 0;}/* perform typical command */static int proctypical(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,                       int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int omode,                       int rratio){  iprintf("<Typical Access Test>\n  seed=%u  path=%s  tnum=%d  rnum=%d  bnum=%d  apow=%d"          "  fpow=%d  opts=%d  rcnum=%d  lcnum=%d  ncnum=%d  xmsiz=%d  omode=%d  rratio=%d\n\n",          g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum, xmsiz,          omode, rratio);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(!tctdbsetmutex(tdb)){    eprint(tdb, "tctdbsetmutex");    err = true;  }  if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){    eprint(tdb, "tctdbsetcodecfunc");    err = true;  }  if(!tctdbtune(tdb, bnum, apow, fpow, opts)){    eprint(tdb, "tctdbtune");    err = true;  }  if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){    eprint(tdb, "tctdbsetcache");    err = true;  }  if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){    eprint(tdb, "tctdbsetxmsiz");    err = true;  }  if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  if(!tctdbsetindex(tdb, "flag", TDBITLEXICAL)){    eprint(tdb, "tctdbsetindex");    err = true;  }  TARGTYPICAL targs[tnum];  pthread_t threads[tnum];  if(tnum == 1){    targs[0].tdb = tdb;    targs[0].rnum = rnum;    targs[0].rratio = rratio;    targs[0].id = 0;    if(threadtypical(targs) != NULL) err = true;  } else {    for(int i = 0; i < tnum; i++){      targs[i].tdb = tdb;      targs[i].rnum = rnum;      targs[i].rratio= rratio;      targs[i].id = i;      if(pthread_create(threads + i, NULL, threadtypical, targs + i) != 0){        eprint(tdb, "pthread_create");        targs[i].id = -1;        err = true;      }    }    for(int i = 0; i < tnum; i++){      if(targs[i].id == -1) continue;      void *rv;      if(pthread_join(threads[i], &rv) != 0){        eprint(tdb, "pthread_join");        err = true;      } else if(rv){        err = true;      }    }  }  iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));  iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));  sysprint();  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  tctdbdel(tdb);  iprintf("time: %.3f\n", tctime() - stime);  iprintf("%s\n\n", err ? "error" : "ok");  return err ? 1 : 0;}/* thread the write function */static void *threadwrite(void *targ){  TCTDB *tdb = ((TARGWRITE *)targ)->tdb;  int rnum = ((TARGWRITE *)targ)->rnum;  bool rnd = ((TARGWRITE *)targ)->rnd;  int id = ((TARGWRITE *)targ)->id;  bool err = false;  int base = id * rnum;  for(int i = 1; i <= rnum; i++){    int uid = rnd ? (base + myrand(i) + 1) : tctdbgenuid(tdb);    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", uid);    TCMAP *cols = tcmapnew2(7);    char vbuf[RECBUFSIZ*5];    int vsiz = sprintf(vbuf, "%d", uid);    tcmapput(cols, "str", 3, vbuf, vsiz);    vsiz = sprintf(vbuf, "%d", myrand(i) + 1);    tcmapput(cols, "num", 3, vbuf, vsiz);    vsiz = sprintf(vbuf, "%d", myrand(32) + 1);    tcmapput(cols, "type", 4, vbuf, vsiz);    int num = myrand(5);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -