xref: /csrg-svn/lib/libc/db/test/btree.tests/main.c (revision 61209)
147886Sbostic /*-
2*61209Sbostic  * Copyright (c) 1990, 1993
3*61209Sbostic  *	The Regents of the University of California.  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*61209Sbostic static char sccsid[] = "@(#)main.c	8.1 (Berkeley) 06/04/93";
1347886Sbostic #endif /* LIBC_SCCS and not lint */
1447886Sbostic 
1550991Sbostic #include <sys/param.h>
1650991Sbostic #include <fcntl.h>
1750991Sbostic #include <db.h>
1850991Sbostic #include <errno.h>
1947886Sbostic #include <stdio.h>
2047886Sbostic #include <ctype.h>
2150991Sbostic #include <stdlib.h>
2250991Sbostic #include <string.h>
2350991Sbostic #include "btree.h"
2447886Sbostic 
2547886Sbostic typedef struct cmd_table {
2647886Sbostic 	char *cmd;
2747886Sbostic 	int nargs;
2850991Sbostic 	int rconv;
2950991Sbostic 	void (*func) __P((DB *, char **));
3050991Sbostic 	char *usage, *descrip;
3147886Sbostic } cmd_table;
3247886Sbostic 
3350991Sbostic int stopstop;
3450991Sbostic DB *globaldb;
3547886Sbostic 
3651096Sbostic void append	__P((DB *, char **));
3750991Sbostic void bstat	__P((DB *, char **));
3850991Sbostic void cursor	__P((DB *, char **));
3950991Sbostic void delcur	__P((DB *, char **));
4050991Sbostic void delete	__P((DB *, char **));
4150991Sbostic void dump	__P((DB *, char **));
4250991Sbostic void first	__P((DB *, char **));
4350991Sbostic void get	__P((DB *, char **));
4450991Sbostic void help	__P((DB *, char **));
4550991Sbostic void iafter	__P((DB *, char **));
4650991Sbostic void ibefore	__P((DB *, char **));
4751096Sbostic void icursor	__P((DB *, char **));
4850991Sbostic void insert	__P((DB *, char **));
4950991Sbostic void keydata	__P((DBT *, DBT *));
5050991Sbostic void last	__P((DB *, char **));
5150991Sbostic void list	__P((DB *, char **));
5250991Sbostic void load	__P((DB *, char **));
5350991Sbostic void mstat	__P((DB *, char **));
5450991Sbostic void next	__P((DB *, char **));
5550991Sbostic int  parse	__P((char *, char **, int));
5650991Sbostic void previous	__P((DB *, char **));
5750991Sbostic void show	__P((DB *, char **));
5850991Sbostic void usage	__P((void));
5950991Sbostic void user	__P((DB *));
6050991Sbostic 
6150991Sbostic cmd_table commands[] = {
6250991Sbostic 	"?",	0, 0, help, "help", NULL,
6351096Sbostic 	"a",	2, 1, append, "append key def", "append key with data def",
6450991Sbostic 	"b",	0, 0, bstat, "bstat", "stat btree",
6550991Sbostic 	"c",	1, 1, cursor,  "cursor word", "move cursor to word",
6650991Sbostic 	"delc",	0, 0, delcur, "delcur", "delete key the cursor references",
6750991Sbostic 	"dele",	1, 1, delete, "delete word", "delete word",
6850991Sbostic 	"d",	0, 0, dump, "dump", "dump database",
6950991Sbostic 	"f",	0, 0, first, "first", "move cursor to first record",
7051096Sbostic 	"g",	1, 1, get, "get key", "locate key",
7150991Sbostic 	"h",	0, 0, help, "help", "print command summary",
7250991Sbostic 	"ia",	2, 1, iafter, "iafter key data", "insert data after key",
7350991Sbostic 	"ib",	2, 1, ibefore, "ibefore key data", "insert data before key",
7451096Sbostic 	"ic",	2, 1, icursor, "icursor key data", "replace cursor",
7551096Sbostic 	"in",	2, 1, insert, "insert key def", "insert key with data def",
7650991Sbostic 	"la",	0, 0, last, "last", "move cursor to last record",
7750991Sbostic 	"li",	1, 1, list, "list file", "list to a file",
7854291Sbostic 	"loa",	1, 0, load, "load file", NULL,
7951096Sbostic 	"loc",	1, 1, get, "get key", NULL,
8050991Sbostic 	"m",	0, 0, mstat, "mstat", "stat memory pool",
8150991Sbostic 	"n",	0, 0, next, "next", "move cursor forward one record",
8250991Sbostic 	"p",	0, 0, previous, "previous", "move cursor back one record",
8350991Sbostic 	"q",	0, 0, NULL, "quit", "quit",
8450991Sbostic 	"sh",	1, 0, show, "show page", "dump a page",
8550991Sbostic 	{ NULL },
8647886Sbostic };
8747886Sbostic 
8850991Sbostic int recno;					/* use record numbers */
8950991Sbostic char *dict = "words";				/* default dictionary */
9050991Sbostic char *progname;
9147886Sbostic 
9250991Sbostic int
main(argc,argv)9347886Sbostic main(argc, argv)
9447886Sbostic 	int argc;
9547886Sbostic 	char **argv;
9647886Sbostic {
9747886Sbostic 	int c;
9850991Sbostic 	DB *db;
9947886Sbostic 	BTREEINFO b;
10047886Sbostic 
10147886Sbostic 	progname = *argv;
10247886Sbostic 
10350991Sbostic 	b.flags = 0;
10450991Sbostic 	b.cachesize = 0;
10550991Sbostic 	b.maxkeypage = 0;
10650991Sbostic 	b.minkeypage = 0;
10747886Sbostic 	b.psize = 0;
10850991Sbostic 	b.compare = NULL;
10950991Sbostic 	b.prefix = NULL;
11047886Sbostic 	b.lorder = 0;
11147886Sbostic 
11250991Sbostic 	while ((c = getopt(argc, argv, "bc:di:lp:ru")) != EOF) {
11347886Sbostic 		switch (c) {
11450991Sbostic 		case 'b':
11550991Sbostic 			b.lorder = BIG_ENDIAN;
11647886Sbostic 			break;
11750991Sbostic 		case 'c':
11847886Sbostic 			b.cachesize = atoi(optarg);
11947886Sbostic 			break;
12050991Sbostic 		case 'd':
12150991Sbostic 			b.flags |= R_DUP;
12247886Sbostic 			break;
12350991Sbostic 		case 'i':
12450991Sbostic 			dict = optarg;
12550991Sbostic 			break;
12650991Sbostic 		case 'l':
12747886Sbostic 			b.lorder = LITTLE_ENDIAN;
12847886Sbostic 			break;
12950991Sbostic 		case 'p':
13050991Sbostic 			b.psize = atoi(optarg);
13147886Sbostic 			break;
13250991Sbostic 		case 'r':
13350991Sbostic 			recno = 1;
13450991Sbostic 			break;
13550991Sbostic 		case 'u':
13650991Sbostic 			b.flags = 0;
13750991Sbostic 			break;
13850991Sbostic 		default:
13950991Sbostic 			usage();
14047886Sbostic 		}
14147886Sbostic 	}
14250991Sbostic 	argc -= optind;
14350991Sbostic 	argv += optind;
14447886Sbostic 
14550991Sbostic 	if (recno)
14650991Sbostic 		db = dbopen(*argv == NULL ? NULL : *argv, O_RDWR,
14750991Sbostic 		    0, DB_RECNO, NULL);
14850991Sbostic 	else
14950991Sbostic 		db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|O_RDWR,
15050991Sbostic 		    0600, DB_BTREE, &b);
15147886Sbostic 
15250991Sbostic 	if (db == NULL) {
15350991Sbostic 		(void)fprintf(stderr, "dbopen: %s\n", strerror(errno));
15450991Sbostic 		exit(1);
15547886Sbostic 	}
15650991Sbostic 	globaldb = db;
15750991Sbostic 	user(db);
15850991Sbostic 	exit(0);
15950991Sbostic 	/* NOTREACHED */
16047886Sbostic }
16147886Sbostic 
16250991Sbostic void
user(db)16350991Sbostic user(db)
16450991Sbostic 	DB *db;
16547886Sbostic {
16650991Sbostic 	FILE *ifp;
16750991Sbostic 	int argc, i, last;
16850991Sbostic 	char *lbuf, *argv[4], buf[512];
16947886Sbostic 
17050991Sbostic 	if ((ifp = fopen("/dev/tty", "r")) == NULL) {
17150991Sbostic 		(void)fprintf(stderr,
17250991Sbostic 		    "/dev/tty: %s\n", strerror(errno));
17350991Sbostic 		exit(1);
17447886Sbostic 	}
17550991Sbostic 	for (last = 0;;) {
17650991Sbostic 		(void)printf("> ");
17750991Sbostic 		(void)fflush(stdout);
17850991Sbostic 		if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL)
17947886Sbostic 			break;
18050991Sbostic 		if (lbuf[0] == '\n') {
18150991Sbostic 			i = last;
18250991Sbostic 			goto uselast;
18347886Sbostic 		}
18447886Sbostic 		lbuf[strlen(lbuf) - 1] = '\0';
18547886Sbostic 
18650991Sbostic 		if (lbuf[0] == 'q')
18747886Sbostic 			break;
18847886Sbostic 
18947886Sbostic 		argc = parse(lbuf, &argv[0], 3);
19047886Sbostic 		if (argc == 0)
19147886Sbostic 			continue;
19247886Sbostic 
19350991Sbostic 		for (i = 0; commands[i].cmd != NULL; i++)
19450991Sbostic 			if (strncmp(commands[i].cmd, argv[0],
19550991Sbostic 			    strlen(commands[i].cmd)) == 0)
19647886Sbostic 				break;
19747886Sbostic 
19850991Sbostic 		if (commands[i].cmd == NULL) {
19950991Sbostic 			(void)fprintf(stderr,
20050991Sbostic 			    "%s: command unknown ('help' for help)\n", lbuf);
20147886Sbostic 			continue;
20247886Sbostic 		}
20347886Sbostic 
20450991Sbostic 		if (commands[i].nargs != argc - 1) {
20550991Sbostic 			(void)fprintf(stderr, "usage: %s\n", commands[i].usage);
20647886Sbostic 			continue;
20747886Sbostic 		}
20847886Sbostic 
20950991Sbostic 		if (recno && commands[i].rconv) {
21050991Sbostic 			static recno_t nlong;
21150991Sbostic 			nlong = atoi(argv[1]);
21250991Sbostic 			argv[1] = (char *)&nlong;
21347886Sbostic 		}
21450991Sbostic uselast:	last = i;
21550991Sbostic 		(*commands[i].func)(db, argv);
21647886Sbostic 	}
21750991Sbostic 	if ((db->sync)(db) == RET_ERROR)
21850991Sbostic 		perror("dbsync");
21950991Sbostic 	else if ((db->close)(db) == RET_ERROR)
22050991Sbostic 		perror("dbclose");
22147886Sbostic }
22247886Sbostic 
22347886Sbostic int
parse(lbuf,argv,maxargc)22447886Sbostic parse(lbuf, argv, maxargc)
22550991Sbostic 	char *lbuf, **argv;
22647886Sbostic 	int maxargc;
22747886Sbostic {
22847886Sbostic 	int argc = 0;
22947886Sbostic 	char *c;
23047886Sbostic 
23147886Sbostic 	c = lbuf;
23247886Sbostic 	while (isspace(*c))
23347886Sbostic 		c++;
23447886Sbostic 	while (*c != '\0' && argc < maxargc) {
23547886Sbostic 		*argv++ = c;
23647886Sbostic 		argc++;
23747886Sbostic 		while (!isspace(*c) && *c != '\0') {
23847886Sbostic 			c++;
23947886Sbostic 		}
24047886Sbostic 		while (isspace(*c))
24147886Sbostic 			*c++ = '\0';
24247886Sbostic 	}
24347886Sbostic 	return (argc);
24447886Sbostic }
24547886Sbostic 
24650991Sbostic void
append(db,argv)24751096Sbostic append(db, argv)
24851096Sbostic 	DB *db;
24951096Sbostic 	char **argv;
25051096Sbostic {
25151096Sbostic 	DBT key, data;
25251096Sbostic 	int status;
25351096Sbostic 
25451096Sbostic 	if (!recno) {
25551096Sbostic 		(void)fprintf(stderr,
25651096Sbostic 		    "append only available for recno db's.\n");
25751096Sbostic 		return;
25851096Sbostic 	}
25951096Sbostic 	key.data = argv[1];
26051096Sbostic 	key.size = sizeof(recno_t);
26151096Sbostic 	data.data = argv[2];
26251096Sbostic 	data.size = strlen(data.data);
26351096Sbostic 	status = (db->put)(db, &key, &data, R_APPEND);
26451096Sbostic 	switch (status) {
26551096Sbostic 	case RET_ERROR:
26651096Sbostic 		perror("append/put");
26751096Sbostic 		break;
26851096Sbostic 	case RET_SPECIAL:
26951096Sbostic 		(void)printf("%s (duplicate key)\n", argv[1]);
27051096Sbostic 		break;
27151096Sbostic 	case RET_SUCCESS:
27251096Sbostic 		break;
27351096Sbostic 	}
27451096Sbostic }
27551096Sbostic 
27651096Sbostic void
cursor(db,argv)27750991Sbostic cursor(db, argv)
27850991Sbostic 	DB *db;
27950991Sbostic 	char **argv;
28047886Sbostic {
28150991Sbostic 	DBT data, key;
28247886Sbostic 	int status;
28347886Sbostic 
28450991Sbostic 	key.data = argv[1];
28550991Sbostic 	if (recno)
28650991Sbostic 		key.size = sizeof(recno_t);
28747886Sbostic 	else
28850991Sbostic 		key.size = strlen(argv[1]) + 1;
28950991Sbostic 	status = (*db->seq)(db, &key, &data, R_CURSOR);
29050991Sbostic 	switch (status) {
29150991Sbostic 	case RET_ERROR:
29251096Sbostic 		perror("cursor/seq");
29350991Sbostic 		break;
29450991Sbostic 	case RET_SPECIAL:
29550991Sbostic 		(void)printf("key not found\n");
29650991Sbostic 		break;
29750991Sbostic 	case RET_SUCCESS:
29850991Sbostic 		keydata(&key, &data);
29950991Sbostic 		break;
30050991Sbostic 	}
30147886Sbostic }
30247886Sbostic 
30350991Sbostic void
delcur(db,argv)30450991Sbostic delcur(db, argv)
30550991Sbostic 	DB *db;
30650991Sbostic 	char **argv;
30747886Sbostic {
30847886Sbostic 	int status;
30947886Sbostic 
31050991Sbostic 	status = (*db->del)(db, NULL, R_CURSOR);
31147886Sbostic 
31247886Sbostic 	if (status == RET_ERROR)
31351096Sbostic 		perror("delcur/del");
31447886Sbostic }
31547886Sbostic 
31650991Sbostic void
delete(db,argv)31750991Sbostic delete(db, argv)
31850991Sbostic 	DB *db;
31950991Sbostic 	char **argv;
32047886Sbostic {
32150991Sbostic 	DBT key;
32247886Sbostic 	int status;
32347886Sbostic 
32450991Sbostic 	key.data = argv[1];
32550991Sbostic 	if (recno)
32650991Sbostic 		key.size = sizeof(recno_t);
32750991Sbostic 	else
32850991Sbostic 		key.size = strlen(argv[1]) + 1;
32947886Sbostic 
33050991Sbostic 	status = (*db->del)(db, &key, 0);
33147886Sbostic 	switch (status) {
33250991Sbostic 	case RET_ERROR:
33351096Sbostic 		perror("delete/del");
33447886Sbostic 		break;
33550991Sbostic 	case RET_SPECIAL:
33650991Sbostic 		(void)printf("key not found\n");
33747886Sbostic 		break;
33850991Sbostic 	case RET_SUCCESS:
33950991Sbostic 		break;
34047886Sbostic 	}
34147886Sbostic }
34247886Sbostic 
34350991Sbostic void
dump(db,argv)34450991Sbostic dump(db, argv)
34550991Sbostic 	DB *db;
34650991Sbostic 	char **argv;
34747886Sbostic {
34850991Sbostic 	__bt_dump(db);
34950991Sbostic }
35050991Sbostic 
35150991Sbostic void
first(db,argv)35250991Sbostic first(db, argv)
35350991Sbostic 	DB *db;
35450991Sbostic 	char **argv;
35550991Sbostic {
35650991Sbostic 	DBT data, key;
35747886Sbostic 	int status;
35847886Sbostic 
35950991Sbostic 	status = (*db->seq)(db, &key, &data, R_FIRST);
36047886Sbostic 
36147886Sbostic 	switch (status) {
36250991Sbostic 	case RET_ERROR:
36351096Sbostic 		perror("first/seq");
36447886Sbostic 		break;
36550991Sbostic 	case RET_SPECIAL:
36650991Sbostic 		(void)printf("no more keys\n");
36747886Sbostic 		break;
36850991Sbostic 	case RET_SUCCESS:
36950991Sbostic 		keydata(&key, &data);
37050991Sbostic 		break;
37150991Sbostic 	}
37250991Sbostic }
37347886Sbostic 
37450991Sbostic void
get(db,argv)37550991Sbostic get(db, argv)
37650991Sbostic 	DB *db;
37750991Sbostic 	char **argv;
37850991Sbostic {
37950991Sbostic 	DBT data, key;
38050991Sbostic 	int status;
38150991Sbostic 
38250991Sbostic 	key.data = argv[1];
38350991Sbostic 	if (recno)
38450991Sbostic 		key.size = sizeof(recno_t);
38550991Sbostic 	else
38650991Sbostic 		key.size = strlen(argv[1]) + 1;
38750991Sbostic 
38850991Sbostic 	status = (*db->get)(db, &key, &data, 0);
38950991Sbostic 
39050991Sbostic 	switch (status) {
39150991Sbostic 	case RET_ERROR:
39251096Sbostic 		perror("get/get");
39347886Sbostic 		break;
39450991Sbostic 	case RET_SPECIAL:
39550991Sbostic 		(void)printf("key not found\n");
39650991Sbostic 		break;
39750991Sbostic 	case RET_SUCCESS:
39850991Sbostic 		keydata(&key, &data);
39950991Sbostic 		break;
40047886Sbostic 	}
40147886Sbostic }
40250991Sbostic 
40350991Sbostic void
help(db,argv)40450991Sbostic help(db, argv)
40550991Sbostic 	DB *db;
40650991Sbostic 	char **argv;
40747886Sbostic {
40847886Sbostic 	int i;
40947886Sbostic 
41050991Sbostic 	for (i = 0; commands[i].cmd; i++)
41150991Sbostic 		if (commands[i].descrip)
41250991Sbostic 			(void)printf("%s: %s\n",
41350991Sbostic 			    commands[i].usage, commands[i].descrip);
41447886Sbostic }
41547886Sbostic 
41650991Sbostic void
iafter(db,argv)41750991Sbostic iafter(db, argv)
41850991Sbostic 	DB *db;
41950991Sbostic 	char **argv;
42047886Sbostic {
42150991Sbostic 	DBT key, data;
42247886Sbostic 	int status;
42347886Sbostic 
42450991Sbostic 	if (!recno) {
42550991Sbostic 		(void)fprintf(stderr,
42650991Sbostic 		    "iafter only available for recno db's.\n");
42750991Sbostic 		return;
42850991Sbostic 	}
42950991Sbostic 	key.data = argv[1];
43050991Sbostic 	key.size = sizeof(recno_t);
43150991Sbostic 	data.data = argv[2];
43250991Sbostic 	data.size = strlen(data.data);
43350991Sbostic 	status = (db->put)(db, &key, &data, R_IAFTER);
43447886Sbostic 	switch (status) {
43550991Sbostic 	case RET_ERROR:
43651096Sbostic 		perror("iafter/put");
43747886Sbostic 		break;
43850991Sbostic 	case RET_SPECIAL:
43950991Sbostic 		(void)printf("%s (duplicate key)\n", argv[1]);
44047886Sbostic 		break;
44150991Sbostic 	case RET_SUCCESS:
44250991Sbostic 		break;
44350991Sbostic 	}
44450991Sbostic }
44547886Sbostic 
44650991Sbostic void
ibefore(db,argv)44750991Sbostic ibefore(db, argv)
44850991Sbostic 	DB *db;
44950991Sbostic 	char **argv;
45050991Sbostic {
45150991Sbostic 	DBT key, data;
45250991Sbostic 	int status;
45350991Sbostic 
45450991Sbostic 	if (!recno) {
45550991Sbostic 		(void)fprintf(stderr,
45650991Sbostic 		    "ibefore only available for recno db's.\n");
45750991Sbostic 		return;
45850991Sbostic 	}
45950991Sbostic 	key.data = argv[1];
46050991Sbostic 	key.size = sizeof(recno_t);
46150991Sbostic 	data.data = argv[2];
46250991Sbostic 	data.size = strlen(data.data);
46350991Sbostic 	status = (db->put)(db, &key, &data, R_IBEFORE);
46450991Sbostic 	switch (status) {
46550991Sbostic 	case RET_ERROR:
46651096Sbostic 		perror("ibefore/put");
46747886Sbostic 		break;
46850991Sbostic 	case RET_SPECIAL:
46950991Sbostic 		(void)printf("%s (duplicate key)\n", argv[1]);
47050991Sbostic 		break;
47150991Sbostic 	case RET_SUCCESS:
47250991Sbostic 		break;
47347886Sbostic 	}
47447886Sbostic }
47547886Sbostic 
47650991Sbostic void
icursor(db,argv)47751096Sbostic icursor(db, argv)
47851096Sbostic 	DB *db;
47951096Sbostic 	char **argv;
48051096Sbostic {
48151096Sbostic 	int status;
48251096Sbostic 	DBT data, key;
48351096Sbostic 
48451096Sbostic 	key.data = argv[1];
48551096Sbostic 	if (recno)
48651096Sbostic 		key.size = sizeof(recno_t);
48751096Sbostic 	else
48851096Sbostic 		key.size = strlen(argv[1]) + 1;
48951096Sbostic 	data.data = argv[2];
49051096Sbostic 	data.size = strlen(argv[2]) + 1;
49151096Sbostic 
49251096Sbostic 	status = (*db->put)(db, &key, &data, R_CURSOR);
49351096Sbostic 	switch (status) {
49451096Sbostic 	case RET_ERROR:
49551096Sbostic 		perror("icursor/put");
49651096Sbostic 		break;
49751096Sbostic 	case RET_SPECIAL:
49851096Sbostic 		(void)printf("%s (duplicate key)\n", argv[1]);
49951096Sbostic 		break;
50051096Sbostic 	case RET_SUCCESS:
50151096Sbostic 		break;
50251096Sbostic 	}
50351096Sbostic }
50451096Sbostic 
50551096Sbostic void
insert(db,argv)50650991Sbostic insert(db, argv)
50750991Sbostic 	DB *db;
50850991Sbostic 	char **argv;
50947886Sbostic {
51047886Sbostic 	int status;
51150991Sbostic 	DBT data, key;
51247886Sbostic 
51350991Sbostic 	key.data = argv[1];
51450991Sbostic 	if (recno)
51550991Sbostic 		key.size = sizeof(recno_t);
51650991Sbostic 	else
51750991Sbostic 		key.size = strlen(argv[1]) + 1;
51850991Sbostic 	data.data = argv[2];
51950991Sbostic 	data.size = strlen(argv[2]) + 1;
52047886Sbostic 
52150991Sbostic 	status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
52247886Sbostic 	switch (status) {
52350991Sbostic 	case RET_ERROR:
52451096Sbostic 		perror("insert/put");
52547886Sbostic 		break;
52650991Sbostic 	case RET_SPECIAL:
52750991Sbostic 		(void)printf("%s (duplicate key)\n", argv[1]);
52847886Sbostic 		break;
52950991Sbostic 	case RET_SUCCESS:
53047886Sbostic 		break;
53147886Sbostic 	}
53247886Sbostic }
53347886Sbostic 
53450991Sbostic void
last(db,argv)53550991Sbostic last(db, argv)
53650991Sbostic 	DB *db;
53750991Sbostic 	char **argv;
53847886Sbostic {
53950991Sbostic 	DBT data, key;
54047886Sbostic 	int status;
54147886Sbostic 
54250991Sbostic 	status = (*db->seq)(db, &key, &data, R_LAST);
54347886Sbostic 
54447886Sbostic 	switch (status) {
54550991Sbostic 	case RET_ERROR:
54651096Sbostic 		perror("last/seq");
54747886Sbostic 		break;
54850991Sbostic 	case RET_SPECIAL:
54950991Sbostic 		(void)printf("no more keys\n");
55047886Sbostic 		break;
55150991Sbostic 	case RET_SUCCESS:
55250991Sbostic 		keydata(&key, &data);
55347886Sbostic 		break;
55447886Sbostic 	}
55547886Sbostic }
55647886Sbostic 
55750991Sbostic void
list(db,argv)55850991Sbostic list(db, argv)
55950991Sbostic 	DB *db;
56050991Sbostic 	char **argv;
56147886Sbostic {
56250991Sbostic 	DBT data, key;
56350991Sbostic 	FILE *fp;
56447886Sbostic 	int status;
56547886Sbostic 
56650991Sbostic 	if ((fp = fopen(argv[1], "w")) == NULL) {
56750991Sbostic 		(void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
56850991Sbostic 		return;
56950991Sbostic 	}
57050991Sbostic 	status = (*db->seq)(db, &key, &data, R_FIRST);
57150991Sbostic 	while (status == RET_SUCCESS) {
57250991Sbostic 		(void)fprintf(fp, "%s\n", key.data);
57350991Sbostic 		status = (*db->seq)(db, &key, &data, R_NEXT);
57450991Sbostic 	}
57550991Sbostic 	if (status == RET_ERROR)
57651096Sbostic 		perror("list/seq");
57750991Sbostic }
57847886Sbostic 
57954291Sbostic DB *BUGdb;
58050991Sbostic void
load(db,argv)58150991Sbostic load(db, argv)
58250991Sbostic 	DB *db;
58350991Sbostic 	char **argv;
58450991Sbostic {
58550991Sbostic 	register char *p, *t;
58650991Sbostic 	FILE *fp;
58750991Sbostic 	DBT data, key;
58854291Sbostic 	recno_t cnt;
58954291Sbostic 	size_t len;
59050991Sbostic 	int status;
59154291Sbostic 	char *lp, buf[16 * 1024];
59250991Sbostic 
59354291Sbostic 	BUGdb = db;
59450991Sbostic 	if ((fp = fopen(argv[1], "r")) == NULL) {
59554291Sbostic 		(void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
59650991Sbostic 		return;
59750991Sbostic 	}
59854291Sbostic 	(void)printf("loading %s...\n", argv[1]);
59950991Sbostic 
60054291Sbostic 	for (cnt = 1; (lp = fgetline(fp, &len)) != NULL; ++cnt) {
60154291Sbostic 		if (recno) {
60254291Sbostic 			key.data = &cnt;
60354291Sbostic 			key.size = sizeof(recno_t);
60454291Sbostic 			data.data = lp;
60554291Sbostic 			data.size = len + 1;
60654291Sbostic 		} else {
60754291Sbostic 			key.data = lp;
60854291Sbostic 			key.size = len + 1;
60954291Sbostic 			for (p = lp + len - 1, t = buf; p >= lp; *t++ = *p--);
61054291Sbostic 			*t = '\0';
61154291Sbostic 			data.data = buf;
61254291Sbostic 			data.size = len + 1;
61354291Sbostic 		}
61450991Sbostic 
61550991Sbostic 		status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
61650991Sbostic 		switch (status) {
61750991Sbostic 		case RET_ERROR:
61850991Sbostic 			perror("load/put");
61950991Sbostic 			exit(1);
62050991Sbostic 		case RET_SPECIAL:
62154291Sbostic 			if (recno)
62254291Sbostic 				(void)fprintf(stderr,
62354291Sbostic 				    "duplicate: %ld {%s}\n", cnt, data.data);
62454291Sbostic 			else
62554291Sbostic 				(void)fprintf(stderr,
62654291Sbostic 				    "duplicate: %ld {%s}\n", cnt, key.data);
62750991Sbostic 			exit(1);
62850991Sbostic 		case RET_SUCCESS:
62950991Sbostic 			break;
63050991Sbostic 		}
63150991Sbostic 	}
63250991Sbostic 	(void)fclose(fp);
63350991Sbostic }
63450991Sbostic 
63550991Sbostic void
next(db,argv)63650991Sbostic next(db, argv)
63750991Sbostic 	DB *db;
63850991Sbostic 	char **argv;
63950991Sbostic {
64050991Sbostic 	DBT data, key;
64150991Sbostic 	int status;
64250991Sbostic 
64350991Sbostic 	status = (*db->seq)(db, &key, &data, R_NEXT);
64450991Sbostic 
64547886Sbostic 	switch (status) {
64650991Sbostic 	case RET_ERROR:
64751096Sbostic 		perror("next/seq");
64847886Sbostic 		break;
64950991Sbostic 	case RET_SPECIAL:
65050991Sbostic 		(void)printf("no more keys\n");
65147886Sbostic 		break;
65250991Sbostic 	case RET_SUCCESS:
65350991Sbostic 		keydata(&key, &data);
65447886Sbostic 		break;
65547886Sbostic 	}
65647886Sbostic }
65747886Sbostic 
65850991Sbostic void
previous(db,argv)65950991Sbostic previous(db, argv)
66050991Sbostic 	DB *db;
66150991Sbostic 	char **argv;
66247886Sbostic {
66350991Sbostic 	DBT data, key;
66447886Sbostic 	int status;
66547886Sbostic 
66650991Sbostic 	status = (*db->seq)(db, &key, &data, R_PREV);
66747886Sbostic 
66847886Sbostic 	switch (status) {
66950991Sbostic 	case RET_ERROR:
67051096Sbostic 		perror("previous/seq");
67147886Sbostic 		break;
67250991Sbostic 	case RET_SPECIAL:
67350991Sbostic 		(void)printf("no more keys\n");
67447886Sbostic 		break;
67550991Sbostic 	case RET_SUCCESS:
67650991Sbostic 		keydata(&key, &data);
67747886Sbostic 		break;
67847886Sbostic 	}
67947886Sbostic }
68047886Sbostic 
68150991Sbostic void
show(db,argv)68250991Sbostic show(db, argv)
68350991Sbostic 	DB *db;
68450991Sbostic 	char **argv;
68547886Sbostic {
68650991Sbostic 	BTREE *t;
68750991Sbostic 	PAGE *h;
68850991Sbostic 	pgno_t pg;
68950991Sbostic 
69050991Sbostic 	pg = atoi(argv[1]);
69150991Sbostic 	t = db->internal;
69250991Sbostic 	if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) {
69350991Sbostic 		(void)printf("getpage of %ld failed\n", pg);
69450991Sbostic 		return;
69550991Sbostic 	}
69651096Sbostic 	if (pg == 0)
69751096Sbostic 		__bt_dmpage(h);
69851096Sbostic 	else
69951096Sbostic 		__bt_dpage(h);
70050991Sbostic 	mpool_put(t->bt_mp, h, 0);
70150991Sbostic }
70250991Sbostic 
70350991Sbostic void
bstat(db,argv)70450991Sbostic bstat(db, argv)
70550991Sbostic 	DB *db;
70650991Sbostic 	char **argv;
70750991Sbostic {
70850991Sbostic 	(void)printf("BTREE\n");
70950991Sbostic 	__bt_stat(db);
71050991Sbostic }
71150991Sbostic 
71250991Sbostic void
mstat(db,argv)71350991Sbostic mstat(db, argv)
71450991Sbostic 	DB *db;
71550991Sbostic 	char **argv;
71650991Sbostic {
71750991Sbostic 	(void)printf("MPOOL\n");
71850991Sbostic 	mpool_stat(((BTREE *)db->internal)->bt_mp);
71950991Sbostic }
72050991Sbostic 
72150991Sbostic void
keydata(key,data)72250991Sbostic keydata(key, data)
72350991Sbostic 	DBT *key, *data;
72450991Sbostic {
72550991Sbostic 	if (!recno && key->size > 0)
72650991Sbostic 		(void)printf("%s/", key->data);
72747886Sbostic 	if (data->size > 0)
72850991Sbostic 		(void)printf("%s", data->data);
72950991Sbostic 	(void)printf("\n");
73047886Sbostic }
73150991Sbostic 
73250991Sbostic void
usage()73350991Sbostic usage()
73450991Sbostic {
73550991Sbostic 	(void)fprintf(stderr,
73650991Sbostic 	    "usage: %s [-bdlu] [-c cache] [-i file] [-p page] [file]\n",
73750991Sbostic 	    progname);
73850991Sbostic 	exit (1);
73950991Sbostic }
740