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