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