📄 tctdb.c
字号:
return rv;}/* Get the size of the value of a string record in a table database object. */int tctdbvsiz2(TCTDB *tdb, const char *pkstr){ assert(tdb && pkstr); return tctdbvsiz(tdb, pkstr, strlen(pkstr));}/* Initialize the iterator of a table database object. */bool tctdbiterinit(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } bool rv = tchdbiterinit(tdb->hdb); TDBUNLOCKMETHOD(tdb); return rv;}/* Get the next primary key of the iterator of a table database object. */void *tctdbiternext(TCTDB *tdb, int *sp){ assert(tdb && sp); if(!TDBLOCKMETHOD(tdb, true)) return NULL; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return NULL; } char *rv = tchdbiternext(tdb->hdb, sp); TDBUNLOCKMETHOD(tdb); return rv;}/* Get the next primary key string of the iterator of a table database object. */char *tctdbiternext2(TCTDB *tdb){ assert(tdb); int pksiz; return tctdbiternext(tdb, &pksiz);}/* Get forward matching primary keys in a table database object. */TCLIST *tctdbfwmkeys(TCTDB *tdb, const void *pbuf, int psiz, int max){ assert(tdb && pbuf && psiz >= 0); if(!TDBLOCKMETHOD(tdb, true)) return tclistnew(); if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return tclistnew(); } TCLIST *rv = tchdbfwmkeys(tdb->hdb, pbuf, psiz, max); TDBUNLOCKMETHOD(tdb); return rv;}/* Get forward matching string primary keys in a table database object. */TCLIST *tctdbfwmkeys2(TCTDB *tdb, const char *pstr, int max){ assert(tdb && pstr); return tctdbfwmkeys(tdb, pstr, strlen(pstr), max);}/* Add an integer to a column of a record in a table database object. */int tctdbaddint(TCTDB *tdb, const void *pkbuf, int pksiz, int num){ assert(tdb && pkbuf && pksiz >= 0); if(!TDBLOCKMETHOD(tdb, true)) return INT_MIN; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return INT_MIN; } double rv = tctdbaddnumber(tdb, pkbuf, pksiz, num); TDBUNLOCKMETHOD(tdb); return isnan(rv) ? INT_MIN : (int)rv;}/* Add a real number to a column of a record in a table database object. */double tctdbadddouble(TCTDB *tdb, const void *pkbuf, int pksiz, double num){ assert(tdb && pkbuf && pksiz >= 0); if(!TDBLOCKMETHOD(tdb, true)) return INT_MIN; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return INT_MIN; } double rv = tctdbaddnumber(tdb, pkbuf, pksiz, num); TDBUNLOCKMETHOD(tdb); return rv;}/* Synchronize updated contents of a table database object with the file and the device. */bool tctdbsync(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } bool rv = tctdbmemsync(tdb, true); TDBUNLOCKMETHOD(tdb); return rv;}/* Optimize the file of a table database object. */bool tctdboptimize(TCTDB *tdb, int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } TDBTHREADYIELD(tdb); bool rv = tctdboptimizeimpl(tdb, bnum, apow, fpow, opts); TDBUNLOCKMETHOD(tdb); return rv;}/* Remove all records of a table database object. */bool tctdbvanish(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } TDBTHREADYIELD(tdb); bool rv = tctdbvanishimpl(tdb); TDBUNLOCKMETHOD(tdb); return rv;}/* Copy the database file of a table database object. */bool tctdbcopy(TCTDB *tdb, const char *path){ assert(tdb && path); if(!TDBLOCKMETHOD(tdb, false)) return false; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } TDBTHREADYIELD(tdb); bool rv = tctdbcopyimpl(tdb, path); TDBUNLOCKMETHOD(tdb); return rv;}/* Begin the transaction of a table database object. */bool tctdbtranbegin(TCTDB *tdb){ assert(tdb); for(double wsec = 1.0 / sysconf(_SC_CLK_TCK); true; wsec *= 2){ if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } if(!tdb->tran) break; TDBUNLOCKMETHOD(tdb); if(wsec > 1.0) wsec = 1.0; tcsleep(wsec); } if(!tctdbtranbeginimpl(tdb)){ TDBUNLOCKMETHOD(tdb); return false; } tdb->tran = true; TDBUNLOCKMETHOD(tdb); return true;}/* Commit the transaction of a table database object. */bool tctdbtrancommit(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || !tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } tdb->tran = false; bool err = false; if(!tctdbtrancommitimpl(tdb)) err = true; TDBUNLOCKMETHOD(tdb); return !err;}/* Abort the transaction of a table database object. */bool tctdbtranabort(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || !tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } tdb->tran = false; bool err = false; if(!tctdbtranabortimpl(tdb)) err = true; TDBUNLOCKMETHOD(tdb); return !err;}/* Get the file path of a table database object. */const char *tctdbpath(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, false)) return NULL; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return NULL; } const char *rv = tchdbpath(tdb->hdb); TDBUNLOCKMETHOD(tdb); return rv;}/* Get the number of records of a table database object. */uint64_t tctdbrnum(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, false)) return 0; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return 0; } uint64_t rv = tchdbrnum(tdb->hdb); TDBUNLOCKMETHOD(tdb); return rv;}/* Get the size of the database file of a table database object. */uint64_t tctdbfsiz(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, false)) return 0; if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return 0; } uint64_t rv = tchdbfsiz(tdb->hdb); TDBIDX *idxs = tdb->idxs; int inum = tdb->inum; for(int i = 0; i < inum; i++){ TDBIDX *idx = idxs + i; switch(idx->type){ case TDBITLEXICAL: case TDBITDECIMAL: rv += tcbdbfsiz(idx->db); break; } } TDBUNLOCKMETHOD(tdb); return rv;}/* Set a column index to a table database object. */bool tctdbsetindex(TCTDB *tdb, const char *name, int type){ assert(tdb && name); if(!TDBLOCKMETHOD(tdb, true)) return false; if(!tdb->open || !tdb->wmode || tdb->tran){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } bool rv = tctdbsetindeximpl(tdb, name, type); TDBUNLOCKMETHOD(tdb); return rv;}/* Generate a unique ID number of a table database object. */int64_t tctdbgenuid(TCTDB *tdb){ assert(tdb); if(!TDBLOCKMETHOD(tdb, true)) return -1; if(!tdb->open || !tdb->wmode){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return -1; } int64_t rv = tctdbgenuidimpl(tdb, 1); TDBUNLOCKMETHOD(tdb); return rv;}/* Create a query object. */TDBQRY *tctdbqrynew(TCTDB *tdb){ assert(tdb); TDBQRY *qry; TCMALLOC(qry, sizeof(*qry)); qry->tdb = tdb; TCMALLOC(qry->conds, sizeof(qry->conds[0]) * 2); qry->cnum = 0; qry->oname = NULL; qry->otype = TDBQOSTRASC; qry->max = INT_MAX; qry->skip = 0; qry->hint = tcxstrnew3(TDBHINTUSIZ); qry->count = 0; return qry;}/* Delete a query object. */void tctdbqrydel(TDBQRY *qry){ assert(qry); tcxstrdel(qry->hint); TCFREE(qry->oname); TDBCOND *conds = qry->conds; int cnum = qry->cnum; for(int i = 0; i < cnum; i++){ TDBCOND *cond = conds + i; TCFREE(cond->expr); TCFREE(cond->name); } TCFREE(conds); TCFREE(qry);}/* Add a narrowing condition to a query object. */void tctdbqryaddcond(TDBQRY *qry, const char *name, int op, const char *expr){ assert(qry && name && expr); int cnum = qry->cnum; TCREALLOC(qry->conds, qry->conds, sizeof(qry->conds[0]) * (cnum + 1)); TDBCOND *cond = qry->conds + cnum; int nsiz = strlen(name); int esiz = strlen(expr); TCMEMDUP(cond->name, name, nsiz); cond->nsiz = nsiz; bool sign = true; if(op & TDBQCNEGATE){ op &= ~TDBQCNEGATE; sign = false; } bool noidx = false; if(op & TDBQCNOIDX){ op &= ~TDBQCNOIDX; noidx = true; } cond->op = op; cond->sign = sign; cond->noidx = noidx; TCMEMDUP(cond->expr, expr, esiz); cond->esiz = esiz; qry->cnum++;}/* Set the order of a query object. */void tctdbqrysetorder(TDBQRY *qry, const char *name, int type){ assert(qry && name); if(qry->oname) TCFREE(qry->oname); qry->oname = tcstrdup(name); qry->otype = type;}/* Set the limit number of records of the result of a query object. */void tctdbqrysetlimit(TDBQRY *qry, int max, int skip){ assert(qry); qry->max = (max >= 0) ? max : INT_MAX; qry->skip = (skip > 0) ? skip : 0;}/* Execute the search of a query object. */TCLIST *tctdbqrysearch(TDBQRY *qry){ assert(qry); TCTDB *tdb = qry->tdb; if(!TDBLOCKMETHOD(tdb, false)) return tclistnew(); if(!tdb->open){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return tclistnew(); } TCLIST *rv = tctdbqrysearchimpl(qry); TDBUNLOCKMETHOD(tdb); return rv;}/* Remove each record corresponding to a query object. */bool tctdbqrysearchout(TDBQRY *qry){ assert(qry); return tctdbqryproc(qry, tctdbqryprocoutcb, NULL);}/* Process each record corresponding to a query object. */bool tctdbqryproc(TDBQRY *qry, TDBQRYPROC proc, void *op){ assert(qry && proc); TCTDB *tdb = qry->tdb; if(!TDBLOCKMETHOD(tdb, true)) return tclistnew(); if(!tdb->open || !tdb->wmode){ tctdbsetecode(tdb, TCEINVALID, __FILE__, __LINE__, __func__); TDBUNLOCKMETHOD(tdb); return false; } bool err = false; int64_t getnum = 0; int64_t putnum = 0; int64_t outnum = 0; TCLIST *res = tctdbqrysearchimpl(qry); int rnum = TCLISTNUM(res); for(int i = 0; i < rnum; i++){ const char *pkbuf; int pksiz; TCLISTVAL(pkbuf, res, i, pksiz); TCMAP *cols = tctdbgetimpl(tdb, pkbuf, pksiz); if(!cols){ err = true; continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -