tcftest.c

来自「Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里」· C语言 代码 · 共 1,667 行 · 第 1/4 页

C
1,667
字号
    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "[%d]", i);    char vbuf[RECBUFSIZ];    int vsiz = i % RECBUFSIZ;    memset(vbuf, '*', vsiz);    if(!tcfdbputkeep2(fdb, kbuf, ksiz, vbuf, vsiz) && tcfdbecode(fdb) != TCEKEEP){      eprint(fdb, "tcfdbputkeep");      err = true;      break;    }    if(vsiz < 1){      char tbuf[PATH_MAX];      for(int j = 0; j < PATH_MAX; j++){        tbuf[j] = myrand(0x100);      }      if(!tcfdbput2(fdb, kbuf, ksiz, tbuf, PATH_MAX)){        eprint(fdb, "tcfdbput");        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 kbuf[RECBUFSIZ];      int ksiz = sprintf(kbuf, "[%d]", i);      if(!tcfdbout2(fdb, kbuf, ksiz)){        eprint(fdb, "tcfdbout");        err = true;        break;      }      if(tcfdbout2(fdb, kbuf, ksiz) || tcfdbecode(fdb) != TCENOREC){        eprint(fdb, "tcfdbout");        err = true;        break;      }    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("random writing and reopening:\n");  for(int i = 1; i <= rnum; i++){    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "%d", myrand(rnum) + 1);    int vsiz = myrand(RECBUFSIZ);    char *vbuf = tcmalloc(vsiz + 1);    memset(vbuf, '*', vsiz);    switch(myrand(3)){    case 0:      if(!tcfdbput2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbput");        err = true;      }      break;    case 1:      if(!tcfdbputcat2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbputcat");        err = true;      }      break;    case 2:      if(!tcfdbout2(fdb, kbuf, ksiz) && tcfdbecode(fdb) != TCENOREC){        eprint(fdb, "tcfdbout");        err = true;      }      break;    }    tcfree(vbuf);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tcfdbclose(fdb)){    eprint(fdb, "tcfdbclose");    err = true;  }  if(!tcfdbopen(fdb, path, FDBOWRITER | omode)){    eprint(fdb, "tcfdbopen");    err = true;  }  iprintf("checking:\n");  for(int i = 1; i <= rnum; i++){    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "[%d]", i);    int vsiz;    char *vbuf = tcfdbget2(fdb, kbuf, ksiz, &vsiz);    if(vbuf){      tcfree(vbuf);    } else if(tcfdbecode(fdb) != TCENOREC){      eprint(fdb, "tcfdbget");      err = true;      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("writing:\n");  for(int i = 1; i <= rnum; i++){    char buf[RECBUFSIZ];    int len = sprintf(buf, "%08d", i);    if(!tcfdbput2(fdb, buf, len, buf, len)){      eprint(fdb, "tcfdbput");      err = true;      break;    }    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 kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "%08d", i);    int vsiz;    char *vbuf = tcfdbget2(fdb, kbuf, ksiz, &vsiz);    if(!vbuf){      eprint(fdb, "tcfdbget");      err = true;      break;    } else if(vsiz != ksiz || memcmp(vbuf, kbuf, vsiz)){      eprint(fdb, "(validation)");      err = true;      tcfree(vbuf);      break;    }    tcfree(vbuf);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("checking iterator:\n");  if(!tcfdbiterinit(fdb)){    eprint(fdb, "tcfdbiterinit");    err = true;  }  char *kbuf;  int ksiz;  int inum = 0;  for(int i = 1; (kbuf = tcfdbiternext2(fdb, &ksiz)) != NULL; i++, inum++){    int vsiz;    char *vbuf = tcfdbget2(fdb, kbuf, ksiz, &vsiz);    if(!vbuf){      eprint(fdb, "tcfdbget2");      err = true;      tcfree(kbuf);      break;    }    tcfree(vbuf);    tcfree(kbuf);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(tcfdbecode(fdb) != TCENOREC || inum != tcfdbrnum(fdb)){    eprint(fdb, "(validation)");    err = true;  }  iprintf("iteration updating:\n");  if(!tcfdbiterinit(fdb)){    eprint(fdb, "tcfdbiterinit");    err = true;  }  inum = 0;  for(int i = 1; (kbuf = tcfdbiternext2(fdb, &ksiz)) != NULL; i++, inum++){    if(myrand(2) == 0){      if(!tcfdbputcat2(fdb, kbuf, ksiz, "0123456789", 10)){        eprint(fdb, "tcfdbputcat2");        err = true;        tcfree(kbuf);        break;      }    } else {      if(!tcfdbout2(fdb, kbuf, ksiz)){        eprint(fdb, "tcfdbout");        err = true;        tcfree(kbuf);        break;      }    }    tcfree(kbuf);    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(tcfdbecode(fdb) != TCENOREC || inum < tcfdbrnum(fdb)){    eprint(fdb, "(validation)");    err = true;  }  if(myrand(10) == 0 && !tcfdbsync(fdb)){    eprint(fdb, "tcfdbsync");    err = true;  }  if(!tcfdbvanish(fdb)){    eprint(fdb, "tcfdbvanish");    err = true;  }  TCMAP *map = tcmapnew();  iprintf("random writing:\n");  for(int i = 1; i <= rnum; i++){    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "%d", myrand(rnum) + 1);    char vbuf[RECBUFSIZ];    int vsiz = sprintf(vbuf, "%d", myrand(rnum) + 1);    switch(myrand(7)){    case 0:      if(!tcfdbput2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbput2");        err = true;      }      tcmapput(map, kbuf, ksiz, vbuf, vsiz);      break;    case 1:      if(!tcfdbputkeep2(fdb, kbuf, ksiz, vbuf, vsiz) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbputkeep2");        err = true;      }      tcmapputkeep(map, kbuf, ksiz, vbuf, vsiz);      break;    case 2:      if(!tcfdbputcat2(fdb, kbuf, ksiz, vbuf, vsiz) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbputcat2");        err = true;      }      tcmapputcat(map, kbuf, ksiz, vbuf, vsiz);      break;    case 3:      if(!tcfdbout2(fdb, kbuf, ksiz) && tcfdbecode(fdb) != TCENOREC){        eprint(fdb, "tcfdbout2");        err = true;      }      tcmapout(map, kbuf, ksiz);      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  iprintf("checking transaction commit:\n");  if(!tcfdbtranbegin(fdb)){    eprint(fdb, "tcfdbtranbegin");    err = true;  }  for(int i = 1; i <= rnum; i++){    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "%d", myrand(rnum) + 1);    char vbuf[RECBUFSIZ];    int vsiz = sprintf(vbuf, "[%d]", myrand(rnum) + 1);    switch(myrand(7)){    case 0:      if(!tcfdbput2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbput2");        err = true;      }      tcmapput(map, kbuf, ksiz, vbuf, vsiz);      break;    case 1:      if(!tcfdbputkeep2(fdb, kbuf, ksiz, vbuf, vsiz) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbputkeep2");        err = true;      }      tcmapputkeep(map, kbuf, ksiz, vbuf, vsiz);      break;    case 2:      if(!tcfdbputcat2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbputcat2");        err = true;      }      tcmapputcat(map, kbuf, ksiz, vbuf, vsiz);      break;    case 3:      if(tcfdbaddint(fdb, tcfdbkeytoid(kbuf, ksiz), 1) == INT_MIN && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbaddint");        err = true;      }      tcmapaddint(map, kbuf, ksiz, 1);      break;    case 4:      if(isnan(tcfdbadddouble(fdb, tcfdbkeytoid(kbuf, ksiz), 1.0)) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbadddouble");        err = true;      }      tcmapadddouble(map, kbuf, ksiz, 1.0);      break;    case 5:      if(myrand(2) == 0){        void *op = (void *)(intptr_t)(myrand(3) + 1);        if(!tcfdbputproc(fdb, tcfdbkeytoid(kbuf, ksiz), vbuf, vsiz, pdprocfunc, op) &&           tcfdbecode(fdb) != TCEKEEP){          eprint(fdb, "tcfdbputproc");          err = true;        }        tcmapputproc(map, kbuf, ksiz, vbuf, vsiz, pdprocfunc, op);      } else {        vsiz = myrand(10);        void *op = (void *)(intptr_t)(myrand(3) + 1);        if(!tcfdbputproc(fdb, tcfdbkeytoid(kbuf, ksiz), NULL, vsiz, pdprocfunc, op) &&           tcfdbecode(fdb) != TCEKEEP && tcfdbecode(fdb) != TCENOREC){          eprint(fdb, "tcfdbputproc");          err = true;        }        tcmapputproc(map, kbuf, ksiz, NULL, vsiz, pdprocfunc, op);      }      break;    case 6:      if(!tcfdbout2(fdb, kbuf, ksiz) && tcfdbecode(fdb) != TCENOREC){        eprint(fdb, "tcfdbout2");        err = true;      }      tcmapout(map, kbuf, ksiz);      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tcfdbtrancommit(fdb)){    eprint(fdb, "tcfdbtrancommit");    err = true;  }  iprintf("checking transaction abort:\n");  uint64_t ornum = tcfdbrnum(fdb);  uint64_t ofsiz = tcfdbfsiz(fdb);  if(!tcfdbtranbegin(fdb)){    eprint(fdb, "tcfdbtranbegin");    err = true;  }  for(int i = 1; i <= rnum; i++){    char kbuf[RECBUFSIZ];    int ksiz = sprintf(kbuf, "%d", myrand(rnum) + 1);    char vbuf[RECBUFSIZ];    int vsiz = sprintf(vbuf, "[%d]", myrand(rnum) + 1);    switch(myrand(7)){    case 0:      if(!tcfdbput2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbput2");        err = true;      }      break;    case 1:      if(!tcfdbputkeep2(fdb, kbuf, ksiz, vbuf, vsiz) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbputkeep2");        err = true;      }      break;    case 2:      if(!tcfdbputcat2(fdb, kbuf, ksiz, vbuf, vsiz)){        eprint(fdb, "tcfdbputcat2");        err = true;      }      break;    case 3:      if(tcfdbaddint(fdb, tcfdbkeytoid(kbuf, ksiz), 1) == INT_MIN && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbaddint");        err = true;      }      break;    case 4:      if(isnan(tcfdbadddouble(fdb, tcfdbkeytoid(kbuf, ksiz), 1.0)) && tcfdbecode(fdb) != TCEKEEP){        eprint(fdb, "tcfdbadddouble");        err = true;      }      break;    case 5:      if(myrand(2) == 0){        void *op = (void *)(intptr_t)(myrand(3) + 1);        if(!tcfdbputproc(fdb, tcfdbkeytoid(kbuf, ksiz), vbuf, vsiz, pdprocfunc, op) &&           tcfdbecode(fdb) != TCEKEEP){          eprint(fdb, "tcfdbputproc");          err = true;        }      } else {        vsiz = myrand(10);        void *op = (void *)(intptr_t)(myrand(3) + 1);        if(!tcfdbputproc(fdb, tcfdbkeytoid(kbuf, ksiz), NULL, vsiz, pdprocfunc, op) &&           tcfdbecode(fdb) != TCEKEEP && tcfdbecode(fdb) != TCENOREC){          eprint(fdb, "tcfdbputproc");          err = true;        }      }      break;    case 6:      if(!tcfdbout2(fdb, kbuf, ksiz) && tcfdbecode(fdb) != TCENOREC){        eprint(fdb, "tcfdbout2");        err = true;      }      break;    }    if(rnum > 250 && i % (rnum / 250) == 0){      iputchar('.');      if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);    }  }  if(!tcfdbtranabort(fdb)){    eprint(fdb, "tcfdbtranabort");    err = true;  }  iprintf("checking consistency:\n");  if(tcfdbrnum(fdb) != ornum || tcfdbfsiz(fdb) != ofsiz || tcfdbrnum(fdb) != tcmaprnum(map)){    eprint(fdb, "(validation)");    err = true;  }

⌨️ 快捷键说明

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