11817Sdg/*- 2122296Speter * Copyright (c) 1990, 1993 31817Sdg * The Regents of the University of California. All rights reserved. 41817Sdg * 51817Sdg * This code is derived from software contributed to Berkeley by 61817Sdg * Mike Olson. 71817Sdg * 81817Sdg * Redistribution and use in source and binary forms, with or without 91817Sdg * modification, are permitted provided that the following conditions 101817Sdg * are met: 111817Sdg * 1. Redistributions of source code must retain the above copyright 121817Sdg * notice, this list of conditions and the following disclaimer. 131817Sdg * 2. Redistributions in binary form must reproduce the above copyright 141817Sdg * notice, this list of conditions and the following disclaimer in the 151817Sdg * documentation and/or other materials provided with the distribution. 161817Sdg * 4. Neither the name of the University nor the names of its contributors 171817Sdg * may be used to endorse or promote products derived from this software 181817Sdg * without specific prior written permission. 191817Sdg * 201817Sdg * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 211817Sdg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221817Sdg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231817Sdg * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 241817Sdg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251817Sdg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261817Sdg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271817Sdg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281817Sdg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291817Sdg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3050477Speter * SUCH DAMAGE. 311817Sdg */ 321817Sdg 334Srgrimes#if defined(LIBC_SCCS) && !defined(lint) 344Srgrimesstatic char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/4/93"; 3591497Smarkm#endif /* LIBC_SCCS and not lint */ 3691497Smarkm#include <sys/cdefs.h> 374Srgrimes__FBSDID("$FreeBSD$"); 384Srgrimes 39719Swollman#include <sys/param.h> 404479Sbde#include <fcntl.h> 41719Swollman#include <db.h> 42143063Sjoerg#include <errno.h> 43143063Sjoerg#include <stdio.h> 44143063Sjoerg#include <ctype.h> 45143063Sjoerg#include <stdlib.h> 46103778Speter#include <string.h> 4793264Sdillon#include "btree.h" 48220628Sjkim 49220628Sjkimtypedef struct cmd_table { 50220628Sjkim char *cmd; 51220628Sjkim int nargs; 5238392Sdfr int rconv; 53220628Sjkim void (*func)(DB *, char **); 54220628Sjkim char *usage, *descrip; 55220628Sjkim} cmd_table; 56220628Sjkim 5738392Sdfrint stopstop; 58143063SjoergDB *globaldb; 594Srgrimes 6015122Sbdevoid append(DB *, char **); 6115122Sbdevoid bstat(DB *, char **); 623102Sdgvoid cursor(DB *, char **); 634479Sbdevoid delcur(DB *, char **); 643102Sdgvoid delete(DB *, char **); 653102Sdgvoid dump(DB *, char **); 6655672Sbdevoid first(DB *, char **); 6755672Sbdevoid get(DB *, char **); 6855672Sbdevoid help(DB *, char **); 6955672Sbdevoid iafter(DB *, char **); 7055672Sbdevoid ibefore(DB *, char **); 7188118Sjhbvoid icursor(DB *, char **); 7255672Sbdevoid insert(DB *, char **); 7355672Sbdevoid keydata(DBT *, DBT *); 7455672Sbdevoid last(DB *, char **); 75123181Spetervoid list(DB *, char **); 76123181Spetervoid load(DB *, char **); 77123181Spetervoid mstat(DB *, char **); 78123181Spetervoid next(DB *, char **); 79123181Speterint parse(char *, char **, int); 80123181Spetervoid previous(DB *, char **); 81123181Spetervoid show(DB *, char **); 82123181Spetervoid usage(void); 83123181Spetervoid user(DB *); 8455672Sbde 8555672Sbdecmd_table commands[] = { 8655672Sbde "?", 0, 0, help, "help", NULL, 8755672Sbde "a", 2, 1, append, "append key def", "append key with data def", 8855672Sbde "b", 0, 0, bstat, "bstat", "stat btree", 8988118Sjhb "c", 1, 1, cursor, "cursor word", "move cursor to word", 9055672Sbde "delc", 0, 0, delcur, "delcur", "delete key the cursor references", 9155672Sbde "dele", 1, 1, delete, "delete word", "delete word", 9255672Sbde "d", 0, 0, dump, "dump", "dump database", 93123181Speter "f", 0, 0, first, "first", "move cursor to first record", 94123181Speter "g", 1, 1, get, "get key", "locate key", 95123181Speter "h", 0, 0, help, "help", "print command summary", 96123181Speter "ia", 2, 1, iafter, "iafter key data", "insert data after key", 97123181Speter "ib", 2, 1, ibefore, "ibefore key data", "insert data before key", 98123181Speter "ic", 2, 1, icursor, "icursor key data", "replace cursor", 99123181Speter "in", 2, 1, insert, "insert key def", "insert key with data def", 100123181Speter "la", 0, 0, last, "last", "move cursor to last record", 101123181Speter "li", 1, 1, list, "list file", "list to a file", 1023102Sdg "loa", 1, 0, load, "load file", NULL, 103195820Skib "loc", 1, 1, get, "get key", NULL, 104195820Skib "m", 0, 0, mstat, "mstat", "stat memory pool", 105195820Skib "n", 0, 0, next, "next", "move cursor forward one record", 106195820Skib "p", 0, 0, previous, "previous", "move cursor back one record", 107195820Skib "q", 0, 0, NULL, "quit", "quit", 108195820Skib "sh", 1, 0, show, "show page", "dump a page", 109195820Skib { NULL }, 110238311Sjhb}; 111238311Sjhb 112238311Sjhbint recno; /* use record numbers */ 113238311Sjhbchar *dict = "words"; /* default dictionary */ 114238311Sjhbchar *progname; 115238311Sjhb 116238311Sjhbint 1174479Sbdemain(argc, argv) 1183102Sdg int argc; 11910004Sdyson char **argv; 1203102Sdg{ 1213102Sdg int c; 1223102Sdg DB *db; 12394386Sdwmalone BTREEINFO b; 12494386Sdwmalone 12594386Sdwmalone progname = *argv; 12694386Sdwmalone 12794386Sdwmalone b.flags = 0; 12894386Sdwmalone b.cachesize = 0; 12994386Sdwmalone b.maxkeypage = 0; 13094386Sdwmalone b.minkeypage = 0; 131146170Snectar b.psize = 0; 132146170Snectar b.compare = NULL; 133146170Snectar b.prefix = NULL; 134146170Snectar b.lorder = 0; 135146170Snectar 136146170Snectar while ((c = getopt(argc, argv, "bc:di:lp:ru")) != -1) { 137146170Snectar switch (c) { 138146170Snectar case 'b': 1394479Sbde b.lorder = BIG_ENDIAN; 1403102Sdg break; 14110342Sbde case 'c': 1423102Sdg b.cachesize = atoi(optarg); 1433102Sdg break; 144126846Sbde case 'd': 145126846Sbde b.flags |= R_DUP; 14650054Speter break; 147132888Sps case 'i': 14850054Speter dict = optarg; 149123181Speter break; 150123181Speter case 'l': 151123181Speter b.lorder = LITTLE_ENDIAN; 152123181Speter break; 153123181Speter case 'p': 154123181Speter b.psize = atoi(optarg); 155123181Speter break; 156123181Speter case 'r': 15717384Swollman recno = 1; 15817384Swollman break; 15917384Swollman case 'u': 16017384Swollman b.flags = 0; 16117384Swollman break; 162100078Smarkm default: 16317384Swollman usage(); 16417384Swollman } 165123181Speter } 166123181Speter argc -= optind; 167123181Speter argv += optind; 168123181Speter 169123181Speter if (recno) 170123181Speter db = dbopen(*argv == NULL ? NULL : *argv, O_RDWR, 171123181Speter 0, DB_RECNO, NULL); 172123181Speter else 173126846Sbde db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|O_RDWR, 174126846Sbde 0600, DB_BTREE, &b); 175103749Smarkm 176103749Smarkm if (db == NULL) { 177103749Smarkm (void)fprintf(stderr, "dbopen: %s\n", strerror(errno)); 178103749Smarkm exit(1); 179103749Smarkm } 180103749Smarkm globaldb = db; 1814479Sbde user(db); 182190919Sed exit(0); 1833102Sdg /* NOTREACHED */ 1844479Sbde} 1854479Sbde 186220629Sjkimvoid 1874479Sbdeuser(db) 1883102Sdg DB *db; 1893102Sdg{ 19037552Sbde FILE *ifp; 1914479Sbde int argc, i, last; 1922826Sdg char *lbuf, *argv[4], buf[512]; 19337552Sbde 1942826Sdg if ((ifp = fopen("/dev/tty", "r")) == NULL) { 195220629Sjkim (void)fprintf(stderr, 1964479Sbde "/dev/tty: %s\n", strerror(errno)); 1972826Sdg exit(1); 1982826Sdg } 1994479Sbde for (last = 0;;) { 200201369Sobrien (void)printf("> "); 2012826Sdg (void)fflush(stdout); 2024479Sbde if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL) 203201369Sobrien break; 20488118Sjhb if (lbuf[0] == '\n') { 20542427Sbde i = last; 2064479Sbde goto uselast; 2072826Sdg } 2084479Sbde lbuf[strlen(lbuf) - 1] = '\0'; 209201369Sobrien 2104479Sbde if (lbuf[0] == 'q') 2114479Sbde break; 212201369Sobrien 21388118Sjhb argc = parse(lbuf, &argv[0], 3); 21442427Sbde if (argc == 0) 2152826Sdg continue; 2162826Sdg 2174479Sbde for (i = 0; commands[i].cmd != NULL; i++) 218201369Sobrien if (strncmp(commands[i].cmd, argv[0], 2192826Sdg strlen(commands[i].cmd)) == 0) 2204479Sbde break; 221201369Sobrien 22288118Sjhb if (commands[i].cmd == NULL) { 22342427Sbde (void)fprintf(stderr, 2242826Sdg "%s: command unknown ('help' for help)\n", lbuf); 2252826Sdg continue; 22618567Sbde } 22724112Skato 22824112Skato if (commands[i].nargs != argc - 1) { 22924112Skato (void)fprintf(stderr, "usage: %s\n", commands[i].usage); 23024112Skato continue; 23124112Skato } 2324479Sbde 2334479Sbde if (recno && commands[i].rconv) { 2342826Sdg static recno_t nlong; 2354479Sbde nlong = atoi(argv[1]); 2364479Sbde argv[1] = (char *)&nlong; 237220629Sjkim } 2384479Sbdeuselast: last = i; 2392826Sdg (*commands[i].func)(db, argv); 2402826Sdg } 2414479Sbde if ((db->sync)(db) == RET_ERROR) 242190919Sed perror("dbsync"); 2432826Sdg else if ((db->close)(db) == RET_ERROR) 244220629Sjkim perror("dbclose"); 2452826Sdg} 2462826Sdg 2474479Sbdeint 24837552Sbdeparse(lbuf, argv, maxargc) 2494Srgrimes char *lbuf, **argv; 250220629Sjkim int maxargc; 2514Srgrimes{ 2524Srgrimes int argc = 0; 2534479Sbde char *c; 254201369Sobrien 2554Srgrimes c = lbuf; 2564479Sbde while (isspace(*c)) 257201369Sobrien c++; 25888118Sjhb while (*c != '\0' && argc < maxargc) { 2594Srgrimes *argv++ = c; 2604Srgrimes argc++; 2614479Sbde while (!isspace(*c) && *c != '\0') { 262201369Sobrien c++; 2634Srgrimes } 2644479Sbde while (isspace(*c)) 265201369Sobrien *c++ = '\0'; 26688118Sjhb } 2674Srgrimes return (argc); 2684Srgrimes} 2694479Sbde 270201369Sobrienvoid 2714Srgrimesappend(db, argv) 2724479Sbde DB *db; 273201369Sobrien char **argv; 27488118Sjhb{ 2754Srgrimes DBT key, data; 2764Srgrimes int status; 2774479Sbde 2784479Sbde if (!recno) { 2794Srgrimes (void)fprintf(stderr, 280220629Sjkim "append only available for recno db's.\n"); 2814Srgrimes return; 2824Srgrimes } 283237855Salc key.data = argv[1]; 284237855Salc key.size = sizeof(recno_t); 285237855Salc data.data = argv[2]; 286237855Salc data.size = strlen(data.data); 287237855Salc status = (db->put)(db, &key, &data, R_APPEND); 288237855Salc switch (status) { 289237855Salc case RET_ERROR: 290237855Salc perror("append/put"); 291237855Salc break; 29297114Sjhb case RET_SPECIAL: 293238972Skib (void)printf("%s (duplicate key)\n", argv[1]); 294238972Skib break; 295238972Skib case RET_SUCCESS: 296238972Skib break; 297238972Skib } 298238972Skib} 299238972Skib 300195820Skibvoid 301195820Skibcursor(db, argv) 302195820Skib DB *db; 303197647Savg char **argv; 304195820Skib{ 305195820Skib DBT data, key; 306195820Skib int status; 30797139Sjhb 30897114Sjhb key.data = argv[1]; 30997114Sjhb if (recno) 31097114Sjhb key.size = sizeof(recno_t); 31197114Sjhb else 312114349Speter key.size = strlen(argv[1]) + 1; 313114349Speter status = (*db->seq)(db, &key, &data, R_CURSOR); 3144479Sbde switch (status) { 315114349Speter case RET_ERROR: 3164479Sbde perror("cursor/seq"); 317114349Speter break; 318114349Speter case RET_SPECIAL: 3194479Sbde (void)printf("key not found\n"); 3204479Sbde break; 321220628Sjkim case RET_SUCCESS: 32215122Sbde keydata(&key, &data); 3234479Sbde break; 324220628Sjkim } 32515122Sbde} 326114349Speter 327220628Sjkimvoid 3284479Sbdedelcur(db, argv) 3294479Sbde DB *db; 330220628Sjkim char **argv; 33115122Sbde{ 33214825Swollman int status; 333220628Sjkim 33415122Sbde status = (*db->del)(db, NULL, R_CURSOR); 335114349Speter 336220628Sjkim if (status == RET_ERROR) 33714825Swollman perror("delcur/del"); 33814825Swollman} 339220628Sjkim 34014825Swollmanvoid 34114825Swollmandelete(db, argv) 342220628Sjkim DB *db; 34315122Sbde char **argv; 344114349Speter{ 345220628Sjkim DBT key; 34614825Swollman int status; 34714825Swollman 348220631Sjkim key.data = argv[1]; 349220631Sjkim if (recno) 350220631Sjkim key.size = sizeof(recno_t); 351220631Sjkim else 352220631Sjkim key.size = strlen(argv[1]) + 1; 353220631Sjkim 354220631Sjkim status = (*db->del)(db, &key, 0); 355220631Sjkim switch (status) { 356220631Sjkim case RET_ERROR: 35715122Sbde perror("delete/del"); 35824112Skato break; 35924112Skato case RET_SPECIAL: 36024112Skato (void)printf("key not found\n"); 36124112Skato break; 36224112Skato case RET_SUCCESS: 36324112Skato break; 364114349Speter } 36514825Swollman} 366114349Speter 36714825Swollmanvoid 36814825Swollmandump(db, argv) 36914825Swollman DB *db; 370220628Sjkim char **argv; 37114825Swollman{ 372220628Sjkim __bt_dump(db); 373114349Speter} 374114349Speter 375114349Spetervoid 376114349Speterfirst(db, argv) 37714825Swollman DB *db; 37814825Swollman char **argv; 37999862Speter{ 380114349Speter DBT data, key; 38199862Speter int status; 38299862Speter 383114349Speter status = (*db->seq)(db, &key, &data, R_FIRST); 38499862Speter 38599862Speter switch (status) { 386114349Speter case RET_ERROR: 38799862Speter perror("first/seq"); 38899862Speter break; 389114349Speter case RET_SPECIAL: 39099862Speter (void)printf("no more keys\n"); 391114349Speter break; 39299862Speter case RET_SUCCESS: 39399862Speter keydata(&key, &data); 39499862Speter break; 395114349Speter } 39699862Speter} 39799862Speter 398114349Spetervoid 39999862Speterget(db, argv) 400114349Speter DB *db; 40199862Speter char **argv; 40299862Speter{ 40399862Speter DBT data, key; 40499862Speter int status; 405114349Speter 40699862Speter key.data = argv[1]; 40799862Speter if (recno) 408114349Speter key.size = sizeof(recno_t); 40999862Speter else 41099862Speter key.size = strlen(argv[1]) + 1; 411114349Speter 41299862Speter status = (*db->get)(db, &key, &data, 0); 41399862Speter 414114349Speter switch (status) { 41599862Speter case RET_ERROR: 416114349Speter perror("get/get"); 41799862Speter break; 41899862Speter case RET_SPECIAL: 41999862Speter (void)printf("key not found\n"); 42099862Speter break; 421114349Speter case RET_SUCCESS: 42299862Speter keydata(&key, &data); 423114349Speter break; 42499862Speter } 42599862Speter} 426114349Speter 42799862Spetervoid 42899862Speterhelp(db, argv) 429114349Speter DB *db; 43099862Speter char **argv; 431114349Speter{ 43299862Speter int i; 43399862Speter 43499862Speter for (i = 0; commands[i].cmd; i++) 435238142Sjhb if (commands[i].descrip) 436238142Sjhb (void)printf("%s: %s\n", 437238142Sjhb commands[i].usage, commands[i].descrip); 438238142Sjhb} 439238142Sjhb 440238142Sjhbvoid 441238142Sjhbiafter(db, argv) 442238142Sjhb DB *db; 443238142Sjhb char **argv; 444238142Sjhb{ 445238142Sjhb DBT key, data; 446238142Sjhb int status; 447238142Sjhb 448238142Sjhb if (!recno) { 449238142Sjhb (void)fprintf(stderr, 450238142Sjhb "iafter only available for recno db's.\n"); 451238142Sjhb return; 452238142Sjhb } 453238142Sjhb key.data = argv[1]; 45499862Speter key.size = sizeof(recno_t); 45599862Speter data.data = argv[2]; 45699862Speter data.size = strlen(data.data); 45799862Speter status = (db->put)(db, &key, &data, R_IAFTER); 45899862Speter switch (status) { 45999862Speter case RET_ERROR: 46099862Speter perror("iafter/put"); 46199862Speter break; 46299862Speter case RET_SPECIAL: 46399862Speter (void)printf("%s (duplicate key)\n", argv[1]); 464255331Sgibbs break; 465255331Sgibbs case RET_SUCCESS: 466255331Sgibbs break; 467255331Sgibbs } 46899862Speter} 469255331Sgibbs 470255331Sgibbsvoid 471255331Sgibbsibefore(db, argv) 472255331Sgibbs DB *db; 473255331Sgibbs char **argv; 474255331Sgibbs{ 475255331Sgibbs DBT key, data; 476255331Sgibbs int status; 477255331Sgibbs 478255331Sgibbs if (!recno) { 479255331Sgibbs (void)fprintf(stderr, 480255331Sgibbs "ibefore only available for recno db's.\n"); 481255331Sgibbs return; 482255331Sgibbs } 483255331Sgibbs key.data = argv[1]; 484255331Sgibbs key.size = sizeof(recno_t); 485255331Sgibbs data.data = argv[2]; 486255331Sgibbs data.size = strlen(data.data); 487255331Sgibbs status = (db->put)(db, &key, &data, R_IBEFORE); 488255331Sgibbs switch (status) { 489255331Sgibbs case RET_ERROR: 490255331Sgibbs perror("ibefore/put"); 491255331Sgibbs break; 492255331Sgibbs case RET_SPECIAL: 49399862Speter (void)printf("%s (duplicate key)\n", argv[1]); 49499862Speter break; 49599862Speter case RET_SUCCESS: 49699862Speter break; 497114349Speter } 49899862Speter} 49999862Speter 50099862Spetervoid 50199862Spetericursor(db, argv) 50299862Speter DB *db; 503255058Skib char **argv; 504255058Skib{ 505255058Skib int status; 506255058Skib DBT data, key; 507255058Skib 508255058Skib key.data = argv[1]; 509255058Skib if (recno) 510255058Skib key.size = sizeof(recno_t); 511255058Skib else 512255058Skib key.size = strlen(argv[1]) + 1; 513255058Skib data.data = argv[2]; 514255058Skib data.size = strlen(argv[2]) + 1; 515255058Skib 516255058Skib status = (*db->put)(db, &key, &data, R_CURSOR); 517255058Skib switch (status) { 518255058Skib case RET_ERROR: 519255058Skib perror("icursor/put"); 520255058Skib break; 521255058Skib case RET_SPECIAL: 522255058Skib (void)printf("%s (duplicate key)\n", argv[1]); 523212177Srdivacky break; 52446129Sluoqi case RET_SUCCESS: 52546129Sluoqi break; 526212177Srdivacky } 527212177Srdivacky} 52846129Sluoqi 52946129Sluoqivoid 53046129Sluoqiinsert(db, argv) 531212177Srdivacky DB *db; 53246129Sluoqi char **argv; 53346129Sluoqi{ 534212177Srdivacky int status; 535212177Srdivacky DBT data, key; 53646129Sluoqi 53746129Sluoqi key.data = argv[1]; 53846129Sluoqi if (recno) 539212177Srdivacky key.size = sizeof(recno_t); 540127973Speter else 541127973Speter key.size = strlen(argv[1]) + 1; 542212177Srdivacky data.data = argv[2]; 543212177Srdivacky data.size = strlen(argv[2]) + 1; 544127973Speter 545127973Speter status = (*db->put)(db, &key, &data, R_NOOVERWRITE); 546127973Speter switch (status) { 54746129Sluoqi case RET_ERROR: 548212177Srdivacky perror("insert/put"); 549114987Speter break; 550212177Srdivacky case RET_SPECIAL: 551114987Speter (void)printf("%s (duplicate key)\n", argv[1]); 552114987Speter break; 553114987Speter case RET_SUCCESS: 554212177Srdivacky break; 555114987Speter } 556212177Srdivacky} 557114987Speter 558114987Spetervoid 559197647Savglast(db, argv) 560223796Sjkim DB *db; 561178299Sjeff char **argv; 562223796Sjkim{ 563223796Sjkim DBT data, key; 564223796Sjkim int status; 565178299Sjeff 566178299Sjeff status = (*db->seq)(db, &key, &data, R_LAST); 567197647Savg 568223796Sjkim switch (status) { 569178299Sjeff case RET_ERROR: 570223796Sjkim perror("last/seq"); 571223796Sjkim break; 572178299Sjeff case RET_SPECIAL: 573178299Sjeff (void)printf("no more keys\n"); 574115006Speter break; 575115006Speter case RET_SUCCESS: 576115006Speter keydata(&key, &data); 577115006Speter break; 578115006Speter } 579114987Speter} 580212177Srdivacky 58146129Sluoqivoid 582115006Speterlist(db, argv) 583212177Srdivacky DB *db; 584190817Sed char **argv; 585115006Speter{ 586115006Speter DBT data, key; 587115006Speter FILE *fp; 588115006Speter int status; 589115006Speter 590115006Speter if ((fp = fopen(argv[1], "w")) == NULL) { 591212177Srdivacky (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno)); 592115006Speter return; 593115006Speter } 594115006Speter status = (*db->seq)(db, &key, &data, R_FIRST); 595115006Speter while (status == RET_SUCCESS) { 596115006Speter (void)fprintf(fp, "%s\n", key.data); 597115006Speter status = (*db->seq)(db, &key, &data, R_NEXT); 598212177Srdivacky } 599190817Sed if (status == RET_ERROR) 600115006Speter perror("list/seq"); 601115006Speter} 602115006Speter 603115006SpeterDB *BUGdb; 604212177Srdivackyvoid 605115006Speterload(db, argv) 606212177Srdivacky DB *db; 60746129Sluoqi char **argv; 60846129Sluoqi{ 60946129Sluoqi char *p, *t; 610212177Srdivacky FILE *fp; 61146129Sluoqi DBT data, key; 612212177Srdivacky recno_t cnt; 61346129Sluoqi size_t len; 614115006Speter int status; 61546129Sluoqi char *lp, buf[16 * 1024]; 616103778Speter 617103778Speter BUGdb = db; 618103778Speter if ((fp = fopen(argv[1], "r")) == NULL) { 619103778Speter (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno)); 620103778Speter return; 621103778Speter } 622103778Speter (void)printf("loading %s...\n", argv[1]); 623103778Speter 624103778Speter for (cnt = 1; (lp = fgetline(fp, &len)) != NULL; ++cnt) { 625103778Speter if (recno) { 626103778Speter key.data = &cnt; 627103778Speter key.size = sizeof(recno_t); 628103778Speter data.data = lp; 629103778Speter data.size = len + 1; 630103778Speter } else { 631103778Speter key.data = lp; 632103778Speter key.size = len + 1; 633103778Speter for (p = lp + len - 1, t = buf; p >= lp; *t++ = *p--); 634220628Sjkim *t = '\0'; 635125175Speter data.data = buf; 636125175Speter data.size = len + 1; 637220628Sjkim } 638125175Speter 639125175Speter status = (*db->put)(db, &key, &data, R_NOOVERWRITE); 640125175Speter switch (status) { 641125175Speter case RET_ERROR: 642125175Speter perror("load/put"); 643220628Sjkim exit(1); 644125175Speter case RET_SPECIAL: 645125175Speter if (recno) 646125175Speter (void)fprintf(stderr, 647125175Speter "duplicate: %ld {%s}\n", cnt, data.data); 648220628Sjkim else 649125175Speter (void)fprintf(stderr, 650125175Speter "duplicate: %ld {%s}\n", cnt, key.data); 651220628Sjkim exit(1); 652125175Speter case RET_SUCCESS: 653125175Speter break; 654125175Speter } 655125175Speter } 656125175Speter (void)fclose(fp); 657220628Sjkim} 658125175Speter 659125175Spetervoid 660125175Speternext(db, argv) 661125175Speter DB *db; 662220628Sjkim char **argv; 663125175Speter{ 664125175Speter DBT data, key; 665220628Sjkim int status; 666125175Speter 667125175Speter status = (*db->seq)(db, &key, &data, R_NEXT); 668125175Speter 669125175Speter switch (status) { 670125175Speter case RET_ERROR: 671220628Sjkim perror("next/seq"); 672125175Speter break; 673125175Speter case RET_SPECIAL: 674125175Speter (void)printf("no more keys\n"); 675125175Speter break; 676220628Sjkim case RET_SUCCESS: 677125175Speter keydata(&key, &data); 678125175Speter break; 679220628Sjkim } 680125175Speter} 681125175Speter 682125175Spetervoid 683125175Speterprevious(db, argv) 684125175Speter DB *db; 685220628Sjkim char **argv; 686125175Speter{ 687125175Speter DBT data, key; 688125175Speter int status; 689125175Speter 690220628Sjkim status = (*db->seq)(db, &key, &data, R_PREV); 691125175Speter 692125175Speter switch (status) { 693220628Sjkim case RET_ERROR: 694125175Speter perror("previous/seq"); 695125175Speter break; 696125175Speter case RET_SPECIAL: 697125175Speter (void)printf("no more keys\n"); 698125175Speter break; 699220628Sjkim case RET_SUCCESS: 700125175Speter keydata(&key, &data); 701125175Speter break; 702125175Speter } 703125175Speter} 704220628Sjkim 705125175Spetervoid 706125175Spetershow(db, argv) 707220628Sjkim DB *db; 708125175Speter char **argv; 709125175Speter{ 710125175Speter BTREE *t; 711125175Speter PAGE *h; 712125175Speter pgno_t pg; 713220628Sjkim 714125175Speter pg = atoi(argv[1]); 715125175Speter t = db->internal; 716125175Speter if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) { 717125175Speter (void)printf("getpage of %ld failed\n", pg); 718220628Sjkim return; 719125175Speter } 720125175Speter if (pg == 0) 721220628Sjkim __bt_dmpage(h); 722125175Speter else 723125175Speter __bt_dpage(h); 724125175Speter mpool_put(t->bt_mp, h, 0); 725125175Speter} 726125175Speter 727220628Sjkimvoid 728125175Speterbstat(db, argv) 729125175Speter DB *db; 730125175Speter char **argv; 731125175Speter{ 732220628Sjkim (void)printf("BTREE\n"); 733125175Speter __bt_stat(db); 734125175Speter} 735220628Sjkim 736125175Spetervoid 737125175Spetermstat(db, argv) 738125175Speter DB *db; 739125175Speter char **argv; 740125175Speter{ 741220628Sjkim (void)printf("MPOOL\n"); 742125175Speter mpool_stat(((BTREE *)db->internal)->bt_mp); 743125175Speter} 744125175Speter 745125175Spetervoid 74692860Simpkeydata(key, data) 74792860Simp DBT *key, *data; 74892860Simp{ 749114349Speter if (!recno && key->size > 0) 75092860Simp (void)printf("%s/", key->data); 751114349Speter if (data->size > 0) 75292860Simp (void)printf("%s", data->data); 753114349Speter (void)printf("\n"); 75492860Simp} 75592860Simp 75692860Simpvoid 757114349Speterusage() 75892860Simp{ 759114349Speter (void)fprintf(stderr, 76092860Simp "usage: %s [-bdlu] [-c cache] [-i file] [-p page] [file]\n", 76192860Simp progname); 762143063Sjoerg exit (1); 7634Srgrimes} 76492819Simp