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

📄 tcbmgr.c

📁 高性能嵌入式数据库在高并发的环境下使用最好是64位系统比较好
💻 C
📖 第 1 页 / 共 2 页
字号:
      } else if(!strcmp(argv[i], "-ci")){        cmp = tcbdbcmpint32;      } else if(!strcmp(argv[i], "-cj")){        cmp = tcbdbcmpint64;      } else if(!strcmp(argv[i], "-tl")){        if(opts == UINT8_MAX) opts = 0;        opts |= BDBTLARGE;      } else if(!strcmp(argv[i], "-td")){        if(opts == UINT8_MAX) opts = 0;        opts |= BDBTDEFLATE;      } else if(!strcmp(argv[i], "-tb")){        if(opts == UINT8_MAX) opts = 0;        opts |= BDBTBZIP;      } else if(!strcmp(argv[i], "-tt")){        if(opts == UINT8_MAX) opts = 0;        opts |= BDBTTCBS;      } else if(!strcmp(argv[i], "-tx")){        if(opts == UINT8_MAX) opts = 0;        opts |= BDBTEXCODEC;      } else if(!strcmp(argv[i], "-tz")){        if(opts == UINT8_MAX) opts = 0;      } else if(!strcmp(argv[i], "-nl")){        omode |= BDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= BDBOLCKNB;      } else {        usage();      }    } else if(!path){      path = argv[i];    } else if(!lmstr){      lmstr = argv[i];    } else if(!nmstr){      nmstr = argv[i];    } else if(!bstr){      bstr = argv[i];    } else if(!astr){      astr = argv[i];    } else if(!fstr){      fstr = argv[i];    } else {      usage();    }  }  if(!path) usage();  int lmemb = lmstr ? tcatoi(lmstr) : -1;  int nmemb = nmstr ? tcatoi(nmstr) : -1;  int bnum = bstr ? tcatoi(bstr) : -1;  int apow = astr ? tcatoi(astr) : -1;  int fpow = fstr ? tcatoi(fstr) : -1;  int rv = procoptimize(path, lmemb, nmemb, bnum, apow, fpow, cmp, opts, omode);  return rv;}/* parse arguments of importtsv command */static int runimporttsv(int argc, char **argv){  char *path = NULL;  char *file = NULL;  int omode = 0;  bool sc = false;  for(int i = 2; i < argc; i++){    if(!path && argv[i][0] == '-'){      if(!strcmp(argv[i], "-nl")){        omode |= BDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= BDBOLCKNB;      } else if(!strcmp(argv[i], "-sc")){        sc = true;      } else {        usage();      }    } else if(!path){      path = argv[i];    } else if(!file){      file = argv[i];    } else {      usage();    }  }  if(!path) usage();  int rv = procimporttsv(path, file, omode, sc);  return rv;}/* parse arguments of version command */static int runversion(int argc, char **argv){  int rv = procversion();  return rv;}/* perform create command */static int proccreate(const char *path, int lmemb, int nmemb,                      int bnum, int apow, int fpow, BDBCMP cmp, int opts){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbtune(bdb, lmemb, nmemb, bnum, apow, fpow, opts)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  if(!tcbdbopen(bdb, path, BDBOWRITER | BDBOCREAT | BDBOTRUNC)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  if(!tcbdbclose(bdb)){    printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform inform command */static int procinform(const char *path, int omode){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  tcbdbsetcmpfunc(bdb, mycmpfunc, NULL);  tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL);  if(!tcbdbopen(bdb, path, BDBOREADER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  const char *npath = tcbdbpath(bdb);  if(!npath) npath = "(unknown)";  printf("path: %s\n", npath);  printf("database type: btree\n");  uint8_t flags = tcbdbflags(bdb);  printf("additional flags:");  if(flags & BDBFOPEN) printf(" open");  if(flags & BDBFFATAL) printf(" fatal");  printf("\n");  BDBCMP cmp = tcbdbcmpfunc(bdb);  printf("comparison function: ");  if(cmp == tcbdbcmplexical){    printf("lexical");  } else if(cmp == tcbdbcmpdecimal){    printf("decimal");  } else if(cmp == tcbdbcmpint32){    printf("int32");  } else if(cmp == tcbdbcmpint64){    printf("int64");  } else {    printf("custom");  }  printf("\n");  printf("max leaf member: %d\n", tcbdblmemb(bdb));  printf("max node member: %d\n", tcbdbnmemb(bdb));  printf("leaf number: %llu\n", (unsigned long long)tcbdblnum(bdb));  printf("node number: %llu\n", (unsigned long long)tcbdbnnum(bdb));  printf("bucket number: %llu\n", (unsigned long long)tcbdbbnum(bdb));  if(bdb->hdb->cnt_writerec >= 0)    printf("used bucket number: %lld\n", (long long)tcbdbbnumused(bdb));  printf("alignment: %u\n", tcbdbalign(bdb));  printf("free block pool: %u\n", tcbdbfbpmax(bdb));  printf("inode number: %lld\n", (long long)tcbdbinode(bdb));  char date[48];  tcdatestrwww(tcbdbmtime(bdb), INT_MAX, date);  printf("modified time: %s\n", date);  uint8_t opts = tcbdbopts(bdb);  printf("options:");  if(opts & BDBTLARGE) printf(" large");  if(opts & BDBTDEFLATE) printf(" deflate");  if(opts & BDBTBZIP) printf(" bzip");  if(opts & BDBTTCBS) printf(" tcbs");  if(opts & BDBTEXCODEC) printf(" excodec");  printf("\n");  printf("record number: %llu\n", (unsigned long long)tcbdbrnum(bdb));  printf("file size: %llu\n", (unsigned long long)tcbdbfsiz(bdb));  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform put command */static int procput(const char *path, const char *kbuf, int ksiz, const char *vbuf, int vsiz,                   BDBCMP cmp, int omode, int dmode){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOWRITER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  switch(dmode){  case -1:    if(!tcbdbputkeep(bdb, kbuf, ksiz, vbuf, vsiz)){      printerr(bdb);      err = true;    }    break;  case 1:    if(!tcbdbputcat(bdb, kbuf, ksiz, vbuf, vsiz)){      printerr(bdb);      err = true;    }    break;  case 2:    if(!tcbdbputdup(bdb, kbuf, ksiz, vbuf, vsiz)){      printerr(bdb);      err = true;    }    break;  case 3:    if(!tcbdbputdupback(bdb, kbuf, ksiz, vbuf, vsiz)){      printerr(bdb);      err = true;    }    break;  default:    if(!tcbdbput(bdb, kbuf, ksiz, vbuf, vsiz)){      printerr(bdb);      err = true;    }    break;  }  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform out command */static int procout(const char *path, const char *kbuf, int ksiz, BDBCMP cmp, int omode){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOWRITER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  if(!tcbdbout(bdb, kbuf, ksiz)){    printerr(bdb);    err = true;  }  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform get command */static int procget(const char *path, const char *kbuf, int ksiz, BDBCMP cmp, int omode,                   bool px, bool pz){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOREADER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  int vsiz;  char *vbuf = tcbdbget(bdb, kbuf, ksiz, &vsiz);  if(vbuf){    printdata(vbuf, vsiz, px);    if(!pz) putchar('\n');    tcfree(vbuf);  } else {    printerr(bdb);    err = true;  }  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform list command */static int proclist(const char *path, BDBCMP cmp, int omode, int max, bool pv, bool px, bool bk,                    const char *jstr, const char *bstr, const char *estr, const char *fmstr){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOREADER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  if(bstr || fmstr){    TCLIST *keys = fmstr ? tcbdbfwmkeys2(bdb, fmstr, max) :      tcbdbrange(bdb, bstr, strlen(bstr), true, estr, strlen(estr), true, max);    int cnt = 0;    for(int i = 0; i < tclistnum(keys); i++){      int ksiz;      const char *kbuf = tclistval(keys, i, &ksiz);      if(pv){        TCLIST *vals = tcbdbget4(bdb, kbuf, ksiz);        if(vals){          for(int j = 0; j < tclistnum(vals); j++){            int vsiz;            const char *vbuf = tclistval(vals, j, &vsiz);            printdata(kbuf, ksiz, px);            putchar('\t');            printdata(vbuf, vsiz, px);            putchar('\n');            if(max >= 0 && ++cnt >= max) break;          }          tclistdel(vals);        }      } else {        int num = tcbdbvnum(bdb, kbuf, ksiz);        for(int j = 0; j < num; j++){          printdata(kbuf, ksiz, px);          putchar('\n');          if(max >= 0 && ++cnt >= max) break;        }      }      if(max >= 0 && cnt >= max) break;    }    tclistdel(keys);  } else {    BDBCUR *cur = tcbdbcurnew(bdb);    if(bk){      if(jstr){        if(!tcbdbcurjumpback(cur, jstr, strlen(jstr)) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      } else {        if(!tcbdbcurlast(cur) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      }    } else {      if(jstr){        if(!tcbdbcurjump(cur, jstr, strlen(jstr)) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      } else {        if(!tcbdbcurfirst(cur) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      }    }    TCXSTR *key = tcxstrnew();    TCXSTR *val = tcxstrnew();    int cnt = 0;    while(tcbdbcurrec(cur, key, val)){      printdata(tcxstrptr(key), tcxstrsize(key), px);      if(pv){        putchar('\t');        printdata(tcxstrptr(val), tcxstrsize(val), px);      }      putchar('\n');      if(bk){        if(!tcbdbcurprev(cur) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      } else {        if(!tcbdbcurnext(cur) && tcbdbecode(bdb) != TCENOREC){          printerr(bdb);          err = true;        }      }      if(max >= 0 && ++cnt >= max) break;    }    tcxstrdel(val);    tcxstrdel(key);    tcbdbcurdel(cur);  }  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform optimize command */static int procoptimize(const char *path, int lmemb, int nmemb,                        int bnum, int apow, int fpow, BDBCMP cmp, int opts, int omode){  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(cmp && !tcbdbsetcmpfunc(bdb, cmp, NULL)) printerr(bdb);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOWRITER | omode)){    printerr(bdb);    tcbdbdel(bdb);    return 1;  }  bool err = false;  if(!tcbdboptimize(bdb, lmemb, nmemb, bnum, apow, fpow, opts)){    printerr(bdb);    err = true;  }  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  return err ? 1 : 0;}/* perform importtsv command */static int procimporttsv(const char *path, const char *file, int omode, bool sc){  FILE *ifp = file ? fopen(file, "rb") : stdin;  if(!ifp){    fprintf(stderr, "%s: could not open\n", file ? file : "(stdin)");    return 1;  }  TCBDB *bdb = tcbdbnew();  if(g_dbgfd >= 0) tcbdbsetdbgfd(bdb, g_dbgfd);  if(!tcbdbsetcodecfunc(bdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(bdb);  if(!tcbdbopen(bdb, path, BDBOWRITER | BDBOCREAT | omode)){    printerr(bdb);    tcbdbdel(bdb);    if(ifp != stdin) fclose(ifp);    return 1;  }  bool err = false;  char *line;  int cnt = 0;  while(!err && (line = mygetline(ifp)) != NULL){    char *pv = strchr(line, '\t');    if(!pv){      tcfree(line);      continue;    }    *pv = '\0';    if(sc) tcstrtolower(line);    if(!tcbdbputdup2(bdb, line, pv + 1)){      printerr(bdb);      err = true;    }    tcfree(line);    if(cnt > 0 && cnt % 100 == 0){      putchar('.');      fflush(stdout);      if(cnt % 5000 == 0) printf(" (%08d)\n", cnt);    }    cnt++;  }  printf(" (%08d)\n", cnt);  if(!tcbdbclose(bdb)){    if(!err) printerr(bdb);    err = true;  }  tcbdbdel(bdb);  if(ifp != stdin) fclose(ifp);  return err ? 1 : 0;}/* perform version command */static int procversion(void){  printf("Tokyo Cabinet version %s (%d:%s)\n", tcversion, _TC_LIBVER, _TC_FORMATVER);  printf("Copyright (C) 2006-2008 Mikio Hirabayashi\n");  return 0;}// END OF FILE

⌨️ 快捷键说明

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