亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcbdb.c

?? Tokyo Cabinet的Tokyo Cabinet 是一個DBM的實現。這里的數據庫由一系列key-value對的記錄構成。key和value都可以是任意長度的字節序列,既可以是二進制也可以是字符
?? C
?? 第 1 頁 / 共 5 頁
字號:
  llnum = bdb->first;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);  llnum = bdb->last;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);  llnum = bdb->lnum;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);  llnum = bdb->nnum;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);  llnum = bdb->rnum;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);}/* Deserialize meta data from the opaque field.   `bdb' specifies the B+ tree database object. */static void tcbdbloadmeta(TCBDB *bdb){  const char *rp = bdb->opaque;  uint8_t cnum = *(uint8_t *)(rp++);  if(cnum == 0x0){    bdb->cmp = tccmplexical;  } else if(cnum == 0x1){    bdb->cmp = tccmpdecimal;  } else if(cnum == 0x2){    bdb->cmp = tccmpint32;  } else if(cnum == 0x3){    bdb->cmp = tccmpint64;  }  rp += 7;  uint32_t lnum;  memcpy(&lnum, rp, sizeof(lnum));  rp += sizeof(lnum);  bdb->lmemb = TCITOHL(lnum);  memcpy(&lnum, rp, sizeof(lnum));  rp += sizeof(lnum);  bdb->nmemb = TCITOHL(lnum);  uint64_t llnum;  memcpy(&llnum, rp, sizeof(llnum));  bdb->root = TCITOHLL(llnum);  rp += sizeof(llnum);  memcpy(&llnum, rp, sizeof(llnum));  bdb->first = TCITOHLL(llnum);  rp += sizeof(llnum);  memcpy(&llnum, rp, sizeof(llnum));  bdb->last = TCITOHLL(llnum);  rp += sizeof(llnum);  memcpy(&llnum, rp, sizeof(llnum));  bdb->lnum = TCITOHLL(llnum);  rp += sizeof(llnum);  memcpy(&llnum, rp, sizeof(llnum));  bdb->nnum = TCITOHLL(llnum);  rp += sizeof(llnum);  memcpy(&llnum, rp, sizeof(llnum));  bdb->rnum = TCITOHLL(llnum);  rp += sizeof(llnum);}/* Create a new leaf.   `bdb' specifies the B+ tree database object.   `prev' specifies the ID number of the previous leaf.   `next' specifies the ID number of the next leaf.   The return value is the new leaf object. */static BDBLEAF *tcbdbleafnew(TCBDB *bdb, uint64_t prev, uint64_t next){  assert(bdb);  BDBLEAF lent;  lent.id = ++bdb->lnum;  lent.recs = tcptrlistnew2(bdb->lmemb + 1);  lent.size = 0;  lent.prev = prev;  lent.next = next;  lent.dirty = true;  lent.dead = false;  tcmapputkeep(bdb->leafc, &(lent.id), sizeof(lent.id), &lent, sizeof(lent));  int rsiz;  return (BDBLEAF *)tcmapget(bdb->leafc, &(lent.id), sizeof(lent.id), &rsiz);}/* Remove a leaf from the cache.   `bdb' specifies the B+ tree database object.   `leaf' specifies the leaf object.   If successful, the return value is true, else, it is false. */static bool tcbdbleafcacheout(TCBDB *bdb, BDBLEAF *leaf){  assert(bdb && leaf);  bool err = false;  if(leaf->dirty && !tcbdbleafsave(bdb, leaf)) err = true;  TCPTRLIST *recs = leaf->recs;  int ln = TCPTRLISTNUM(recs);  for(int i = 0; i < ln; i++){    BDBREC *rec = TCPTRLISTVAL(recs, i);    if(rec->rest) tclistdel(rec->rest);    TCFREE(rec);  }  tcptrlistdel(recs);  tcmapout(bdb->leafc, &(leaf->id), sizeof(leaf->id));  return !err;}/* Save a leaf into the internal database.   `bdb' specifies the B+ tree database object.   `leaf' specifies the leaf object.   If successful, the return value is true, else, it is false. */static bool tcbdbleafsave(TCBDB *bdb, BDBLEAF *leaf){  assert(bdb && leaf);  TCDODEBUG(bdb->cnt_saveleaf++);  TCXSTR *rbuf = tcxstrnew3(BDBPAGEBUFSIZ);  char hbuf[(sizeof(uint64_t)+1)*3];  char *wp = hbuf;  uint64_t llnum;  int step;  llnum = leaf->prev;  TCSETVNUMBUF64(step, wp, llnum);  wp += step;  llnum = leaf->next;  TCSETVNUMBUF64(step, wp, llnum);  wp += step;  TCXSTRCAT(rbuf, hbuf, wp - hbuf);  TCPTRLIST *recs = leaf->recs;  int ln = TCPTRLISTNUM(recs);  for(int i = 0; i < ln; i++){    BDBREC *rec = TCPTRLISTVAL(recs, i);    char *dbuf = (char *)rec + sizeof(*rec);    int lnum;    wp = hbuf;    lnum = rec->ksiz;    TCSETVNUMBUF(step, wp, lnum);    wp += step;    lnum = rec->vsiz;    TCSETVNUMBUF(step, wp, lnum);    wp += step;    TCLIST *rest = rec->rest;    int rnum = rest ? TCLISTNUM(rest) : 0;    TCSETVNUMBUF(step, wp, rnum);    wp += step;    TCXSTRCAT(rbuf, hbuf, wp - hbuf);    TCXSTRCAT(rbuf, dbuf, rec->ksiz);    TCXSTRCAT(rbuf, dbuf + rec->ksiz + TCALIGNPAD(rec->ksiz), rec->vsiz);    for(int j = 0; j < rnum; j++){      const char *vbuf;      int vsiz;      TCLISTVAL(vbuf, rest, j, vsiz);      TCSETVNUMBUF(step, hbuf, vsiz);      TCXSTRCAT(rbuf, hbuf, step);      TCXSTRCAT(rbuf, vbuf, vsiz);    }  }  bool err = false;  step = sprintf(hbuf, "%llx", (unsigned long long)leaf->id);  if(ln < 1 && !tchdbout(bdb->hdb, hbuf, step) && tchdbecode(bdb->hdb) != TCENOREC)    err = true;  if(!leaf->dead && !tchdbput(bdb->hdb, hbuf, step, TCXSTRPTR(rbuf), TCXSTRSIZE(rbuf)))    err = true;  tcxstrdel(rbuf);  leaf->dirty = false;  leaf->dead = false;  return !err;}/* Load a leaf from the internal database.   `bdb' specifies the B+ tree database object.   `id' specifies the ID number of the leaf.   The return value is the leaf object or `NULL' on failure. */static BDBLEAF *tcbdbleafload(TCBDB *bdb, uint64_t id){  assert(bdb && id > 0);  bool clk = BDBLOCKCACHE(bdb);  int rsiz;  BDBLEAF *leaf = (BDBLEAF *)tcmapget3(bdb->leafc, &id, sizeof(id), &rsiz);  if(leaf){    if(clk) BDBUNLOCKCACHE(bdb);    return leaf;  }  if(clk) BDBUNLOCKCACHE(bdb);  TCDODEBUG(bdb->cnt_loadleaf++);  char hbuf[(sizeof(uint64_t)+1)*3];  int step;  step = sprintf(hbuf, "%llx", (unsigned long long)id);  char *rbuf = NULL;  char wbuf[BDBPAGEBUFSIZ];  const char *rp = NULL;  rsiz = tchdbget3(bdb->hdb, hbuf, step, wbuf, BDBPAGEBUFSIZ);  if(rsiz < 1){    tcbdbsetecode(bdb, TCEMISC, __FILE__, __LINE__, __func__);    return false;  } else if(rsiz < BDBPAGEBUFSIZ){    rp = wbuf;  } else {    if(!(rbuf = tchdbget(bdb->hdb, hbuf, step, &rsiz))){      tcbdbsetecode(bdb, TCEMISC, __FILE__, __LINE__, __func__);      return false;    }    rp = rbuf;  }  BDBLEAF lent;  lent.id = id;  uint64_t llnum;  TCREADVNUMBUF64(rp, llnum, step);  lent.prev = llnum;  rp += step;  rsiz -= step;  TCREADVNUMBUF64(rp, llnum, step);  lent.next = llnum;  rp += step;  rsiz -= step;  lent.dirty = false;  lent.dead = false;  lent.recs = tcptrlistnew2(bdb->lmemb + 1);  lent.size = 0;  bool err = false;  while(rsiz >= 3){    int ksiz;    TCREADVNUMBUF(rp, ksiz, step);    rp += step;    rsiz -= step;    int vsiz;    TCREADVNUMBUF(rp, vsiz, step);    rp += step;    rsiz -= step;    int rnum;    TCREADVNUMBUF(rp, rnum, step);    rp += step;    rsiz -= step;    if(rsiz < ksiz + vsiz + rnum){      err = true;      break;    }    int psiz = TCALIGNPAD(ksiz);    BDBREC *nrec;    TCMALLOC(nrec, sizeof(*nrec) + ksiz + psiz + vsiz + 1);    char *dbuf = (char *)nrec + sizeof(*nrec);    memcpy(dbuf, rp, ksiz);    dbuf[ksiz] = '\0';    nrec->ksiz = ksiz;    rp += ksiz;    rsiz -= ksiz;    memcpy(dbuf + ksiz + psiz, rp, vsiz);    dbuf[ksiz+psiz+vsiz] = '\0';    nrec->vsiz = vsiz;    rp += vsiz;    rsiz -= vsiz;    lent.size += ksiz;    lent.size += vsiz;    if(rnum > 0){      nrec->rest = tclistnew2(rnum);      while(rnum-- > 0 && rsiz > 0){        TCREADVNUMBUF(rp, vsiz, step);        rp += step;        rsiz -= step;        if(rsiz < vsiz){          err = true;          break;        }        TCLISTPUSH(nrec->rest, rp, vsiz);        rp += vsiz;        rsiz -= vsiz;        lent.size += vsiz;      }    } else {      nrec->rest = NULL;    }    TCPTRLISTPUSH(lent.recs, nrec);  }  TCFREE(rbuf);  if(err || rsiz != 0){    tcbdbsetecode(bdb, TCEMISC, __FILE__, __LINE__, __func__);    return NULL;  }  clk = BDBLOCKCACHE(bdb);  if(!tcmapputkeep(bdb->leafc, &(lent.id), sizeof(lent.id), &lent, sizeof(lent))){    int ln = TCPTRLISTNUM(lent.recs);    for(int i = 0; i < ln; i++){      BDBREC *rec = TCPTRLISTVAL(lent.recs, i);      if(rec->rest) tclistdel(rec->rest);      TCFREE(rec);    }    tcptrlistdel(lent.recs);  }  leaf = (BDBLEAF *)tcmapget(bdb->leafc, &(lent.id), sizeof(lent.id), &rsiz);  if(clk) BDBUNLOCKCACHE(bdb);  return leaf;}/* Check existence of a leaf in the internal database.   `bdb' specifies the B+ tree database object.   `id' specifies the ID number of the leaf.   The return value is true if the leaf exists, else, it is false. */static bool tcbdbleafcheck(TCBDB *bdb, uint64_t id){  assert(bdb && id > 0);  bool clk = BDBLOCKCACHE(bdb);  int rsiz;  BDBLEAF *leaf = (BDBLEAF *)tcmapget(bdb->leafc, &id, sizeof(id), &rsiz);  if(clk) BDBUNLOCKCACHE(bdb);  if(leaf) return true;  char hbuf[(sizeof(uint64_t)+1)*3];  int step = sprintf(hbuf, "%llx", (unsigned long long)id);  return tchdbvsiz(bdb->hdb, hbuf, step) > 0;}/* Load the historical leaf from the internal database.   `bdb' specifies the B+ tree database object.   `kbuf' specifies the pointer to the region of the key.   `ksiz' specifies the size of the region of the key.   `id' specifies the ID number of the historical leaf.   If successful, the return value is the pointer to the leaf, else, it is `NULL'. */static BDBLEAF *tcbdbgethistleaf(TCBDB *bdb, const char *kbuf, int ksiz, uint64_t id){  assert(bdb && kbuf && ksiz >= 0 && id > 0);  BDBLEAF *leaf = tcbdbleafload(bdb, id);  if(!leaf) return NULL;  int ln = TCPTRLISTNUM(leaf->recs);  if(ln < 2) return NULL;  BDBREC *rec = TCPTRLISTVAL(leaf->recs, 0);  char *dbuf = (char *)rec + sizeof(*rec);  int rv;  if(bdb->cmp == tccmplexical){    TCCMPLEXICAL(rv, kbuf, ksiz, dbuf, rec->ksiz);  } else {    rv = bdb->cmp(kbuf, ksiz, dbuf, rec->ksiz, bdb->cmpop);  }  if(rv == 0) return leaf;  if(rv < 0) return NULL;  rec = TCPTRLISTVAL(leaf->recs, ln - 1);  dbuf = (char *)rec + sizeof(*rec);  if(bdb->cmp == tccmplexical){    TCCMPLEXICAL(rv, kbuf, ksiz, dbuf, rec->ksiz);  } else {    rv = bdb->cmp(kbuf, ksiz, dbuf, rec->ksiz, bdb->cmpop);  }  if(rv <= 0 || leaf->next < 1) return leaf;  return NULL;}/* Add a record to a leaf.   `bdb' specifies the B+ tree database object.   `leaf' specifies the leaf object.   `dmode' specifies behavior when the key overlaps.   `kbuf' specifies the pointer to the region of the key.   `ksiz' specifies the size of the region of the key.   `vbuf' specifies the pointer to the region of the value.   `vsiz' specifies the size of the region of the value.   If successful, the return value is true, else, it is false. */static bool tcbdbleafaddrec(TCBDB *bdb, BDBLEAF *leaf, int dmode,                            const char *kbuf, int ksiz, const char *vbuf, int vsiz){  assert(bdb && leaf && kbuf && ksiz >= 0);  TCCMP cmp = bdb->cmp;  void *cmpop = bdb->cmpop;  TCPTRLIST *recs = leaf->recs;  int ln = TCPTRLISTNUM(recs);  int left = 0;  int right = ln;  int i = (left + right) / 2;  while(right >= left && i < ln){    BDBREC *rec = TCPTRLISTVAL(recs, i);    char *dbuf = (char *)rec + sizeof(*rec);    int rv;    if(cmp == tccmplexical){      TCCMPLEXICAL(rv, kbuf, ksiz, dbuf, rec->ksiz);    } else {      rv = cmp(kbuf, ksiz, dbuf, rec->ksiz, cmpop);    }    if(rv == 0){      break;    } else if(rv <= 0){      right = i - 1;    } else {      left = i + 1;    }    i = (left + right) / 2;  }  while(i < ln){    BDBREC *rec = TCPTRLISTVAL(recs, i);    char *dbuf = (char *)rec + sizeof(*rec);    int rv;    if(cmp == tccmplexical){      TCCMPLEXICAL(rv, kbuf, ksiz, dbuf, rec->ksiz);    } else {      rv = cmp(kbuf, ksiz, dbuf, rec->ksiz, cmpop);    }    if(rv == 0){      int psiz = TCALIGNPAD(rec->ksiz);      BDBREC *orec = rec;      BDBPDPROCOP *procptr;      int nvsiz;      char *nvbuf;      switch(dmode){      case BDBPDKEEP:        tcbdbsetecode(bdb, TCEKEEP, __FILE__, __LINE__, __func__);        return false;      case BDBPDCAT:        leaf->size += vsiz;        TCREALLOC(rec, rec, sizeof(*rec) + rec->ksiz + psiz + rec->vsiz + vsiz + 1);        if(rec != orec){          tcptrlistover(recs, i, rec);          dbuf = (char *)rec + sizeof(*rec);        }        memcpy(dbuf + rec->ksiz + psiz + rec->vsiz, vbuf, vsiz);        rec->vsiz += vsiz;        dbuf[rec->ksiz+psiz+rec->vsiz] = '\0';        break;      case BDBPDDUP:        leaf->size += vsiz;        if(!rec->rest) rec->rest = tclistnew2(1);        TCLISTPUSH(rec->rest, vbuf, vsiz);        bdb->rnum++;        break;      case BDBPDDUPB:        leaf->size += vsiz;        if(!rec->rest) rec->rest = tclistnew2(1);        tclistunshift(rec->rest, dbuf + rec->ksiz + psiz, rec->vsiz);        if(vsiz > rec->vsiz){          TCREALLOC(rec, rec, sizeof(*rec) + rec->ksiz + psiz + vsiz + 1);          if(rec != orec){            tcptrlistover(recs, i, rec);            dbuf = (char *)rec + sizeof(*rec);          }        }        memcpy(dbuf + rec->ksiz + psiz, vbuf, vsiz);        dbuf[rec->ksiz+psiz+vsiz] = '\0';        rec->vsiz = vsiz;        bdb->rnum++;        break;      case BDBPDADDINT:        if(re

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品久久久久久久久久久久| 亚洲精品乱码久久久久| 欧美精三区欧美精三区| 99久精品国产| 99精品久久久久久| 91在线一区二区三区| 成人一区二区在线观看| 国产精品一区二区久久不卡| 国产在线不卡一区| 成人午夜精品在线| 色哟哟欧美精品| 欧美三级蜜桃2在线观看| 欧美影院一区二区三区| 欧美日韩欧美一区二区| 7777精品伊人久久久大香线蕉 | 91在线国产观看| 91色porny在线视频| 在线视频中文字幕一区二区| 欧美日韩精品三区| 欧美一区二区国产| 国产欧美精品一区| 国产精品电影一区二区| 亚洲人午夜精品天堂一二香蕉| 一二三四社区欧美黄| 亚洲影院理伦片| 久久疯狂做爰流白浆xx| 国产精品99久久不卡二区| 成人性生交大片免费看视频在线| 成人免费毛片嘿嘿连载视频| 在线观看视频欧美| 久久久久久久久蜜桃| 亚洲精品乱码久久久久久日本蜜臀| 亚洲一区二区三区四区在线观看 | 亚洲精品日产精品乱码不卡| 午夜欧美2019年伦理| 韩国av一区二区三区在线观看| 99久久综合99久久综合网站| 欧美日韩精品三区| 中文字幕制服丝袜一区二区三区| 午夜精品久久久久久久99水蜜桃| 国产一区二区三区免费看 | 国产福利视频一区二区三区| 91麻豆国产在线观看| 欧美成人vr18sexvr| 亚洲免费观看高清完整版在线观看 | 欧美色窝79yyyycom| 亚洲天堂精品在线观看| 日韩av中文字幕一区二区| 91视频在线观看免费| 欧美va亚洲va国产综合| 亚洲aaa精品| 99re热视频精品| 国产欧美一区二区精品秋霞影院| 亚洲国产成人91porn| av色综合久久天堂av综合| 精品电影一区二区| 亚洲mv大片欧洲mv大片精品| 91啪九色porn原创视频在线观看| 久久综合久久综合久久| 久久国产精品露脸对白| 精品视频在线免费看| 亚洲情趣在线观看| a美女胸又www黄视频久久| 久久免费看少妇高潮| 国产资源在线一区| 欧美精品一区二区久久婷婷| 日韩国产精品久久久久久亚洲| 欧美日韩中文字幕一区| 亚洲香肠在线观看| 在线观看精品一区| 亚洲一区二区视频在线| 欧美伊人久久久久久午夜久久久久| 中文字幕一区二区三区四区不卡| 成人动漫中文字幕| 中文字幕亚洲一区二区av在线| 成人免费高清在线观看| 国产精品色婷婷| 91在线看国产| 亚洲国产精品麻豆| 欧美肥妇free| 免费高清视频精品| 精品国产123| 国产成人精品影视| 亚洲三级免费电影| 欧美卡1卡2卡| 久久精品国内一区二区三区| 久久综合久久鬼色| 成人黄色网址在线观看| 亚洲精品网站在线观看| 欧美片网站yy| 国产一区二区不卡在线| 国产精品第五页| 欧美裸体bbwbbwbbw| 久久精品免费观看| 国产精品乱码久久久久久| 色屁屁一区二区| 日韩avvvv在线播放| 欧美激情综合网| 91久久一区二区| 日本成人在线视频网站| 国产欧美日韩麻豆91| 在线日韩一区二区| 国产一区视频网站| 亚洲黄色av一区| 精品国偷自产国产一区| 99久久婷婷国产精品综合| 日韩精彩视频在线观看| 久久精品人人做人人爽97| 色妹子一区二区| 久久狠狠亚洲综合| 亚洲精品免费一二三区| 欧美电视剧免费观看| 色哟哟在线观看一区二区三区| 三级一区在线视频先锋| 国产精品素人一区二区| 日韩视频123| 色综合久久中文字幕综合网| 麻豆视频一区二区| 一区二区成人在线| 国产精品色婷婷| 精品国一区二区三区| 欧美日韩高清不卡| 99热这里都是精品| 国产成人精品免费在线| 日产国产欧美视频一区精品| 亚洲免费看黄网站| 国产精品日日摸夜夜摸av| 日韩欧美色电影| 欧美日韩高清一区二区| 在线视频欧美区| 99久久久国产精品免费蜜臀| 国产一区二区美女诱惑| 理论电影国产精品| 五月综合激情网| 亚洲一卡二卡三卡四卡无卡久久| 久久久午夜精品| 精品国产乱码久久| 日韩午夜电影av| 在线播放一区二区三区| 欧美日韩一二区| 91福利社在线观看| 一本大道av伊人久久综合| 不卡一区二区三区四区| 国产在线精品国自产拍免费| 蜜臀av一区二区三区| 日本不卡视频一二三区| 丝袜亚洲另类欧美| 午夜在线成人av| 三级久久三级久久| 免费在线观看成人| 日本免费新一区视频| 免费成人在线观看| 精品影视av免费| 国产传媒一区在线| 成人动漫在线一区| 色综合久久88色综合天天| 色综合天天综合网国产成人综合天 | 成人av网站大全| 9色porny自拍视频一区二区| 99天天综合性| 91福利小视频| 在线电影国产精品| 日韩一区二区三区观看| 精品动漫一区二区三区在线观看| 精品美女被调教视频大全网站| 久久久久久久精| 亚洲免费观看高清完整版在线观看熊| 亚洲人成精品久久久久| 亚洲国产欧美日韩另类综合| 日本中文一区二区三区| 韩国精品主播一区二区在线观看| 国产盗摄视频一区二区三区| 91欧美激情一区二区三区成人| 欧洲国产伦久久久久久久| 日韩亚洲欧美综合| 国产日韩在线不卡| 亚洲影院久久精品| 精久久久久久久久久久| 99国产一区二区三精品乱码| 欧洲一区二区三区在线| 欧美精品一区二区三区一线天视频| 欧美国产精品中文字幕| 亚洲高清视频中文字幕| 国产在线一区二区| 色欧美88888久久久久久影院| 欧美一区日本一区韩国一区| 国产欧美日韩视频一区二区| 亚洲国产日韩a在线播放性色| 黄色日韩网站视频| 在线精品亚洲一区二区不卡| 久久亚洲精华国产精华液 | 欧美一区二区三区在线电影| 久久久久综合网| 亚洲综合网站在线观看| 国产一区啦啦啦在线观看| 91一区一区三区| 久久婷婷成人综合色| 婷婷激情综合网| 色婷婷久久一区二区三区麻豆| 欧美精品一区二区三区久久久|