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

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

?? tcbdb.c

?? 高性能嵌入式數據庫在高并發的環境下使用最好是64位系統比較好
?? C
?? 第 1 頁 / 共 5 頁
字號:
  llnum = bdb->root;  llnum = TCHTOILL(llnum);  memcpy(wp, &llnum, sizeof(llnum));  wp += sizeof(llnum);  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 tcloadmeta(TCBDB *bdb){  const char *rp = bdb->opaque;  uint8_t cnum = *(uint8_t *)(rp++);  if(cnum == 0x0){    bdb->cmp = tcbdbcmplexical;  } else if(cnum == 0x1){    bdb->cmp = tcbdbcmpdecimal;  } else if(cnum == 0x2){    bdb->cmp = tcbdbcmpint32;  } else if(cnum == 0x3){    bdb->cmp = tcbdbcmpint64;  }  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.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++){      int vsiz;      const char *vbuf = tclistval(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;  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);  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;    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;      }    } 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;}/* 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.   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){  assert(bdb && kbuf && ksiz >= 0);  BDBLEAF *leaf = tcbdbleafload(bdb, bdb->hleaf);  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 == tcbdbcmplexical){    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 == tcbdbcmplexical){    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 && vbuf && vsiz >= 0);  BDBCMP 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 == tcbdbcmplexical){      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 == tcbdbcmplexical){      TCCMPLEXICAL(rv, kbuf, ksiz, dbuf, rec->ksiz);    } else {      rv = cmp(kbuf, ksiz, dbuf, rec->ksiz, cmpop);    }    if(rv == 0){      int psiz = TCALIGNPAD(ksiz);      BDBREC *orec = rec;      switch(dmode){      case BDBPDKEEP:        return false;      case BDBPDCAT:        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 + ksiz + psiz + rec->vsiz, vbuf, vsiz);        rec->vsiz += vsiz;        dbuf[ksiz+psiz+rec->vsiz] = '\0';        break;      case BDBPDDUP:        if(!rec->rest) rec->rest = tclistnew();        TCLISTPUSH(rec->rest, vbuf, vsiz);        bdb->rnum++;        break;      case BDBPDDUPB:        if(!rec->rest) rec->rest = tclistnew();        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 + ksiz + psiz, vbuf, vsiz);        dbuf[ksiz+psiz+vsiz] = '\0';        rec->vsiz = vsiz;        bdb->rnum++;        break;      case BDBPDADDINT:        if(rec->vsiz != sizeof(int)) return false;        if(*(int *)vbuf == 0){          *(int *)vbuf = *(int *)(dbuf + ksiz + psiz);          return true;        }        *(int *)(dbuf + ksiz + psiz) += *(int *)vbuf;        *(int *)vbuf = *(int *)(dbuf + ksiz + psiz);        break;      case BDBPDADDDBL:        if(rec->vsiz != sizeof(double)) return false;        if(*(double *)vbuf == 0.0){          *(double *)vbuf = *(double *)(dbuf + ksiz + psiz);          return true;        }        *(double *)(dbuf + ksiz + psiz) += *(double *)vbuf;        *(double *)vbuf = *(double *)(dbuf + ksiz + psiz);        break;      default:        if(vsiz > rec->vsiz){          TCREALLOC(rec, rec, sizeof(*rec) + ksiz + psiz + vsiz + 1);          if(rec != orec){            tcptrlistover(recs, i, rec);            dbuf = (char *)rec + sizeof(*rec);          }        }        memcpy(dbuf + ksiz + psiz, vbuf, vsiz);        dbuf[ksiz+psiz+vsiz] = '\0';        rec->vsiz = vsiz;        break;      }      break;    } else if(rv < 0){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色视频一区二区| 7777精品伊人久久久大香线蕉完整版| 亚洲乱码国产乱码精品精98午夜 | 久久不见久久见中文字幕免费| 国产精品对白交换视频| 51精品国自产在线| 色激情天天射综合网| 午夜电影网一区| 7777精品伊人久久久大香线蕉经典版下载 | 国产98色在线|日韩| 国产精品美女一区二区| 在线亚洲+欧美+日本专区| 国产精品1区二区.| 日本在线不卡视频| 国产精品久久三区| 欧美精品一区二区三区蜜臀| 欧美日韩中文字幕一区| 成a人片国产精品| 国产成人一级电影| 麻豆国产欧美日韩综合精品二区| 一个色综合av| 亚洲欧美日韩国产手机在线| 久久久国产一区二区三区四区小说 | 亚洲天堂精品视频| 久久久久国产精品厨房| 日韩一区二区三区精品视频| 欧洲日韩一区二区三区| 成人高清在线视频| 国产激情一区二区三区四区| 久久精品噜噜噜成人av农村| 丝袜脚交一区二区| 午夜精品视频在线观看| 亚洲国产精品自拍| 亚洲一二三区在线观看| 亚洲免费观看高清在线观看| 亚洲欧美一区二区三区极速播放| 中文字幕在线观看一区二区| 国产精品护士白丝一区av| 国产精品视频免费| 国产日韩三级在线| 国产精品视频一二三| 国产精品欧美综合在线| 国产精品毛片无遮挡高清| 国产精品系列在线| 最新中文字幕一区二区三区| 亚洲视频在线观看三级| 亚洲免费色视频| 亚洲国产成人高清精品| 亚洲午夜视频在线观看| 婷婷丁香久久五月婷婷| 久久99久久99精品免视看婷婷| 激情综合网av| 成人涩涩免费视频| 在线观看欧美黄色| 日韩视频免费直播| 久久久亚洲精华液精华液精华液 | 亚洲电影一级片| 五月激情综合网| 精品综合免费视频观看| 高清不卡一区二区| 一本一本久久a久久精品综合麻豆| 日本高清免费不卡视频| 欧美精品久久天天躁| 精品剧情在线观看| 国产精品视频看| 亚洲一区二区在线免费观看视频| 免费不卡在线视频| 成人小视频免费观看| 在线观看网站黄不卡| 欧美一级一级性生活免费录像| 久久美女艺术照精彩视频福利播放 | 夜夜夜精品看看| 久久国产生活片100| proumb性欧美在线观看| 7777精品伊人久久久大香线蕉完整版| 精品国产区一区| 一区二区三区高清| 麻豆国产精品视频| 一道本成人在线| 精品精品国产高清a毛片牛牛 | 欧美日韩中文字幕精品| xfplay精品久久| 亚洲视频一二三区| 蜜臀精品久久久久久蜜臀| 不卡区在线中文字幕| 欧美高清激情brazzers| 欧美韩国日本一区| 婷婷激情综合网| 99久久精品国产精品久久| 777午夜精品免费视频| 国产精品国产成人国产三级| 青青草原综合久久大伊人精品 | 日韩三级免费观看| 亚洲另类一区二区| 国产一区二区在线视频| 欧美日韩一区不卡| 中文字幕色av一区二区三区| 日韩精品欧美精品| 97成人超碰视| 久久色成人在线| 天天影视色香欲综合网老头| 91啪亚洲精品| 久久九九国产精品| 麻豆成人久久精品二区三区红| 欧洲一区二区三区在线| 国产精品久久久久婷婷 | 91黄色免费观看| 国产精品午夜免费| 国产真实精品久久二三区| 欧美久久久久久久久久| 亚洲色图在线播放| 国产乱码精品一品二品| 日韩午夜激情免费电影| 亚洲第一av色| 色久优优欧美色久优优| 亚洲欧美在线视频| 成人影视亚洲图片在线| 精品粉嫩超白一线天av| 蜜臀精品一区二区三区在线观看 | 日韩精品一二区| 91激情五月电影| 亚洲黄色av一区| 色www精品视频在线观看| 国产精品免费看片| 国产一区二区精品久久99| 日韩亚洲欧美中文三级| 日韩高清一区在线| 欧美日韩久久一区| 亚洲图片自拍偷拍| 91黄色在线观看| 亚洲在线成人精品| 欧美日韩在线三级| 亚洲成人在线免费| 在线91免费看| 亚洲国产另类av| 91麻豆精品国产91久久久久久 | 国产91清纯白嫩初高中在线观看| 精品国产99国产精品| 久久99精品国产.久久久久久 | 中文字幕在线一区二区三区| 懂色一区二区三区免费观看| 国产情人综合久久777777| 国产精品一区二区你懂的| 久久精品日韩一区二区三区| 国产精品自拍av| 国产精品素人一区二区| eeuss鲁片一区二区三区在线看| 亚洲视频狠狠干| 91福利在线导航| 亚洲国产欧美日韩另类综合| 欧美三级一区二区| 亚洲人妖av一区二区| 粉嫩一区二区三区在线看| 国产日韩欧美高清在线| 成人国产精品视频| 日本一区二区三区国色天香| 精品一区二区影视| 国产精品久久久久久亚洲毛片| 粉嫩av一区二区三区在线播放 | 国内偷窥港台综合视频在线播放| 亚洲精品一区二区三区影院 | 日韩天堂在线观看| 国产乱子伦视频一区二区三区 | 精品国产免费久久| 成人短视频下载| 亚洲成在线观看| 久久亚洲一区二区三区四区| 99re这里只有精品视频首页| 亚洲电影视频在线| 久久久久久久久免费| 欧洲一区在线电影| 精品综合免费视频观看| 亚洲男同1069视频| 日韩精品最新网址| 99精品视频免费在线观看| 午夜精品一区二区三区电影天堂 | 日韩免费观看高清完整版| 国产成人精品三级| 亚洲bdsm女犯bdsm网站| 国产亚洲福利社区一区| 欧美视频中文字幕| 国产成人无遮挡在线视频| 午夜精品123| 中文字幕免费一区| 91精品国产高清一区二区三区蜜臀 | 久久激情综合网| 一区二区在线观看视频| 日韩欧美二区三区| 日本高清不卡一区| 粉嫩一区二区三区在线看| 日韩电影在线观看网站| |精品福利一区二区三区| 精品少妇一区二区三区在线播放 | 成人午夜av在线| 免费在线视频一区| 一区二区三区四区国产精品| 久久久亚洲精品石原莉奈| 91精品国产综合久久久久久漫画| 不卡视频一二三| 国产馆精品极品|