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

📄 tcttest.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 4 页
字号:
        }        break;      case 4:        if(isnan(tctdbadddouble(tdb, pkbuf, pksiz, 1.0)) && tctdbecode(tdb) != TCEKEEP){          eprint(tdb, "tctdbadddouble");          err = true;        }        break;      default:        if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){          eprint(tdb, "tctdbputcat");          err = true;        }        break;      }      if(err) break;    } else {      if(dai){        if(tctdbaddint(tdb, pkbuf, pksiz, myrand(3)) == INT_MIN){          eprint(tdb, "tctdbaddint");          err = true;          break;        }      } else if(dad){        if(isnan(tctdbadddouble(tdb, pkbuf, pksiz, myrand(30) / 10.0))){          eprint(tdb, "tctdbadddouble");          err = true;          break;        }      } else if(rl){        char fbuf[PATH_MAX];        int fsiz = myrand(PATH_MAX);        for(int j = 0; j < fsiz; j++){          fbuf[j] = myrand(0x100);        }        tcmapput(cols, "bin", 3, fbuf, fsiz);        if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){          eprint(tdb, "tctdbputcat");          err = true;          break;        }      } else {        if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){          eprint(tdb, "tctdbputcat");          err = true;          break;        }      }    }    tcmapdel(cols);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  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 misc command */static int procmisc(const char *path, int rnum, bool mt, int opts, int omode){  iprintf("<Miscellaneous 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;  }  iprintf("writing:\n");  for(int i = 1; i <= rnum; i++){    int id = (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(32) + 1);    vsiz = sprintf(vbuf, "%d", myrand(32) + 1);    tcmapput(cols, nbuf, nsiz, vbuf, vsiz);    if(i % 3 == 0){      if(!tctdbputkeep(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbputkeep");        err = true;        break;      }    } else {      if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){        eprint(tdb, "tctdbputcat");        err = true;        break;      }    }    tcmapdel(cols);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("reading:\n");  for(int i = 1; i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", i);    TCMAP *cols = tctdbget(tdb, pkbuf, pksiz);    if(cols){      const char *vbuf = tcmapget2(cols, "str");      if(!vbuf || strcmp(vbuf, pkbuf)){        eprint(tdb, "(validation)");        tcmapdel(cols);        err = true;        break;      }      tcmapdel(cols);    } else {      eprint(tdb, "tctdbget");      err = true;      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("erasing:\n");  for(int i = 1; i <= rnum; i++){    if(i % 2 == 1){      char pkbuf[RECBUFSIZ];      int pksiz = sprintf(pkbuf, "%d", i);      if(!tctdbout(tdb, pkbuf, pksiz)){        eprint(tdb, "tctdbout");        err = true;        break;      }      if(tctdbout(tdb, pkbuf, pksiz) || tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;        break;      }    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(tctdbrnum(tdb) != rnum / 2){    eprint(tdb, "tctdbrnum");    err = true;  }  if(tctdbuidseed(tdb) != rnum){    eprint(tdb, "tctdbuidseed");    err = true;  }  iprintf("searching:\n");  TDBQRY *qry = tctdbqrynew(tdb);  TCLIST *res = tctdbqrysearch(qry);  if(tclistnum(res) != rnum / 2){    eprint(tdb, "tctdbqrysearch");    err = true;  }  tclistdel(res);  tctdbqrydel(qry);  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 };  qry = tctdbqrynew(tdb);  for(int i = 1; i <= rnum; i++){    if(myrand(100) != 0){      tctdbqrydel(qry);      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(5) * 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));      }    }    TCLIST *res = tctdbqrysearch(qry);    tclistdel(res);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  tctdbqrydel(qry);  iprintf("random writing and reopening:\n");  for(int i = 1; i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", myrand(rnum) + 1);    switch(myrand(4)){    default:      if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;      }      break;    case 1:      if(!tctdbaddint(tdb, pkbuf, pksiz, 1)){        eprint(tdb, "tctdbaddint");        err = true;      }      break;    case 2:      if(!tctdbadddouble(tdb, pkbuf, pksiz, 1.0)){        eprint(tdb, "tctdbadddouble");        err = true;      }      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tctdbclose(tdb)){    eprint(tdb, "tctdbclose");    err = true;  }  if(!tctdbopen(tdb, path, TDBOWRITER | omode)){    eprint(tdb, "tctdbopen");    err = true;  }  iprintf("checking iterator:\n");  int inum = 0;  if(!tctdbiterinit(tdb)){    eprint(tdb, "tctdbiterinit");    err = true;  }  char *pkbuf;  int pksiz;  for(int i = 1; (pkbuf = tctdbiternext(tdb, &pksiz)) != NULL; i++, inum++){    TCMAP *cols = tctdbget(tdb, pkbuf, pksiz);    if(!cols){      eprint(tdb, "tctdbget");      err = true;      tcfree(pkbuf);      break;    }    tcmapdel(cols);    tcfree(pkbuf);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(rnum > 250) iprintf(" (%08d)\n", inum);  if(tctdbecode(tdb) != TCENOREC || inum != tctdbrnum(tdb)){    eprint(tdb, "(validation)");    err = true;  }  iprintf("checking transaction commit:\n");  if(!tctdbtranbegin(tdb)){    eprint(tdb, "tctdbtranbegin");    err = true;  }  for(int i = 1; i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", myrand(rnum));    switch(myrand(4)){    default:      if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;      }      break;    case 1:      if(!tctdbaddint(tdb, pkbuf, pksiz, 1)){        eprint(tdb, "tctdbaddint");        err = true;      }      break;    case 2:      if(!tctdbadddouble(tdb, pkbuf, pksiz, 1.0)){        eprint(tdb, "tctdbadddouble");        err = true;      }      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tctdbtrancommit(tdb)){    eprint(tdb, "tctdbtrancommit");    err = true;  }  iprintf("checking transaction abort:\n");  uint64_t ornum = tctdbrnum(tdb);  uint64_t ofsiz = tctdbfsiz(tdb);  if(!tctdbtranbegin(tdb)){    eprint(tdb, "tctdbtranbegin");    err = true;  }  for(int i = 1; i <= rnum; i++){    char pkbuf[RECBUFSIZ];    int pksiz = sprintf(pkbuf, "%d", myrand(rnum));    switch(myrand(4)){    default:      if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){        eprint(tdb, "tctdbout");        err = true;      }      break;    case 1:      if(!tctdbaddint(tdb, pkbuf, pksiz, 1)){        eprint(tdb, "tctdbaddint");        err = true;      }      break;    case 2:      if(!tctdbadddouble(tdb, pkbuf, pksiz, 1.0)){        eprint(tdb, "tctdbadddouble");

⌨️ 快捷键说明

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