147886Sbostic /*- 247886Sbostic * Copyright (c) 1990 The Regents of the University of California. 347886Sbostic * All rights reserved. 447886Sbostic * 547886Sbostic * This code is derived from software contributed to Berkeley by 647886Sbostic * Mike Olson. 747886Sbostic * 847886Sbostic * %sccs.include.redist.c% 947886Sbostic */ 1047886Sbostic 1147886Sbostic #if defined(LIBC_SCCS) && !defined(lint) 12*50991Sbostic static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 09/04/91"; 1347886Sbostic #endif /* LIBC_SCCS and not lint */ 1447886Sbostic 15*50991Sbostic #include <sys/param.h> 16*50991Sbostic #include <fcntl.h> 17*50991Sbostic #include <db.h> 18*50991Sbostic #include <errno.h> 1947886Sbostic #include <stdio.h> 2047886Sbostic #include <ctype.h> 21*50991Sbostic #include <stdlib.h> 22*50991Sbostic #include <string.h> 23*50991Sbostic #include "btree.h" 2447886Sbostic 2547886Sbostic typedef struct cmd_table { 2647886Sbostic char *cmd; 2747886Sbostic int nargs; 28*50991Sbostic int rconv; 29*50991Sbostic void (*func) __P((DB *, char **)); 30*50991Sbostic char *usage, *descrip; 3147886Sbostic } cmd_table; 3247886Sbostic 33*50991Sbostic int stopstop; 34*50991Sbostic DB *globaldb; 3547886Sbostic 36*50991Sbostic void bstat __P((DB *, char **)); 37*50991Sbostic void cursor __P((DB *, char **)); 38*50991Sbostic void delcur __P((DB *, char **)); 39*50991Sbostic void delete __P((DB *, char **)); 40*50991Sbostic void dump __P((DB *, char **)); 41*50991Sbostic void first __P((DB *, char **)); 42*50991Sbostic void get __P((DB *, char **)); 43*50991Sbostic void help __P((DB *, char **)); 44*50991Sbostic void iafter __P((DB *, char **)); 45*50991Sbostic void ibefore __P((DB *, char **)); 46*50991Sbostic void insert __P((DB *, char **)); 47*50991Sbostic void keydata __P((DBT *, DBT *)); 48*50991Sbostic void last __P((DB *, char **)); 49*50991Sbostic void list __P((DB *, char **)); 50*50991Sbostic void load __P((DB *, char **)); 51*50991Sbostic void mstat __P((DB *, char **)); 52*50991Sbostic void next __P((DB *, char **)); 53*50991Sbostic int parse __P((char *, char **, int)); 54*50991Sbostic void previous __P((DB *, char **)); 55*50991Sbostic void show __P((DB *, char **)); 56*50991Sbostic void usage __P((void)); 57*50991Sbostic void user __P((DB *)); 58*50991Sbostic 59*50991Sbostic cmd_table commands[] = { 60*50991Sbostic "?", 0, 0, help, "help", NULL, 61*50991Sbostic "b", 0, 0, bstat, "bstat", "stat btree", 62*50991Sbostic "c", 1, 1, cursor, "cursor word", "move cursor to word", 63*50991Sbostic "delc", 0, 0, delcur, "delcur", "delete key the cursor references", 64*50991Sbostic "dele", 1, 1, delete, "delete word", "delete word", 65*50991Sbostic "d", 0, 0, dump, "dump", "dump database", 66*50991Sbostic "f", 0, 0, first, "first", "move cursor to first record", 67*50991Sbostic "g", 1, 1, get, "get word", "locate word", 68*50991Sbostic "h", 0, 0, help, "help", "print command summary", 69*50991Sbostic "ia", 2, 1, iafter, "iafter key data", "insert data after key", 70*50991Sbostic "ib", 2, 1, ibefore, "ibefore key data", "insert data before key", 71*50991Sbostic "in", 2, 1, insert, "insert word def", "insert key with data def", 72*50991Sbostic "la", 0, 0, last, "last", "move cursor to last record", 73*50991Sbostic "li", 1, 1, list, "list file", "list to a file", 74*50991Sbostic "loa", 1, 1, load, "load file", NULL, 75*50991Sbostic "loc", 1, 1, get, "get word", NULL, 76*50991Sbostic "m", 0, 0, mstat, "mstat", "stat memory pool", 77*50991Sbostic "n", 0, 0, next, "next", "move cursor forward one record", 78*50991Sbostic "p", 0, 0, previous, "previous", "move cursor back one record", 79*50991Sbostic "q", 0, 0, NULL, "quit", "quit", 80*50991Sbostic "sh", 1, 0, show, "show page", "dump a page", 81*50991Sbostic { NULL }, 8247886Sbostic }; 8347886Sbostic 84*50991Sbostic int recno; /* use record numbers */ 85*50991Sbostic char *dict = "words"; /* default dictionary */ 86*50991Sbostic char *progname; 8747886Sbostic 88*50991Sbostic int 8947886Sbostic main(argc, argv) 9047886Sbostic int argc; 9147886Sbostic char **argv; 9247886Sbostic { 9347886Sbostic int c; 94*50991Sbostic DB *db; 9547886Sbostic BTREEINFO b; 9647886Sbostic 9747886Sbostic progname = *argv; 9847886Sbostic 99*50991Sbostic b.flags = 0; 100*50991Sbostic b.cachesize = 0; 101*50991Sbostic b.maxkeypage = 0; 102*50991Sbostic b.minkeypage = 0; 10347886Sbostic b.psize = 0; 104*50991Sbostic b.compare = NULL; 105*50991Sbostic b.prefix = NULL; 10647886Sbostic b.lorder = 0; 10747886Sbostic 108*50991Sbostic while ((c = getopt(argc, argv, "bc:di:lp:ru")) != EOF) { 10947886Sbostic switch (c) { 110*50991Sbostic case 'b': 111*50991Sbostic b.lorder = BIG_ENDIAN; 11247886Sbostic break; 113*50991Sbostic case 'c': 11447886Sbostic b.cachesize = atoi(optarg); 11547886Sbostic break; 116*50991Sbostic case 'd': 117*50991Sbostic b.flags |= R_DUP; 11847886Sbostic break; 119*50991Sbostic case 'i': 120*50991Sbostic dict = optarg; 121*50991Sbostic break; 122*50991Sbostic case 'l': 12347886Sbostic b.lorder = LITTLE_ENDIAN; 12447886Sbostic break; 125*50991Sbostic case 'p': 126*50991Sbostic b.psize = atoi(optarg); 12747886Sbostic break; 128*50991Sbostic case 'r': 129*50991Sbostic recno = 1; 130*50991Sbostic break; 131*50991Sbostic case 'u': 132*50991Sbostic b.flags = 0; 133*50991Sbostic break; 134*50991Sbostic default: 135*50991Sbostic usage(); 13647886Sbostic } 13747886Sbostic } 138*50991Sbostic argc -= optind; 139*50991Sbostic argv += optind; 14047886Sbostic 141*50991Sbostic if (recno) 142*50991Sbostic db = dbopen(*argv == NULL ? NULL : *argv, O_RDWR, 143*50991Sbostic 0, DB_RECNO, NULL); 144*50991Sbostic else 145*50991Sbostic db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|O_RDWR, 146*50991Sbostic 0600, DB_BTREE, &b); 14747886Sbostic 148*50991Sbostic if (db == NULL) { 149*50991Sbostic (void)fprintf(stderr, "dbopen: %s\n", strerror(errno)); 150*50991Sbostic exit(1); 15147886Sbostic } 152*50991Sbostic globaldb = db; 153*50991Sbostic user(db); 154*50991Sbostic exit(0); 155*50991Sbostic /* NOTREACHED */ 15647886Sbostic } 15747886Sbostic 158*50991Sbostic void 159*50991Sbostic user(db) 160*50991Sbostic DB *db; 16147886Sbostic { 162*50991Sbostic FILE *ifp; 163*50991Sbostic int argc, i, last; 164*50991Sbostic char *lbuf, *argv[4], buf[512]; 16547886Sbostic 166*50991Sbostic if ((ifp = fopen("/dev/tty", "r")) == NULL) { 167*50991Sbostic (void)fprintf(stderr, 168*50991Sbostic "/dev/tty: %s\n", strerror(errno)); 169*50991Sbostic exit(1); 17047886Sbostic } 171*50991Sbostic for (last = 0;;) { 172*50991Sbostic (void)printf("> "); 173*50991Sbostic (void)fflush(stdout); 174*50991Sbostic if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL) 17547886Sbostic break; 176*50991Sbostic if (lbuf[0] == '\n') { 177*50991Sbostic i = last; 178*50991Sbostic goto uselast; 17947886Sbostic } 18047886Sbostic lbuf[strlen(lbuf) - 1] = '\0'; 18147886Sbostic 182*50991Sbostic if (lbuf[0] == 'q') 18347886Sbostic break; 18447886Sbostic 18547886Sbostic argc = parse(lbuf, &argv[0], 3); 18647886Sbostic if (argc == 0) 18747886Sbostic continue; 18847886Sbostic 189*50991Sbostic for (i = 0; commands[i].cmd != NULL; i++) 190*50991Sbostic if (strncmp(commands[i].cmd, argv[0], 191*50991Sbostic strlen(commands[i].cmd)) == 0) 19247886Sbostic break; 19347886Sbostic 194*50991Sbostic if (commands[i].cmd == NULL) { 195*50991Sbostic (void)fprintf(stderr, 196*50991Sbostic "%s: command unknown ('help' for help)\n", lbuf); 19747886Sbostic continue; 19847886Sbostic } 19947886Sbostic 200*50991Sbostic if (commands[i].nargs != argc - 1) { 201*50991Sbostic (void)fprintf(stderr, "usage: %s\n", commands[i].usage); 20247886Sbostic continue; 20347886Sbostic } 20447886Sbostic 205*50991Sbostic if (recno && commands[i].rconv) { 206*50991Sbostic static recno_t nlong; 207*50991Sbostic nlong = atoi(argv[1]); 208*50991Sbostic argv[1] = (char *)&nlong; 20947886Sbostic } 210*50991Sbostic uselast: last = i; 211*50991Sbostic (*commands[i].func)(db, argv); 21247886Sbostic } 213*50991Sbostic if ((db->sync)(db) == RET_ERROR) 214*50991Sbostic perror("dbsync"); 215*50991Sbostic else if ((db->close)(db) == RET_ERROR) 216*50991Sbostic perror("dbclose"); 21747886Sbostic } 21847886Sbostic 21947886Sbostic int 22047886Sbostic parse(lbuf, argv, maxargc) 221*50991Sbostic char *lbuf, **argv; 22247886Sbostic int maxargc; 22347886Sbostic { 22447886Sbostic int argc = 0; 22547886Sbostic char *c; 22647886Sbostic 22747886Sbostic c = lbuf; 22847886Sbostic while (isspace(*c)) 22947886Sbostic c++; 23047886Sbostic while (*c != '\0' && argc < maxargc) { 23147886Sbostic *argv++ = c; 23247886Sbostic argc++; 23347886Sbostic while (!isspace(*c) && *c != '\0') { 23447886Sbostic c++; 23547886Sbostic } 23647886Sbostic while (isspace(*c)) 23747886Sbostic *c++ = '\0'; 23847886Sbostic } 23947886Sbostic return (argc); 24047886Sbostic } 24147886Sbostic 242*50991Sbostic void 243*50991Sbostic cursor(db, argv) 244*50991Sbostic DB *db; 245*50991Sbostic char **argv; 24647886Sbostic { 247*50991Sbostic DBT data, key; 24847886Sbostic int status; 24947886Sbostic 250*50991Sbostic key.data = argv[1]; 251*50991Sbostic if (recno) 252*50991Sbostic key.size = sizeof(recno_t); 25347886Sbostic else 254*50991Sbostic key.size = strlen(argv[1]) + 1; 255*50991Sbostic status = (*db->seq)(db, &key, &data, R_CURSOR); 256*50991Sbostic switch (status) { 257*50991Sbostic case RET_ERROR: 25847886Sbostic perror("cursor"); 259*50991Sbostic break; 260*50991Sbostic case RET_SPECIAL: 261*50991Sbostic (void)printf("key not found\n"); 262*50991Sbostic break; 263*50991Sbostic case RET_SUCCESS: 264*50991Sbostic keydata(&key, &data); 265*50991Sbostic break; 266*50991Sbostic } 26747886Sbostic } 26847886Sbostic 269*50991Sbostic void 270*50991Sbostic delcur(db, argv) 271*50991Sbostic DB *db; 272*50991Sbostic char **argv; 27347886Sbostic { 27447886Sbostic int status; 27547886Sbostic 276*50991Sbostic status = (*db->del)(db, NULL, R_CURSOR); 27747886Sbostic 27847886Sbostic if (status == RET_ERROR) 27947886Sbostic perror("delcur"); 28047886Sbostic } 28147886Sbostic 282*50991Sbostic void 283*50991Sbostic delete(db, argv) 284*50991Sbostic DB *db; 285*50991Sbostic char **argv; 28647886Sbostic { 287*50991Sbostic DBT key; 28847886Sbostic int status; 28947886Sbostic 290*50991Sbostic key.data = argv[1]; 291*50991Sbostic if (recno) 292*50991Sbostic key.size = sizeof(recno_t); 293*50991Sbostic else 294*50991Sbostic key.size = strlen(argv[1]) + 1; 29547886Sbostic 296*50991Sbostic status = (*db->del)(db, &key, 0); 29747886Sbostic switch (status) { 298*50991Sbostic case RET_ERROR: 29947886Sbostic perror("delete"); 30047886Sbostic break; 301*50991Sbostic case RET_SPECIAL: 302*50991Sbostic (void)printf("key not found\n"); 30347886Sbostic break; 304*50991Sbostic case RET_SUCCESS: 305*50991Sbostic break; 30647886Sbostic } 30747886Sbostic } 30847886Sbostic 309*50991Sbostic void 310*50991Sbostic dump(db, argv) 311*50991Sbostic DB *db; 312*50991Sbostic char **argv; 31347886Sbostic { 314*50991Sbostic __bt_dump(db); 315*50991Sbostic } 316*50991Sbostic 317*50991Sbostic void 318*50991Sbostic first(db, argv) 319*50991Sbostic DB *db; 320*50991Sbostic char **argv; 321*50991Sbostic { 322*50991Sbostic DBT data, key; 32347886Sbostic int status; 32447886Sbostic 325*50991Sbostic status = (*db->seq)(db, &key, &data, R_FIRST); 32647886Sbostic 32747886Sbostic switch (status) { 328*50991Sbostic case RET_ERROR: 32947886Sbostic perror("first"); 33047886Sbostic break; 331*50991Sbostic case RET_SPECIAL: 332*50991Sbostic (void)printf("no more keys\n"); 33347886Sbostic break; 334*50991Sbostic case RET_SUCCESS: 335*50991Sbostic keydata(&key, &data); 336*50991Sbostic break; 337*50991Sbostic } 338*50991Sbostic } 33947886Sbostic 340*50991Sbostic void 341*50991Sbostic get(db, argv) 342*50991Sbostic DB *db; 343*50991Sbostic char **argv; 344*50991Sbostic { 345*50991Sbostic DBT data, key; 346*50991Sbostic int status; 347*50991Sbostic 348*50991Sbostic key.data = argv[1]; 349*50991Sbostic if (recno) 350*50991Sbostic key.size = sizeof(recno_t); 351*50991Sbostic else 352*50991Sbostic key.size = strlen(argv[1]) + 1; 353*50991Sbostic 354*50991Sbostic status = (*db->get)(db, &key, &data, 0); 355*50991Sbostic 356*50991Sbostic switch (status) { 357*50991Sbostic case RET_ERROR: 358*50991Sbostic perror("get"); 35947886Sbostic break; 360*50991Sbostic case RET_SPECIAL: 361*50991Sbostic (void)printf("key not found\n"); 362*50991Sbostic break; 363*50991Sbostic case RET_SUCCESS: 364*50991Sbostic keydata(&key, &data); 365*50991Sbostic break; 36647886Sbostic } 36747886Sbostic } 368*50991Sbostic 369*50991Sbostic void 370*50991Sbostic help(db, argv) 371*50991Sbostic DB *db; 372*50991Sbostic char **argv; 37347886Sbostic { 37447886Sbostic int i; 37547886Sbostic 376*50991Sbostic for (i = 0; commands[i].cmd; i++) 377*50991Sbostic if (commands[i].descrip) 378*50991Sbostic (void)printf("%s: %s\n", 379*50991Sbostic commands[i].usage, commands[i].descrip); 38047886Sbostic } 38147886Sbostic 382*50991Sbostic void 383*50991Sbostic iafter(db, argv) 384*50991Sbostic DB *db; 385*50991Sbostic char **argv; 38647886Sbostic { 387*50991Sbostic DBT key, data; 38847886Sbostic int status; 38947886Sbostic 390*50991Sbostic if (!recno) { 391*50991Sbostic (void)fprintf(stderr, 392*50991Sbostic "iafter only available for recno db's.\n"); 393*50991Sbostic return; 394*50991Sbostic } 395*50991Sbostic key.data = argv[1]; 396*50991Sbostic key.size = sizeof(recno_t); 397*50991Sbostic data.data = argv[2]; 398*50991Sbostic data.size = strlen(data.data); 399*50991Sbostic status = (db->put)(db, &key, &data, R_IAFTER); 40047886Sbostic switch (status) { 401*50991Sbostic case RET_ERROR: 402*50991Sbostic perror("iafter"); 40347886Sbostic break; 404*50991Sbostic case RET_SPECIAL: 405*50991Sbostic (void)printf("%s (duplicate key)\n", argv[1]); 40647886Sbostic break; 407*50991Sbostic case RET_SUCCESS: 408*50991Sbostic break; 409*50991Sbostic } 410*50991Sbostic } 41147886Sbostic 412*50991Sbostic void 413*50991Sbostic ibefore(db, argv) 414*50991Sbostic DB *db; 415*50991Sbostic char **argv; 416*50991Sbostic { 417*50991Sbostic DBT key, data; 418*50991Sbostic int status; 419*50991Sbostic 420*50991Sbostic if (!recno) { 421*50991Sbostic (void)fprintf(stderr, 422*50991Sbostic "ibefore only available for recno db's.\n"); 423*50991Sbostic return; 424*50991Sbostic } 425*50991Sbostic key.data = argv[1]; 426*50991Sbostic key.size = sizeof(recno_t); 427*50991Sbostic data.data = argv[2]; 428*50991Sbostic data.size = strlen(data.data); 429*50991Sbostic status = (db->put)(db, &key, &data, R_IBEFORE); 430*50991Sbostic switch (status) { 431*50991Sbostic case RET_ERROR: 432*50991Sbostic perror("ibefore"); 43347886Sbostic break; 434*50991Sbostic case RET_SPECIAL: 435*50991Sbostic (void)printf("%s (duplicate key)\n", argv[1]); 436*50991Sbostic break; 437*50991Sbostic case RET_SUCCESS: 438*50991Sbostic break; 43947886Sbostic } 44047886Sbostic } 44147886Sbostic 442*50991Sbostic void 443*50991Sbostic insert(db, argv) 444*50991Sbostic DB *db; 445*50991Sbostic char **argv; 44647886Sbostic { 44747886Sbostic int status; 448*50991Sbostic DBT data, key; 44947886Sbostic 450*50991Sbostic key.data = argv[1]; 451*50991Sbostic if (recno) 452*50991Sbostic key.size = sizeof(recno_t); 453*50991Sbostic else 454*50991Sbostic key.size = strlen(argv[1]) + 1; 455*50991Sbostic data.data = argv[2]; 456*50991Sbostic data.size = strlen(argv[2]) + 1; 45747886Sbostic 458*50991Sbostic status = (*db->put)(db, &key, &data, R_NOOVERWRITE); 45947886Sbostic switch (status) { 460*50991Sbostic case RET_ERROR: 461*50991Sbostic perror("put"); 46247886Sbostic break; 463*50991Sbostic case RET_SPECIAL: 464*50991Sbostic (void)printf("%s (duplicate key)\n", argv[1]); 46547886Sbostic break; 466*50991Sbostic case RET_SUCCESS: 46747886Sbostic break; 46847886Sbostic } 46947886Sbostic } 47047886Sbostic 471*50991Sbostic void 472*50991Sbostic last(db, argv) 473*50991Sbostic DB *db; 474*50991Sbostic char **argv; 47547886Sbostic { 476*50991Sbostic DBT data, key; 47747886Sbostic int status; 47847886Sbostic 479*50991Sbostic status = (*db->seq)(db, &key, &data, R_LAST); 48047886Sbostic 48147886Sbostic switch (status) { 482*50991Sbostic case RET_ERROR: 483*50991Sbostic perror("last"); 48447886Sbostic break; 485*50991Sbostic case RET_SPECIAL: 486*50991Sbostic (void)printf("no more keys\n"); 48747886Sbostic break; 488*50991Sbostic case RET_SUCCESS: 489*50991Sbostic keydata(&key, &data); 49047886Sbostic break; 49147886Sbostic } 49247886Sbostic } 49347886Sbostic 494*50991Sbostic void 495*50991Sbostic list(db, argv) 496*50991Sbostic DB *db; 497*50991Sbostic char **argv; 49847886Sbostic { 499*50991Sbostic DBT data, key; 500*50991Sbostic FILE *fp; 50147886Sbostic int status; 50247886Sbostic 503*50991Sbostic if ((fp = fopen(argv[1], "w")) == NULL) { 504*50991Sbostic (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno)); 505*50991Sbostic return; 506*50991Sbostic } 507*50991Sbostic status = (*db->seq)(db, &key, &data, R_FIRST); 508*50991Sbostic while (status == RET_SUCCESS) { 509*50991Sbostic (void)fprintf(fp, "%s\n", key.data); 510*50991Sbostic status = (*db->seq)(db, &key, &data, R_NEXT); 511*50991Sbostic } 512*50991Sbostic if (status == RET_ERROR) 513*50991Sbostic perror("list"); 514*50991Sbostic } 51547886Sbostic 516*50991Sbostic void 517*50991Sbostic load(db, argv) 518*50991Sbostic DB *db; 519*50991Sbostic char **argv; 520*50991Sbostic { 521*50991Sbostic register char *p, *t; 522*50991Sbostic FILE *fp; 523*50991Sbostic DBT data, key; 524*50991Sbostic int status; 525*50991Sbostic char b1[256], b2[256]; 526*50991Sbostic 527*50991Sbostic if ((fp = fopen(argv[1], "r")) == NULL) { 528*50991Sbostic perror(argv[1]); 529*50991Sbostic return; 530*50991Sbostic } 531*50991Sbostic (void)printf("loading %s...\n", dict); 532*50991Sbostic 533*50991Sbostic key.data = b1; 534*50991Sbostic data.data = b2; 535*50991Sbostic while (fgets(b1, sizeof(b1), fp) != NULL) { 536*50991Sbostic data.size = strlen(b1); 537*50991Sbostic b1[data.size - 1] = '\0'; 538*50991Sbostic for (p = &b1[data.size - 2], t = b2; p >= b1; *t++ = *p--); 539*50991Sbostic b2[data.size - 1] = '\0'; 540*50991Sbostic key.size = data.size; 541*50991Sbostic 542*50991Sbostic status = (*db->put)(db, &key, &data, R_NOOVERWRITE); 543*50991Sbostic switch (status) { 544*50991Sbostic case RET_ERROR: 545*50991Sbostic perror("load/put"); 546*50991Sbostic exit(1); 547*50991Sbostic case RET_SPECIAL: 548*50991Sbostic (void)fprintf(stderr, "duplicate: %s\n", key.data); 549*50991Sbostic exit(1); 550*50991Sbostic case RET_SUCCESS: 551*50991Sbostic break; 552*50991Sbostic } 553*50991Sbostic } 554*50991Sbostic (void)fclose(fp); 555*50991Sbostic } 556*50991Sbostic 557*50991Sbostic void 558*50991Sbostic next(db, argv) 559*50991Sbostic DB *db; 560*50991Sbostic char **argv; 561*50991Sbostic { 562*50991Sbostic DBT data, key; 563*50991Sbostic int status; 564*50991Sbostic 565*50991Sbostic status = (*db->seq)(db, &key, &data, R_NEXT); 566*50991Sbostic 56747886Sbostic switch (status) { 568*50991Sbostic case RET_ERROR: 56947886Sbostic perror("next"); 57047886Sbostic break; 571*50991Sbostic case RET_SPECIAL: 572*50991Sbostic (void)printf("no more keys\n"); 57347886Sbostic break; 574*50991Sbostic case RET_SUCCESS: 575*50991Sbostic keydata(&key, &data); 57647886Sbostic break; 57747886Sbostic } 57847886Sbostic } 57947886Sbostic 580*50991Sbostic void 581*50991Sbostic previous(db, argv) 582*50991Sbostic DB *db; 583*50991Sbostic char **argv; 58447886Sbostic { 585*50991Sbostic DBT data, key; 58647886Sbostic int status; 58747886Sbostic 588*50991Sbostic status = (*db->seq)(db, &key, &data, R_PREV); 58947886Sbostic 59047886Sbostic switch (status) { 591*50991Sbostic case RET_ERROR: 59247886Sbostic perror("previous"); 59347886Sbostic break; 594*50991Sbostic case RET_SPECIAL: 595*50991Sbostic (void)printf("no more keys\n"); 59647886Sbostic break; 597*50991Sbostic case RET_SUCCESS: 598*50991Sbostic keydata(&key, &data); 59947886Sbostic break; 60047886Sbostic } 60147886Sbostic } 60247886Sbostic 603*50991Sbostic void 604*50991Sbostic show(db, argv) 605*50991Sbostic DB *db; 606*50991Sbostic char **argv; 60747886Sbostic { 608*50991Sbostic BTREE *t; 609*50991Sbostic PAGE *h; 610*50991Sbostic pgno_t pg; 611*50991Sbostic 612*50991Sbostic pg = atoi(argv[1]); 613*50991Sbostic if (pg == 0) { 614*50991Sbostic (void)printf("page 0 is meta-data page.\n"); 615*50991Sbostic return; 616*50991Sbostic } 617*50991Sbostic 618*50991Sbostic t = db->internal; 619*50991Sbostic if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) { 620*50991Sbostic (void)printf("getpage of %ld failed\n", pg); 621*50991Sbostic return; 622*50991Sbostic } 623*50991Sbostic __bt_dpage(h); 624*50991Sbostic mpool_put(t->bt_mp, h, 0); 625*50991Sbostic } 626*50991Sbostic 627*50991Sbostic void 628*50991Sbostic bstat(db, argv) 629*50991Sbostic DB *db; 630*50991Sbostic char **argv; 631*50991Sbostic { 632*50991Sbostic (void)printf("BTREE\n"); 633*50991Sbostic __bt_stat(db); 634*50991Sbostic } 635*50991Sbostic 636*50991Sbostic void 637*50991Sbostic mstat(db, argv) 638*50991Sbostic DB *db; 639*50991Sbostic char **argv; 640*50991Sbostic { 641*50991Sbostic (void)printf("MPOOL\n"); 642*50991Sbostic mpool_stat(((BTREE *)db->internal)->bt_mp); 643*50991Sbostic } 644*50991Sbostic 645*50991Sbostic void 646*50991Sbostic keydata(key, data) 647*50991Sbostic DBT *key, *data; 648*50991Sbostic { 649*50991Sbostic if (!recno && key->size > 0) 650*50991Sbostic (void)printf("%s/", key->data); 65147886Sbostic if (data->size > 0) 652*50991Sbostic (void)printf("%s", data->data); 653*50991Sbostic (void)printf("\n"); 65447886Sbostic } 655*50991Sbostic 656*50991Sbostic void 657*50991Sbostic usage() 658*50991Sbostic { 659*50991Sbostic (void)fprintf(stderr, 660*50991Sbostic "usage: %s [-bdlu] [-c cache] [-i file] [-p page] [file]\n", 661*50991Sbostic progname); 662*50991Sbostic exit (1); 663*50991Sbostic } 664