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

📄 tcfmgr.c

📁 Tokyo Cabinet的Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符
💻 C
📖 第 1 页 / 共 2 页
字号:
  return rv;}/* parse arguments of optimize command */static int runoptimize(int argc, char **argv){  char *path = NULL;  char *wstr = NULL;  char *lstr = NULL;  int omode = 0;  for(int i = 2; i < argc; i++){    if(!path && argv[i][0] == '-'){      if(!strcmp(argv[i], "-nl")){        omode |= FDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= FDBOLCKNB;      } else {        usage();      }    } else if(!path){      path = argv[i];    } else if(!wstr){      wstr = argv[i];    } else if(!lstr){      lstr = argv[i];    } else {      usage();    }  }  if(!path) usage();  int width = wstr ? tcatoix(wstr) : -1;  int64_t limsiz = lstr ? tcatoix(lstr) : -1;  int rv = procoptimize(path, width, limsiz, 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 |= FDBONOLCK;      } else if(!strcmp(argv[i], "-nb")){        omode |= FDBOLCKNB;      } 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 width, int64_t limsiz){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbtune(fdb, width, limsiz)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  if(!tcfdbopen(fdb, path, FDBOWRITER | FDBOCREAT | FDBOTRUNC)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  if(!tcfdbclose(fdb)){    printerr(fdb);    err = true;  }  tcfdbdel(fdb);  return err ? 1 : 0;}/* perform inform command */static int procinform(const char *path, int omode){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOREADER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  const char *npath = tcfdbpath(fdb);  if(!npath) npath = "(unknown)";  printf("path: %s\n", npath);  const char *type = "(unknown)";  switch(tcfdbtype(fdb)){  case TCDBTHASH: type = "hash"; break;  case TCDBTBTREE: type = "btree"; break;  case TCDBTFIXED: type = "fixed"; break;  case TCDBTTABLE: type = "table"; break;  }  printf("database type: %s\n", type);  uint8_t flags = tcfdbflags(fdb);  printf("additional flags:");  if(flags & FDBFOPEN) printf(" open");  if(flags & FDBFFATAL) printf(" fatal");  printf("\n");  printf("minimum ID number: %llu\n", (unsigned long long)tcfdbmin(fdb));  printf("maximum ID number: %llu\n", (unsigned long long)tcfdbmax(fdb));  printf("width of the value: %u\n", (unsigned int)tcfdbwidth(fdb));  printf("limit file size: %llu\n", (unsigned long long)tcfdblimsiz(fdb));  printf("limit ID number: %llu\n", (unsigned long long)tcfdblimid(fdb));  printf("inode number: %lld\n", (long long)tcfdbinode(fdb));  char date[48];  tcdatestrwww(tcfdbmtime(fdb), INT_MAX, date);  printf("modified time: %s\n", date);  printf("record number: %llu\n", (unsigned long long)tcfdbrnum(fdb));  printf("file size: %llu\n", (unsigned long long)tcfdbfsiz(fdb));  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  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){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOWRITER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  switch(dmode){  case -1:    if(!tcfdbputkeep2(fdb, kbuf, ksiz, vbuf, vsiz)){      printerr(fdb);      err = true;    }    break;  case 1:    if(!tcfdbputcat2(fdb, kbuf, ksiz, vbuf, vsiz)){      printerr(fdb);      err = true;    }    break;  case 10:    if(tcfdbaddint(fdb, tcfdbkeytoid(kbuf, ksiz), tcatoi(vbuf)) == INT_MIN){      printerr(fdb);      err = true;    }    break;  case 11:    if(isnan(tcfdbadddouble(fdb, tcfdbkeytoid(kbuf, ksiz), tcatof(vbuf)))){      printerr(fdb);      err = true;    }    break;  default:    if(!tcfdbput2(fdb, kbuf, ksiz, vbuf, vsiz)){      printerr(fdb);      err = true;    }    break;  }  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  return err ? 1 : 0;}/* perform out command */static int procout(const char *path, const char *kbuf, int ksiz, int omode){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOWRITER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  if(!tcfdbout2(fdb, kbuf, ksiz)){    printerr(fdb);    err = true;  }  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  return err ? 1 : 0;}/* perform get command */static int procget(const char *path, const char *kbuf, int ksiz, int omode, bool px, bool pz){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOREADER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  int vsiz;  char *vbuf = tcfdbget2(fdb, kbuf, ksiz, &vsiz);  if(vbuf){    printdata(vbuf, vsiz, px);    if(!pz) putchar('\n');    tcfree(vbuf);  } else {    printerr(fdb);    err = true;  }  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  return err ? 1 : 0;}/* perform list command */static int proclist(const char *path, int omode, int max, bool pv, bool px,                    const char *rlstr, const char *rustr, const char *ristr){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOREADER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  if(rlstr || ristr){    TCLIST *keys = ristr ? tcfdbrange5(fdb, ristr, max) : tcfdbrange3(fdb, rlstr, rustr, max);    for(int i = 0; i < tclistnum(keys); i++){      int ksiz;      const char *kbuf = tclistval(keys, i, &ksiz);      printf("%s", kbuf);      if(pv){        int vsiz;        char *vbuf = tcfdbget2(fdb, kbuf, ksiz, &vsiz);        if(vbuf){          putchar('\t');          printdata(vbuf, vsiz, px);          tcfree(vbuf);        }      }      putchar('\n');    }    tclistdel(keys);  } else {    if(!tcfdbiterinit(fdb)){      printerr(fdb);      err = true;    }    int cnt = 0;    uint64_t id;    while((id = tcfdbiternext(fdb)) > 0){      printf("%llu", (unsigned long long)id);      if(pv){        int vsiz;        char *vbuf = tcfdbget(fdb, id, &vsiz);        if(vbuf){          putchar('\t');          printdata(vbuf, vsiz, px);          tcfree(vbuf);        }      }      putchar('\n');      if(max >= 0 && ++cnt >= max) break;    }  }  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  return err ? 1 : 0;}/* perform optimize command */static int procoptimize(const char *path, int width, int64_t limsiz, int omode){  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOWRITER | omode)){    printerr(fdb);    tcfdbdel(fdb);    return 1;  }  bool err = false;  if(!tcfdboptimize(fdb, width, limsiz)){    printerr(fdb);    err = true;  }  if(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  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;  }  TCFDB *fdb = tcfdbnew();  if(g_dbgfd >= 0) tcfdbsetdbgfd(fdb, g_dbgfd);  if(!tcfdbopen(fdb, path, FDBOWRITER | FDBOCREAT | omode)){    printerr(fdb);    tcfdbdel(fdb);    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(!tcfdbput3(fdb, line, pv + 1)){      printerr(fdb);      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(!tcfdbclose(fdb)){    if(!err) printerr(fdb);    err = true;  }  tcfdbdel(fdb);  if(ifp != stdin) fclose(ifp);  return err ? 1 : 0;}/* perform version command */static int procversion(void){  printf("Tokyo Cabinet version %s (%d:%s) for %s\n",         tcversion, _TC_LIBVER, _TC_FORMATVER, TCSYSNAME);  printf("Copyright (C) 2006-2009 Mikio Hirabayashi\n");  return 0;}// END OF FILE

⌨️ 快捷键说明

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