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

📄 tctdb.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -