📄 tcttest.c
字号:
} 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 + -