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

📄 tcttest.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 4 页
字号:
        err = true;      }      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tctdbtranabort(tdb)){    eprint(tdb, "tctdbtranabort");    err = true;  }  if(tctdbrnum(tdb) != ornum || tctdbfsiz(tdb) != ofsiz){    eprint(tdb, "(validation)");    err = true;  }  if(!tctdbvanish(tdb)){    eprint(tdb, "tctdbvanish");    err = true;  }  if(!tctdbput3(tdb, "mikio", "str\tMIKIO\tbirth\t19780211")){    eprint(tdb, "tctdbput3");    err = true;  }  if(!tctdbtranbegin(tdb)){    eprint(tdb, "tctdbtranbegin");    err = true;  }  if(!tctdbput3(tdb, "mikio", "str\tMEKEO\tsex\tmale")){    eprint(tdb, "tctdbput3");    err = true;  }  for(int i = 0; i < 10; i++){    char pkbuf[RECBUFSIZ];    sprintf(pkbuf, "%d", myrand(10) + 1);    char vbuf[RECBUFSIZ*2];    sprintf(vbuf, "%d\t%d", myrand(10) + 1, myrand(rnum) + 1);    if(!tctdbput3(tdb, pkbuf, vbuf)){      eprint(tdb, "tctdbput");      err = true;    }  }  if(!tctdbforeach(tdb, iterfunc, NULL)){    eprint(tdb, "tctdbforeach");    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 rnum, bool mt, int opts, int omode){  iprintf("<Wicked Writing Test>\n  seed=%u  path=%s  rnum=%d  mt=%d  opts=%d  omode=%d\n\n",          g_randseed, path, rnum, mt, opts, omode);  bool err = false;  double stime = tctime();  TCTDB *tdb = tctdbnew();  if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);  if(mt && !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;  }  const char *names[] = { "", "str", "num", "type", "flag", "c1" };  int ops[] = { TDBQCSTREQ, TDBQCSTRINC, TDBQCSTRBW, TDBQCSTREW, TDBQCSTRAND, TDBQCSTROR,                TDBQCSTROREQ, TDBQCSTRRX, TDBQCNUMEQ, TDBQCNUMGT, TDBQCNUMGE, TDBQCNUMLT,                TDBQCNUMLE, TDBQCNUMBT, TDBQCNUMOREQ };  int types[] = { TDBQOSTRASC, TDBQOSTRDESC, TDBQONUMASC, TDBQONUMDESC };  for(int i = 1; i <= rnum; i++){    int id = myrand(2) == 0 ? myrand(rnum) + 1 : (int)tctdbgenuid(tdb);    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", id);    TCMAP *cols = tcmapnew2(7);    char vbuf[RECBUFSIZ*5];    int vsiz = sprintf(vbuf, "%d", id);    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);    int pt = 0;    char *wp = vbuf;    for(int j = 0; j < num; j++){      pt += myrand(5) + 1;      if(wp > vbuf) *(wp++) = ',';      wp += sprintf(wp, "%d", pt);    }    *wp = '\0';    if(*vbuf != '\0') tcmapput(cols, "flag", 4, vbuf, wp - vbuf);    char nbuf[RECBUFSIZ];    int nsiz = sprintf(nbuf, "c%d", myrand(i) + 1);    vsiz = sprintf(vbuf, "%d", myrand(i) + 1);    tcmapput(cols, nbuf, nsiz, vbuf, vsiz);    char *cbuf;    int csiz;    TCMAP *ncols;    TDBQRY *qry;    TCLIST *res;    switch(myrand(17)){    case 0:      iputchar('0');      if(!tctdbput(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbput");        err = true;      }      break;    case 1:      iputchar('1');      cbuf = tcstrjoin4(cols, &csiz);      if(!tctdbput2(tdb, pkbuf, pksiz, cbuf, csiz)){        eprint(tdb, "tctdbput2");        err = true;      }      tcfree(cbuf);      break;    case 2:      iputchar('2');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbput3(tdb, pkbuf, cbuf)){        eprint(tdb, "tctdbput3");        err = true;      }      tcfree(cbuf);      break;    case 3:      iputchar('3');      if(!tctdbputkeep(tdb, pkbuf, pksiz, cols) && tctdbecode(tdb) != TCEKEEP){        eprint(tdb, "tctdbputkeep");        err = true;      }      break;    case 4:      iputchar('4');      cbuf = tcstrjoin4(cols, &csiz);      if(!tctdbputkeep2(tdb, pkbuf, pksiz, cbuf, csiz) && tctdbecode(tdb) != TCEKEEP){        eprint(tdb, "tctdbputkeep2");        err = true;      }      tcfree(cbuf);      break;    case 5:      iputchar('5');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbputkeep3(tdb, pkbuf, cbuf) && tctdbecode(tdb) != TCEKEEP){        eprint(tdb, "tctdbputkeep3");        err = true;      }      tcfree(cbuf);      break;    case 6:      iputchar('6');      if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbputcat");        err = true;      }      break;    case 7:      iputchar('7');      cbuf = tcstrjoin4(cols, &csiz);      if(!tctdbputcat2(tdb, pkbuf, pksiz, cbuf, csiz)){        eprint(tdb, "tctdbputcat2");        err = true;      }      tcfree(cbuf);      break;    case 8:      iputchar('8');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbputcat3(tdb, pkbuf, cbuf)){        eprint(tdb, "tctdbputcat3");        err = true;      }      tcfree(cbuf);      break;    case 9:      iputchar('9');      if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;      }      break;    case 10:      iputchar('A');      if(!tctdbout2(tdb, pkbuf) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout2");        err = true;      }      break;    case 11:      iputchar('B');      ncols = tctdbget(tdb, pkbuf, pksiz);      if(ncols){        tcmapdel(ncols);      } else if(tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbget");        err = true;      }      break;    case 12:      iputchar('C');      cbuf = tctdbget2(tdb, pkbuf, pksiz, &csiz);      if(cbuf){        tcfree(cbuf);      } else if(tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbget2");        err = true;      }      break;    case 13:      iputchar('D');      cbuf = tctdbget3(tdb, pkbuf);      if(cbuf){        tcfree(cbuf);      } else if(tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbget3");        err = true;      }      break;    case 14:      iputchar('E');      if(myrand(rnum / 50) == 0){        if(!tctdbiterinit(tdb)){          eprint(tdb, "tctdbiterinit");          err = true;        }      }      for(int j = myrand(rnum) / 1000 + 1; j >= 0; j--){        int iksiz;        char *ikbuf = tctdbiternext(tdb, &iksiz);        if(ikbuf){          tcfree(ikbuf);        } else {          int ecode = tctdbecode(tdb);          if(ecode != TCEINVALID && ecode != TCENOREC){            eprint(tdb, "tctdbiternext");            err = true;          }        }      }      break;    case 15:      iputchar('F');      qry = tctdbqrynew(tdb);      if(myrand(10) != 0){        char expr[RECBUFSIZ];        sprintf(expr, "%d", myrand(i) + 1);        switch(myrand(6)){        default:          tctdbqryaddcond(qry, "str", TDBQCSTREQ, expr);          break;        case 1:          tctdbqryaddcond(qry, "str", TDBQCSTRBW, expr);          break;        case 2:          tctdbqryaddcond(qry, "str", TDBQCSTROREQ, expr);          break;        case 3:          tctdbqryaddcond(qry, "num", TDBQCNUMEQ, expr);          break;        case 4:          tctdbqryaddcond(qry, "num", TDBQCNUMGT, expr);          break;        case 5:          tctdbqryaddcond(qry, "num", TDBQCNUMLT, expr);          break;        }        switch(myrand(5)){        case 0:          tctdbqrysetorder(qry, "str", TDBQOSTRASC);          break;        case 1:          tctdbqrysetorder(qry, "str", TDBQOSTRDESC);          break;        case 2:          tctdbqrysetorder(qry, "num", TDBQONUMASC);          break;        case 3:          tctdbqrysetorder(qry, "num", TDBQONUMDESC);          break;        }        tctdbqrysetlimit(qry, 10, myrand(10));      } else {        int cnum = myrand(4);        if(cnum < 1 && myrand(5) != 0) cnum = 1;        for(int j = 0; j < cnum; j++){          const char *name = names[myrand(sizeof(names) / sizeof(*names))];          int op = ops[myrand(sizeof(ops) / sizeof(*ops))];          if(myrand(20) == 0) op |= TDBQCNEGATE;          if(myrand(20) == 0) op |= TDBQCNOIDX;          char expr[RECBUFSIZ*3];          char *wp = expr;          wp += sprintf(expr, "%d", myrand(i));          if(myrand(10) == 0) wp += sprintf(wp, ",%d", myrand(i));          if(myrand(10) == 0) wp += sprintf(wp, ",%d", myrand(i));          tctdbqryaddcond(qry, name, op, expr);        }        if(myrand(3) != 0){          const char *name = names[myrand(sizeof(names) / sizeof(*names))];          int type = types[myrand(sizeof(types) / sizeof(*types))];          tctdbqrysetorder(qry, name, type);        }        if(myrand(3) != 0) tctdbqrysetlimit(qry, myrand(i), myrand(10));      }      res = tctdbqrysearch(qry);      tclistdel(res);      tctdbqrydel(qry);      break;    default:      iputchar('@');      if(myrand(10000) == 0) srand((unsigned int)(tctime() * 1000) % UINT_MAX);      break;    }    tcmapdel(cols);    if(i % 50 == 0) iprintf(" (%08d)\n", i);    if(i == rnum / 2){      if(!tctdbclose(tdb)){        eprint(tdb, "tctdbclose");        err = true;      }      if(!tctdbopen(tdb, path, TDBOWRITER | omode)){        eprint(tdb, "tctdbopen");        err = true;      }    } else if(i == rnum / 4){      char *npath = tcsprintf("%s-tmp", path);      if(!tctdbcopy(tdb, npath)){        eprint(tdb, "tctdbcopy");        err = true;      }      TCTDB *ntdb = tctdbnew();      if(!tctdbsetcodecfunc(ntdb, _tc_recencode, NULL, _tc_recdecode, NULL)){        eprint(ntdb, "tctdbsetcodecfunc");        err = true;      }      if(!tctdbopen(ntdb, npath, TDBOREADER | omode)){        eprint(ntdb, "tctdbopen");        err = true;      }      tctdbdel(ntdb);      unlink(npath);      tcfree(npath);      if(!tctdboptimize(tdb, rnum / 50, -1, -1, -1)){        eprint(tdb, "tctdboptimize");        err = true;      }      if(!tctdbiterinit(tdb)){        eprint(tdb, "tctdbiterinit");        err = true;      }    } else if(i == rnum / 8){      if(!tctdbtranbegin(tdb)){        eprint(tdb, "tctdbtranbegin");        err = true;      }    } else if(i == rnum / 8 + rnum / 16){      if(!tctdbtrancommit(tdb)){        eprint(tdb, "tctdbtrancommit");        err = true;      }    }  }  if(!tctdbsync(tdb)){    eprint(tdb, "tctdbsync");    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;}// END OF FILE

⌨️ 快捷键说明

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