📄 tcfmgr.c
字号:
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 + -