xref: /csrg-svn/lib/libc/db/test/btree.tests/main.c (revision 50991)
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