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

📄 tctmttest.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 3 页
字号:
    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);    if(!tctdbput(tdb, pkbuf, pksiz, cols)){      eprint(tdb, "tctdbput");      err = true;      break;    }    tcmapdel(cols);    if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  return err ? "error" : NULL;}/* thread the read function */static void *threadread(void *targ){  TCTDB *tdb = ((TARGREAD *)targ)->tdb;  int rnum = ((TARGREAD *)targ)->rnum;  bool rnd = ((TARGREAD *)targ)->rnd;  int id = ((TARGREAD *)targ)->id;  bool err = false;  int base = id * rnum;  for(int i = 1; i <= rnum && !err; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", base + (rnd ? myrandnd(i) : i));    TCMAP *cols = tctdbget(tdb, pkbuf, pksiz);    if(cols){      tcmapdel(cols);    } else if(!rnd || tctdbecode(tdb) != TCENOREC){      eprint(tdb, "tctdbget");      err = true;    }    if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  return err ? "error" : NULL;}/* thread the remove function */static void *threadremove(void *targ){  TCTDB *tdb = ((TARGREMOVE *)targ)->tdb;  int rnum = ((TARGREMOVE *)targ)->rnum;  bool rnd = ((TARGREMOVE *)targ)->rnd;  int id = ((TARGREMOVE *)targ)->id;  bool err = false;  int base = id * rnum;  for(int i = 1; i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", base + (rnd ? myrand(i + 1) : i));    if(!tctdbout(tdb, pkbuf, pksiz) && (!rnd || tctdbecode(tdb) != TCENOREC)){      eprint(tdb, "tctdbout");      err = true;      break;    }    if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  return err ? "error" : NULL;}/* thread the wicked function */static void *threadwicked(void *targ){  TCTDB *tdb = ((TARGWICKED *)targ)->tdb;  int rnum = ((TARGWICKED *)targ)->rnum;  int id = ((TARGWICKED *)targ)->id;  bool err = false;  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 && !err; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", myrand(rnum * (id + 1)));    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;    switch(myrand(17)){    case 0:      if(id == 0) iputchar('0');      if(!tctdbput(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbput");        err = true;      }      break;    case 1:      if(id == 0) iputchar('1');      cbuf = tcstrjoin4(cols, &csiz);      if(!tctdbput2(tdb, pkbuf, pksiz, cbuf, csiz)){        eprint(tdb, "tctdbput2");        err = true;      }      tcfree(cbuf);      break;    case 2:      if(id == 0) iputchar('2');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbput3(tdb, pkbuf, cbuf)){        eprint(tdb, "tctdbput3");        err = true;      }      tcfree(cbuf);      break;    case 3:      if(id == 0) iputchar('3');      if(!tctdbputkeep(tdb, pkbuf, pksiz, cols) && tctdbecode(tdb) != TCEKEEP){        eprint(tdb, "tctdbputkeep");        err = true;      }      break;    case 4:      if(id == 0) 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:      if(id == 0) iputchar('5');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbputkeep3(tdb, pkbuf, cbuf) && tctdbecode(tdb) != TCEKEEP){        eprint(tdb, "tctdbputkeep3");        err = true;      }      tcfree(cbuf);      break;    case 6:      if(id == 0) iputchar('6');      if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbputcat");        err = true;      }      break;    case 7:      if(id == 0) iputchar('7');      cbuf = tcstrjoin4(cols, &csiz);      if(!tctdbputcat2(tdb, pkbuf, pksiz, cbuf, csiz)){        eprint(tdb, "tctdbputcat2");        err = true;      }      tcfree(cbuf);      break;    case 8:      if(id == 0) iputchar('8');      cbuf = tcstrjoin3(cols, '\t');      if(!tctdbputcat3(tdb, pkbuf, cbuf)){        eprint(tdb, "tctdbputcat3");        err = true;      }      tcfree(cbuf);      break;    case 9:      if(id == 0) iputchar('9');      if(myrand(2) == 0){        if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){          eprint(tdb, "tctdbout");          err = true;        }      }      break;    case 10:      if(id == 0) iputchar('A');      if(myrand(2) == 0){        if(!tctdbout2(tdb, pkbuf) && tctdbecode(tdb) != TCENOREC){          eprint(tdb, "tctdbout2");          err = true;        }      }      break;    case 11:      if(id == 0) iputchar('B');      ncols = tctdbget(tdb, pkbuf, pksiz);      if(ncols){        tcmapdel(ncols);      } else if(tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbget");        err = true;      }      break;    case 12:      if(id == 0) 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:      if(id == 0) iputchar('D');      cbuf = tctdbget3(tdb, pkbuf);      if(cbuf){        tcfree(cbuf);      } else if(tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbget3");        err = true;      }      break;    case 14:      if(id == 0) 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:      if(id == 0) 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));      }      if(myrand(10) == 0){        TCLIST *res = tctdbqrysearch(qry);        tclistdel(res);      }      tctdbqrydel(qry);      break;    default:      if(id == 0) iputchar('@');      if(tctdbtranbegin(tdb)){        if(myrand(2) == 0){          if(!tctdbput(tdb, pkbuf, pksiz, cols)){            eprint(tdb, "tctdbput");            err = true;          }        } else {          if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){            eprint(tdb, "tctdbout");            err = true;          }        }        if(myrand(2) == 0){          if(!tctdbtranabort(tdb)){            eprint(tdb, "tctdbtranabort");            err = true;          }        } else {          if(!tctdbtrancommit(tdb)){            eprint(tdb, "tctdbtrancommit");            err = true;          }        }      } else {        eprint(tdb, "tctdbtranbegin");        err = true;      }      if(myrand(10000) == 0) srand((unsigned int)(tctime() * 1000) % UINT_MAX);      break;    }    tcmapdel(cols);    if(id == 0){      if(i % 50 == 0) iprintf(" (%08d)\n", i);      if(id == 0 && i == rnum / 4){        if(!tctdboptimize(tdb, rnum / 50, -1, -1, -1) && tctdbecode(tdb) != TCEINVALID){          eprint(tdb, "tctdboptimize");          err = true;        }        if(!tctdbiterinit(tdb)){          eprint(tdb, "tctdbiterinit");          err = true;        }      }    }  }  return err ? "error" : NULL;}/* thread the typical function */static void *threadtypical(void *targ){  TCTDB *tdb = ((TARGTYPICAL *)targ)->tdb;  int rnum = ((TARGTYPICAL *)targ)->rnum;  int rratio = ((TARGTYPICAL *)targ)->rratio;  int id = ((TARGTYPICAL *)targ)->id;  bool err = false;  int base = id * rnum;  int mrange = tclmax(50 + rratio, 100);  for(int i = 1; !err && i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%08d", base + myrandnd(i));    int rnd = myrand(mrange);    if(rnd < 20){      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);      if(myrand(2) == 0){        if(!tctdbput(tdb, pkbuf, pksiz, cols)){          eprint(tdb, "tctdbput");          err = true;        }      } else {        if(!tctdbput(tdb, pkbuf, pksiz, cols) && tctdbecode(tdb) && tctdbecode(tdb) != TCEKEEP){          eprint(tdb, "tctdbput");          err = true;        }      }      tcmapdel(cols);    } else if(rnd < 30){      if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;      }    } else if(rnd < 31){      if(myrand(10) == 0 && !tctdbiterinit(tdb) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbiterinit");        err = true;      }      for(int j = 0; !err && j < 10; j++){        int ksiz;        char *kbuf = tctdbiternext(tdb, &ksiz);        if(kbuf){          tcfree(kbuf);        } else if(tctdbecode(tdb) != TCEINVALID && tctdbecode(tdb) != TCENOREC){          eprint(tdb, "tctdbiternext");          err = true;        }      }    } else {      TDBQRY *qry = tctdbqrynew(tdb);      char expr[RECBUFSIZ];      sprintf(expr, "%d", myrand(i) + 1);      switch(myrand(6) * 1){      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;      }      tctdbqrysetlimit(qry, 10, myrand(5) * 10);      TCLIST *res = tctdbqrysearch(qry);      tclistdel(res);      tctdbqrydel(qry);    }    if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  return err ? "error" : NULL;}// END OF FILE

⌨️ 快捷键说明

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