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

📄 tchdb.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 5 页
字号:
bool tchdbput2(TCHDB *hdb, const char *kstr, const char *vstr){  assert(hdb && kstr && vstr);  return tchdbput(hdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Store a new record into a hash database object. */bool tchdbputkeep(TCHDB *hdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(hdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return false;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER)){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return false;  }  if(!HDBLOCKRECORD(hdb, bidx, true)){    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->zmode){    char *zbuf;    if(hdb->opts & HDBTDEFLATE){      zbuf = _tc_deflate(vbuf, vsiz, &vsiz, _TCZMRAW);    } else if(hdb->opts & HDBTBZIP){      zbuf = _tc_bzcompress(vbuf, vsiz, &vsiz);    } else if(hdb->opts & HDBTTCBS){      zbuf = tcbsencode(vbuf, vsiz, &vsiz);    } else {      zbuf = hdb->enc(vbuf, vsiz, &vsiz, hdb->encop);    }    if(!zbuf){      tchdbsetecode(hdb, TCEMISC, __FILE__, __LINE__, __func__);      HDBUNLOCKRECORD(hdb, bidx);      HDBUNLOCKMETHOD(hdb);      return false;    }    bool rv = tchdbputimpl(hdb, kbuf, ksiz, bidx, hash, zbuf, vsiz, HDBPDKEEP);    TCFREE(zbuf);    HDBUNLOCKRECORD(hdb, bidx);    HDBUNLOCKMETHOD(hdb);    return rv;  }  bool rv = tchdbputimpl(hdb, kbuf, ksiz, bidx, hash, vbuf, vsiz, HDBPDKEEP);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Store a new string record into a hash database object. */bool tchdbputkeep2(TCHDB *hdb, const char *kstr, const char *vstr){  return tchdbputkeep(hdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Concatenate a value at the end of the existing record in a hash database object. */bool tchdbputcat(TCHDB *hdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(hdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return false;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER)){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return false;  }  if(!HDBLOCKRECORD(hdb, bidx, true)){    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->zmode){    char *zbuf;    int osiz;    char *obuf = tchdbgetimpl(hdb, kbuf, ksiz, bidx, hash, &osiz);    if(obuf){      TCREALLOC(obuf, obuf, osiz + vsiz + 1);      memcpy(obuf + osiz, vbuf, vsiz);      if(hdb->opts & HDBTDEFLATE){        zbuf = _tc_deflate(obuf, osiz + vsiz, &vsiz, _TCZMRAW);      } else if(hdb->opts & HDBTBZIP){        zbuf = _tc_bzcompress(obuf, osiz + vsiz, &vsiz);      } else if(hdb->opts & HDBTTCBS){        zbuf = tcbsencode(obuf, osiz + vsiz, &vsiz);      } else {        zbuf = hdb->enc(obuf, osiz + vsiz, &vsiz, hdb->encop);      }      TCFREE(obuf);    } else {      if(hdb->opts & HDBTDEFLATE){        zbuf = _tc_deflate(vbuf, vsiz, &vsiz, _TCZMRAW);      } else if(hdb->opts & HDBTBZIP){        zbuf = _tc_bzcompress(vbuf, vsiz, &vsiz);      } else if(hdb->opts & HDBTTCBS){        zbuf = tcbsencode(vbuf, vsiz, &vsiz);      } else {        zbuf = hdb->enc(vbuf, vsiz, &vsiz, hdb->encop);      }    }    if(!zbuf){      tchdbsetecode(hdb, TCEMISC, __FILE__, __LINE__, __func__);      HDBUNLOCKRECORD(hdb, bidx);      HDBUNLOCKMETHOD(hdb);      return false;    }    bool rv = tchdbputimpl(hdb, kbuf, ksiz, bidx, hash, zbuf, vsiz, HDBPDOVER);    TCFREE(zbuf);    HDBUNLOCKRECORD(hdb, bidx);    HDBUNLOCKMETHOD(hdb);    return rv;  }  bool rv = tchdbputimpl(hdb, kbuf, ksiz, bidx, hash, vbuf, vsiz, HDBPDCAT);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Concatenate a string value at the end of the existing record in a hash database object. */bool tchdbputcat2(TCHDB *hdb, const char *kstr, const char *vstr){  assert(hdb && kstr && vstr);  return tchdbputcat(hdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Store a record into a hash database object in asynchronous fashion. */bool tchdbputasync(TCHDB *hdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz){  assert(hdb && kbuf && ksiz >= 0 && vbuf && vsiz >= 0);  if(!HDBLOCKMETHOD(hdb, true)) return false;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  hdb->async = true;  if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER)){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->zmode){    char *zbuf;    if(hdb->opts & HDBTDEFLATE){      zbuf = _tc_deflate(vbuf, vsiz, &vsiz, _TCZMRAW);    } else if(hdb->opts & HDBTBZIP){      zbuf = _tc_bzcompress(vbuf, vsiz, &vsiz);    } else if(hdb->opts & HDBTTCBS){      zbuf = tcbsencode(vbuf, vsiz, &vsiz);    } else {      zbuf = hdb->enc(vbuf, vsiz, &vsiz, hdb->encop);    }    if(!zbuf){      tchdbsetecode(hdb, TCEMISC, __FILE__, __LINE__, __func__);      HDBUNLOCKMETHOD(hdb);      return false;    }    bool rv = tchdbputasyncimpl(hdb, kbuf, ksiz, bidx, hash, zbuf, vsiz);    TCFREE(zbuf);    HDBUNLOCKMETHOD(hdb);    return rv;  }  bool rv = tchdbputasyncimpl(hdb, kbuf, ksiz, bidx, hash, vbuf, vsiz);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Store a string record into a hash database object in asynchronous fashion. */bool tchdbputasync2(TCHDB *hdb, const char *kstr, const char *vstr){  assert(hdb && kstr && vstr);  return tchdbputasync(hdb, kstr, strlen(kstr), vstr, strlen(vstr));}/* Remove a record of a hash database object. */bool tchdbout(TCHDB *hdb, const void *kbuf, int ksiz){  assert(hdb && kbuf && ksiz >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return false;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER)){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return false;  }  if(!HDBLOCKRECORD(hdb, bidx, true)){    HDBUNLOCKMETHOD(hdb);    return false;  }  bool rv = tchdboutimpl(hdb, kbuf, ksiz, bidx, hash);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Remove a string record of a hash database object. */bool tchdbout2(TCHDB *hdb, const char *kstr){  assert(hdb && kstr);  return tchdbout(hdb, kstr, strlen(kstr));}/* Retrieve a record in a hash database object. */void *tchdbget(TCHDB *hdb, const void *kbuf, int ksiz, int *sp){  assert(hdb && kbuf && ksiz >= 0 && sp);  if(!HDBLOCKMETHOD(hdb, false)) return NULL;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return NULL;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return NULL;  }  if(!HDBLOCKRECORD(hdb, bidx, false)){    HDBUNLOCKMETHOD(hdb);    return false;  }  char *rv = tchdbgetimpl(hdb, kbuf, ksiz, bidx, hash, sp);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Retrieve a string record in a hash database object. */char *tchdbget2(TCHDB *hdb, const char *kstr){  assert(hdb && kstr);  int vsiz;  return tchdbget(hdb, kstr, strlen(kstr), &vsiz);}/* Retrieve a record in a hash database object and write the value into a buffer. */int tchdbget3(TCHDB *hdb, const void *kbuf, int ksiz, void *vbuf, int max){  assert(hdb && kbuf && ksiz >= 0 && vbuf && max >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return -1;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return -1;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return -1;  }  if(!HDBLOCKRECORD(hdb, bidx, false)){    HDBUNLOCKMETHOD(hdb);    return -1;  }  int rv = tchdbgetintobuf(hdb, kbuf, ksiz, bidx, hash, vbuf, max);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Get the size of the value of a record in a hash database object. */int tchdbvsiz(TCHDB *hdb, const void *kbuf, int ksiz){  assert(hdb && kbuf && ksiz >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return -1;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);  if(hdb->fd < 0){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return -1;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return -1;  }  if(!HDBLOCKRECORD(hdb, bidx, false)){    HDBUNLOCKMETHOD(hdb);    return -1;  }  int rv = tchdbvsizimpl(hdb, kbuf, ksiz, bidx, hash);  HDBUNLOCKRECORD(hdb, bidx);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Get the size of the value of a string record in a hash database object. */int tchdbvsiz2(TCHDB *hdb, const char *kstr){  assert(hdb && kstr);  return tchdbvsiz(hdb, kstr, strlen(kstr));}/* Initialize the iterator of a hash database object. */bool tchdbiterinit(TCHDB *hdb){  assert(hdb);  if(!HDBLOCKMETHOD(hdb, true)) return false;  if(hdb->fd < 0){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return false;  }  bool rv = tchdbiterinitimpl(hdb);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Get the next key of the iterator of a hash database object. */void *tchdbiternext(TCHDB *hdb, int *sp){  assert(hdb && sp);  if(!HDBLOCKMETHOD(hdb, true)) return NULL;  if(hdb->fd < 0 || hdb->iter < 1){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return NULL;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return NULL;  }  char *rv = tchdbiternextimpl(hdb, sp);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Get the next key string of the iterator of a hash database object. */char *tchdbiternext2(TCHDB *hdb){  assert(hdb);  int vsiz;  return tchdbiternext(hdb, &vsiz);}/* Get the next extensible objects of the iterator of a hash database object. */bool tchdbiternext3(TCHDB *hdb, TCXSTR *kxstr, TCXSTR *vxstr){  assert(hdb && kxstr && vxstr);  if(!HDBLOCKMETHOD(hdb, true)) return false;  if(hdb->fd < 0 || hdb->iter < 1){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return false;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return false;  }  bool rv = tchdbiternextintoxstr(hdb, kxstr, vxstr);  HDBUNLOCKMETHOD(hdb);  return rv;}/* Get forward matching keys in a hash database object. */TCLIST *tchdbfwmkeys(TCHDB *hdb, const void *pbuf, int psiz, int max){  assert(hdb && pbuf && psiz >= 0);  TCLIST* keys = tclistnew();  if(!HDBLOCKMETHOD(hdb, true)) return keys;  if(hdb->fd < 0){    tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);    HDBUNLOCKMETHOD(hdb);    return keys;  }  if(hdb->async && !tchdbflushdrp(hdb)){    HDBUNLOCKMETHOD(hdb);    return keys;  }  if(max < 0) max = INT_MAX;  uint64_t iter = hdb->iter;  tchdbiterinitimpl(hdb);  char *kbuf;  int ksiz;  while(TCLISTNUM(keys) < max && (kbuf = tchdbiternextimpl(hdb, &ksiz)) != NULL){    if(ksiz >= psiz && !memcmp(kbuf, pbuf, psiz)){      tclistpushmalloc(keys, kbuf, ksiz);    } else {      TCFREE(kbuf);    }  }  hdb->iter = iter;  HDBUNLOCKMETHOD(hdb);  return keys;}/* Get forward matching string keys in a hash database object. */TCLIST *tchdbfwmkeys2(TCHDB *hdb, const char *pstr, int max){  assert(hdb && pstr);  return tchdbfwmkeys(hdb, pstr, strlen(pstr), max);}/* Add an integer to a record in a hash database object. */int tchdbaddint(TCHDB *hdb, const void *kbuf, int ksiz, int num){  assert(hdb && kbuf && ksiz >= 0);  if(!HDBLOCKMETHOD(hdb, false)) return INT_MIN;  uint8_t hash;  uint64_t bidx = tchdbbidx(hdb, kbuf, ksiz, &hash);

⌨️ 快捷键说明

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