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

📄 tchmgr.c

📁 高性能嵌入式数据库在高并发的环境下使用最好是64位系统比较好
💻 C
📖 第 1 页 / 共 2 页
字号:
  char *astr = NULL;  char *fstr = NULL;  int opts = UINT8_MAX;  int omode = 0;  for(int i = 2; i < argc; i++){    if(!path && argv[i][0] == '-'){      if(!strcmp(argv[i], "-tl")){        if(opts == UINT8_MAX) opts = 0;        opts |= HDBTLARGE;      } else if(!strcmp(argv[i], "-td")){        if(opts == UINT8_MAX) opts = 0;        opts |= HDBTDEFLATE;      } else if(!strcmp(argv[i], "-tb")){        if(opts == UINT8_MAX) opts = 0;        opts |= HDBTBZIP;      } else if(!strcmp(argv[i], "-tt")){        if(opts == UINT8_MAX) opts = 0;        opts |= HDBTTCBS;      } else if(!strcmp(argv[i], "-tx")){        if(opts == UINT8_MAX) opts = 0;        opts |= HDBTEXCODEC;      } else if(!strcmp(argv[i], "-tz")){        if(opts == UINT8_MAX) opts = 0;      } else if(!strcmp(argv[i], "-nl")){        omode |= HDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= HDBOLCKNB;      } else {        usage();      }    } else if(!path){      path = 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 bnum = bstr ? tcatoi(bstr) : -1;  int apow = astr ? tcatoi(astr) : -1;  int fpow = fstr ? tcatoi(fstr) : -1;  int rv = procoptimize(path, bnum, apow, fpow, 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 |= HDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= HDBOLCKNB;      } 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 bnum, int apow, int fpow, int opts){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbtune(hdb, bnum, apow, fpow, opts)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  if(!tchdbopen(hdb, path, HDBOWRITER | HDBOCREAT | HDBOTRUNC)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  if(!tchdbclose(hdb)){    printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform inform command */static int procinform(const char *path, int omode){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL);  if(!tchdbopen(hdb, path, HDBOREADER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  const char *npath = tchdbpath(hdb);  if(!npath) npath = "(unknown)";  printf("path: %s\n", npath);  const char *type = "(unknown)";  switch(tchdbtype(hdb)){  case TCDBTHASH: type = "hash"; break;  case TCDBTBTREE: type = "btree"; break;  case TCDBTFIXED: type = "fixed"; break;  }  printf("database type: %s\n", type);  uint8_t flags = tchdbflags(hdb);  printf("additional flags:");  if(flags & HDBFOPEN) printf(" open");  if(flags & HDBFFATAL) printf(" fatal");  printf("\n");  printf("bucket number: %llu\n", (unsigned long long)tchdbbnum(hdb));  if(hdb->cnt_writerec >= 0)    printf("used bucket number: %lld\n", (long long)tchdbbnumused(hdb));  printf("alignment: %u\n", tchdbalign(hdb));  printf("free block pool: %u\n", tchdbfbpmax(hdb));  printf("inode number: %lld\n", (long long)tchdbinode(hdb));  char date[48];  tcdatestrwww(tchdbmtime(hdb), INT_MAX, date);  printf("modified time: %s\n", date);  uint8_t opts = tchdbopts(hdb);  printf("options:");  if(opts & HDBTLARGE) printf(" large");  if(opts & HDBTDEFLATE) printf(" deflate");  if(opts & HDBTBZIP) printf(" bzip");  if(opts & HDBTTCBS) printf(" tcbs");  if(opts & HDBTEXCODEC) printf(" excodec");  printf("\n");  printf("record number: %llu\n", (unsigned long long)tchdbrnum(hdb));  printf("file size: %llu\n", (unsigned long long)tchdbfsiz(hdb));  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform put command */static int procput(const char *path, const char *kbuf, int ksiz, const char *vbuf, int vsiz,                   int omode, int dmode){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOWRITER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  switch(dmode){  case -1:    if(!tchdbputkeep(hdb, kbuf, ksiz, vbuf, vsiz)){      printerr(hdb);      err = true;    }    break;  case 1:    if(!tchdbputcat(hdb, kbuf, ksiz, vbuf, vsiz)){      printerr(hdb);      err = true;    }    break;  default:    if(!tchdbput(hdb, kbuf, ksiz, vbuf, vsiz)){      printerr(hdb);      err = true;    }    break;  }  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform out command */static int procout(const char *path, const char *kbuf, int ksiz, int omode){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOWRITER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  if(!tchdbout(hdb, kbuf, ksiz)){    printerr(hdb);    err = true;  }  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform get command */static int procget(const char *path, const char *kbuf, int ksiz, int omode, bool px, bool pz){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOREADER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  int vsiz;  char *vbuf = tchdbget(hdb, kbuf, ksiz, &vsiz);  if(vbuf){    printdata(vbuf, vsiz, px);    if(!pz) putchar('\n');    tcfree(vbuf);  } else {    printerr(hdb);    err = true;  }  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform list command */static int proclist(const char *path, int omode, int max, bool pv, bool px, const char *fmstr){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOREADER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  if(fmstr){    TCLIST *keys = tchdbfwmkeys2(hdb, fmstr, max);    for(int i = 0; i < tclistnum(keys); i++){      int ksiz;      const char *kbuf = tclistval(keys, i, &ksiz);      printdata(kbuf, ksiz, px);      if(pv){        int vsiz;        char *vbuf = tchdbget(hdb, kbuf, ksiz, &vsiz);        if(vbuf){          putchar('\t');          printdata(vbuf, vsiz, px);          tcfree(vbuf);        }      }      putchar('\n');    }    tclistdel(keys);  } else {    if(!tchdbiterinit(hdb)){      printerr(hdb);      err = true;    }    TCXSTR *key = tcxstrnew();    TCXSTR *val = tcxstrnew();    int cnt = 0;    while(tchdbiternext3(hdb, key, val)){      printdata(tcxstrptr(key), tcxstrsize(key), px);      if(pv){        putchar('\t');        printdata(tcxstrptr(val), tcxstrsize(val), px);      }      putchar('\n');      if(max >= 0 && ++cnt >= max) break;    }    tcxstrdel(val);    tcxstrdel(key);  }  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  return err ? 1 : 0;}/* perform optimize command */static int procoptimize(const char *path, int bnum, int apow, int fpow, int opts, int omode){  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOWRITER | omode)){    printerr(hdb);    tchdbdel(hdb);    return 1;  }  bool err = false;  if(!tchdboptimize(hdb, bnum, apow, fpow, opts)){    printerr(hdb);    err = true;  }  if(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  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;  }  TCHDB *hdb = tchdbnew();  if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd);  if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb);  if(!tchdbopen(hdb, path, HDBOWRITER | HDBOCREAT | omode)){    printerr(hdb);    tchdbdel(hdb);    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(!tchdbput2(hdb, line, pv + 1)){      printerr(hdb);      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(!tchdbclose(hdb)){    if(!err) printerr(hdb);    err = true;  }  tchdbdel(hdb);  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 + -