158f0484fSRodney W. Grimes /*-
2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro F. Giffuni *
458f0484fSRodney W. Grimes * Copyright (c) 1990, 1993
558f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved.
658f0484fSRodney W. Grimes *
758f0484fSRodney W. Grimes * This code is derived from software contributed to Berkeley by
858f0484fSRodney W. Grimes * Mike Olson.
958f0484fSRodney W. Grimes *
1058f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without
1158f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions
1258f0484fSRodney W. Grimes * are met:
1358f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright
1458f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer.
1558f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright
1658f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the
1758f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution.
18fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors
1958f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software
2058f0484fSRodney W. Grimes * without specific prior written permission.
2158f0484fSRodney W. Grimes *
2258f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2358f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2458f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2558f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2658f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2758f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2858f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2958f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3058f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3158f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3258f0484fSRodney W. Grimes * SUCH DAMAGE.
3358f0484fSRodney W. Grimes */
3458f0484fSRodney W. Grimes
3558f0484fSRodney W. Grimes #include <sys/param.h>
3658f0484fSRodney W. Grimes #include <fcntl.h>
3758f0484fSRodney W. Grimes #include <db.h>
3858f0484fSRodney W. Grimes #include <errno.h>
3958f0484fSRodney W. Grimes #include <stdio.h>
4058f0484fSRodney W. Grimes #include <ctype.h>
4158f0484fSRodney W. Grimes #include <stdlib.h>
4258f0484fSRodney W. Grimes #include <string.h>
4358f0484fSRodney W. Grimes #include "btree.h"
4458f0484fSRodney W. Grimes
4558f0484fSRodney W. Grimes typedef struct cmd_table {
4658f0484fSRodney W. Grimes char *cmd;
4758f0484fSRodney W. Grimes int nargs;
4858f0484fSRodney W. Grimes int rconv;
49c05ac53bSDavid E. O'Brien void (*func)(DB *, char **);
5058f0484fSRodney W. Grimes char *usage, *descrip;
5158f0484fSRodney W. Grimes } cmd_table;
5258f0484fSRodney W. Grimes
5358f0484fSRodney W. Grimes int stopstop;
5458f0484fSRodney W. Grimes DB *globaldb;
5558f0484fSRodney W. Grimes
56c05ac53bSDavid E. O'Brien void append(DB *, char **);
57c05ac53bSDavid E. O'Brien void bstat(DB *, char **);
58c05ac53bSDavid E. O'Brien void cursor(DB *, char **);
59c05ac53bSDavid E. O'Brien void delcur(DB *, char **);
60c05ac53bSDavid E. O'Brien void delete(DB *, char **);
61c05ac53bSDavid E. O'Brien void dump(DB *, char **);
62c05ac53bSDavid E. O'Brien void first(DB *, char **);
63c05ac53bSDavid E. O'Brien void get(DB *, char **);
64c05ac53bSDavid E. O'Brien void help(DB *, char **);
65c05ac53bSDavid E. O'Brien void iafter(DB *, char **);
66c05ac53bSDavid E. O'Brien void ibefore(DB *, char **);
67c05ac53bSDavid E. O'Brien void icursor(DB *, char **);
68c05ac53bSDavid E. O'Brien void insert(DB *, char **);
69c05ac53bSDavid E. O'Brien void keydata(DBT *, DBT *);
70c05ac53bSDavid E. O'Brien void last(DB *, char **);
71c05ac53bSDavid E. O'Brien void list(DB *, char **);
72c05ac53bSDavid E. O'Brien void load(DB *, char **);
73c05ac53bSDavid E. O'Brien void mstat(DB *, char **);
74c05ac53bSDavid E. O'Brien void next(DB *, char **);
75c05ac53bSDavid E. O'Brien int parse(char *, char **, int);
76c05ac53bSDavid E. O'Brien void previous(DB *, char **);
77c05ac53bSDavid E. O'Brien void show(DB *, char **);
78c05ac53bSDavid E. O'Brien void usage(void);
79c05ac53bSDavid E. O'Brien void user(DB *);
8058f0484fSRodney W. Grimes
8158f0484fSRodney W. Grimes cmd_table commands[] = {
8258f0484fSRodney W. Grimes "?", 0, 0, help, "help", NULL,
8358f0484fSRodney W. Grimes "a", 2, 1, append, "append key def", "append key with data def",
8458f0484fSRodney W. Grimes "b", 0, 0, bstat, "bstat", "stat btree",
8558f0484fSRodney W. Grimes "c", 1, 1, cursor, "cursor word", "move cursor to word",
8658f0484fSRodney W. Grimes "delc", 0, 0, delcur, "delcur", "delete key the cursor references",
8758f0484fSRodney W. Grimes "dele", 1, 1, delete, "delete word", "delete word",
8858f0484fSRodney W. Grimes "d", 0, 0, dump, "dump", "dump database",
8958f0484fSRodney W. Grimes "f", 0, 0, first, "first", "move cursor to first record",
9058f0484fSRodney W. Grimes "g", 1, 1, get, "get key", "locate key",
9158f0484fSRodney W. Grimes "h", 0, 0, help, "help", "print command summary",
9258f0484fSRodney W. Grimes "ia", 2, 1, iafter, "iafter key data", "insert data after key",
9358f0484fSRodney W. Grimes "ib", 2, 1, ibefore, "ibefore key data", "insert data before key",
9458f0484fSRodney W. Grimes "ic", 2, 1, icursor, "icursor key data", "replace cursor",
9558f0484fSRodney W. Grimes "in", 2, 1, insert, "insert key def", "insert key with data def",
9658f0484fSRodney W. Grimes "la", 0, 0, last, "last", "move cursor to last record",
9758f0484fSRodney W. Grimes "li", 1, 1, list, "list file", "list to a file",
9858f0484fSRodney W. Grimes "loa", 1, 0, load, "load file", NULL,
9958f0484fSRodney W. Grimes "loc", 1, 1, get, "get key", NULL,
10058f0484fSRodney W. Grimes "m", 0, 0, mstat, "mstat", "stat memory pool",
10158f0484fSRodney W. Grimes "n", 0, 0, next, "next", "move cursor forward one record",
10258f0484fSRodney W. Grimes "p", 0, 0, previous, "previous", "move cursor back one record",
10358f0484fSRodney W. Grimes "q", 0, 0, NULL, "quit", "quit",
10458f0484fSRodney W. Grimes "sh", 1, 0, show, "show page", "dump a page",
10558f0484fSRodney W. Grimes { NULL },
10658f0484fSRodney W. Grimes };
10758f0484fSRodney W. Grimes
10858f0484fSRodney W. Grimes int recno; /* use record numbers */
10958f0484fSRodney W. Grimes char *dict = "words"; /* default dictionary */
11058f0484fSRodney W. Grimes char *progname;
11158f0484fSRodney W. Grimes
11258f0484fSRodney W. Grimes int
main(argc,argv)11358f0484fSRodney W. Grimes main(argc, argv)
11458f0484fSRodney W. Grimes int argc;
11558f0484fSRodney W. Grimes char **argv;
11658f0484fSRodney W. Grimes {
11758f0484fSRodney W. Grimes int c;
11858f0484fSRodney W. Grimes DB *db;
11958f0484fSRodney W. Grimes BTREEINFO b;
12058f0484fSRodney W. Grimes
12158f0484fSRodney W. Grimes progname = *argv;
12258f0484fSRodney W. Grimes
12358f0484fSRodney W. Grimes b.flags = 0;
12458f0484fSRodney W. Grimes b.cachesize = 0;
12558f0484fSRodney W. Grimes b.maxkeypage = 0;
12658f0484fSRodney W. Grimes b.minkeypage = 0;
12758f0484fSRodney W. Grimes b.psize = 0;
12858f0484fSRodney W. Grimes b.compare = NULL;
12958f0484fSRodney W. Grimes b.prefix = NULL;
13058f0484fSRodney W. Grimes b.lorder = 0;
13158f0484fSRodney W. Grimes
1328f9872ccSKevin Lo while ((c = getopt(argc, argv, "bc:di:lp:ru")) != -1) {
13358f0484fSRodney W. Grimes switch (c) {
13458f0484fSRodney W. Grimes case 'b':
13558f0484fSRodney W. Grimes b.lorder = BIG_ENDIAN;
13658f0484fSRodney W. Grimes break;
13758f0484fSRodney W. Grimes case 'c':
13858f0484fSRodney W. Grimes b.cachesize = atoi(optarg);
13958f0484fSRodney W. Grimes break;
14058f0484fSRodney W. Grimes case 'd':
14158f0484fSRodney W. Grimes b.flags |= R_DUP;
14258f0484fSRodney W. Grimes break;
14358f0484fSRodney W. Grimes case 'i':
14458f0484fSRodney W. Grimes dict = optarg;
14558f0484fSRodney W. Grimes break;
14658f0484fSRodney W. Grimes case 'l':
14758f0484fSRodney W. Grimes b.lorder = LITTLE_ENDIAN;
14858f0484fSRodney W. Grimes break;
14958f0484fSRodney W. Grimes case 'p':
15058f0484fSRodney W. Grimes b.psize = atoi(optarg);
15158f0484fSRodney W. Grimes break;
15258f0484fSRodney W. Grimes case 'r':
15358f0484fSRodney W. Grimes recno = 1;
15458f0484fSRodney W. Grimes break;
15558f0484fSRodney W. Grimes case 'u':
15658f0484fSRodney W. Grimes b.flags = 0;
15758f0484fSRodney W. Grimes break;
15858f0484fSRodney W. Grimes default:
15958f0484fSRodney W. Grimes usage();
16058f0484fSRodney W. Grimes }
16158f0484fSRodney W. Grimes }
16258f0484fSRodney W. Grimes argc -= optind;
16358f0484fSRodney W. Grimes argv += optind;
16458f0484fSRodney W. Grimes
16558f0484fSRodney W. Grimes if (recno)
16658f0484fSRodney W. Grimes db = dbopen(*argv == NULL ? NULL : *argv, O_RDWR,
16758f0484fSRodney W. Grimes 0, DB_RECNO, NULL);
16858f0484fSRodney W. Grimes else
16958f0484fSRodney W. Grimes db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|O_RDWR,
17058f0484fSRodney W. Grimes 0600, DB_BTREE, &b);
17158f0484fSRodney W. Grimes
17258f0484fSRodney W. Grimes if (db == NULL) {
17358f0484fSRodney W. Grimes (void)fprintf(stderr, "dbopen: %s\n", strerror(errno));
17458f0484fSRodney W. Grimes exit(1);
17558f0484fSRodney W. Grimes }
17658f0484fSRodney W. Grimes globaldb = db;
17758f0484fSRodney W. Grimes user(db);
17858f0484fSRodney W. Grimes exit(0);
17958f0484fSRodney W. Grimes /* NOTREACHED */
18058f0484fSRodney W. Grimes }
18158f0484fSRodney W. Grimes
18258f0484fSRodney W. Grimes void
user(db)18358f0484fSRodney W. Grimes user(db)
18458f0484fSRodney W. Grimes DB *db;
18558f0484fSRodney W. Grimes {
18658f0484fSRodney W. Grimes FILE *ifp;
18758f0484fSRodney W. Grimes int argc, i, last;
18858f0484fSRodney W. Grimes char *lbuf, *argv[4], buf[512];
18958f0484fSRodney W. Grimes
19058f0484fSRodney W. Grimes if ((ifp = fopen("/dev/tty", "r")) == NULL) {
19158f0484fSRodney W. Grimes (void)fprintf(stderr,
19258f0484fSRodney W. Grimes "/dev/tty: %s\n", strerror(errno));
19358f0484fSRodney W. Grimes exit(1);
19458f0484fSRodney W. Grimes }
19558f0484fSRodney W. Grimes for (last = 0;;) {
19658f0484fSRodney W. Grimes (void)printf("> ");
19758f0484fSRodney W. Grimes (void)fflush(stdout);
19858f0484fSRodney W. Grimes if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL)
19958f0484fSRodney W. Grimes break;
20058f0484fSRodney W. Grimes if (lbuf[0] == '\n') {
20158f0484fSRodney W. Grimes i = last;
20258f0484fSRodney W. Grimes goto uselast;
20358f0484fSRodney W. Grimes }
20458f0484fSRodney W. Grimes lbuf[strlen(lbuf) - 1] = '\0';
20558f0484fSRodney W. Grimes
20658f0484fSRodney W. Grimes if (lbuf[0] == 'q')
20758f0484fSRodney W. Grimes break;
20858f0484fSRodney W. Grimes
20958f0484fSRodney W. Grimes argc = parse(lbuf, &argv[0], 3);
21058f0484fSRodney W. Grimes if (argc == 0)
21158f0484fSRodney W. Grimes continue;
21258f0484fSRodney W. Grimes
21358f0484fSRodney W. Grimes for (i = 0; commands[i].cmd != NULL; i++)
21458f0484fSRodney W. Grimes if (strncmp(commands[i].cmd, argv[0],
21558f0484fSRodney W. Grimes strlen(commands[i].cmd)) == 0)
21658f0484fSRodney W. Grimes break;
21758f0484fSRodney W. Grimes
21858f0484fSRodney W. Grimes if (commands[i].cmd == NULL) {
21958f0484fSRodney W. Grimes (void)fprintf(stderr,
22058f0484fSRodney W. Grimes "%s: command unknown ('help' for help)\n", lbuf);
22158f0484fSRodney W. Grimes continue;
22258f0484fSRodney W. Grimes }
22358f0484fSRodney W. Grimes
22458f0484fSRodney W. Grimes if (commands[i].nargs != argc - 1) {
22558f0484fSRodney W. Grimes (void)fprintf(stderr, "usage: %s\n", commands[i].usage);
22658f0484fSRodney W. Grimes continue;
22758f0484fSRodney W. Grimes }
22858f0484fSRodney W. Grimes
22958f0484fSRodney W. Grimes if (recno && commands[i].rconv) {
23058f0484fSRodney W. Grimes static recno_t nlong;
23158f0484fSRodney W. Grimes nlong = atoi(argv[1]);
23258f0484fSRodney W. Grimes argv[1] = (char *)&nlong;
23358f0484fSRodney W. Grimes }
23458f0484fSRodney W. Grimes uselast: last = i;
23558f0484fSRodney W. Grimes (*commands[i].func)(db, argv);
23658f0484fSRodney W. Grimes }
23758f0484fSRodney W. Grimes if ((db->sync)(db) == RET_ERROR)
23858f0484fSRodney W. Grimes perror("dbsync");
23958f0484fSRodney W. Grimes else if ((db->close)(db) == RET_ERROR)
24058f0484fSRodney W. Grimes perror("dbclose");
24158f0484fSRodney W. Grimes }
24258f0484fSRodney W. Grimes
24358f0484fSRodney W. Grimes int
parse(lbuf,argv,maxargc)24458f0484fSRodney W. Grimes parse(lbuf, argv, maxargc)
24558f0484fSRodney W. Grimes char *lbuf, **argv;
24658f0484fSRodney W. Grimes int maxargc;
24758f0484fSRodney W. Grimes {
24858f0484fSRodney W. Grimes int argc = 0;
24958f0484fSRodney W. Grimes char *c;
25058f0484fSRodney W. Grimes
25158f0484fSRodney W. Grimes c = lbuf;
25258f0484fSRodney W. Grimes while (isspace(*c))
25358f0484fSRodney W. Grimes c++;
25458f0484fSRodney W. Grimes while (*c != '\0' && argc < maxargc) {
25558f0484fSRodney W. Grimes *argv++ = c;
25658f0484fSRodney W. Grimes argc++;
25758f0484fSRodney W. Grimes while (!isspace(*c) && *c != '\0') {
25858f0484fSRodney W. Grimes c++;
25958f0484fSRodney W. Grimes }
26058f0484fSRodney W. Grimes while (isspace(*c))
26158f0484fSRodney W. Grimes *c++ = '\0';
26258f0484fSRodney W. Grimes }
26358f0484fSRodney W. Grimes return (argc);
26458f0484fSRodney W. Grimes }
26558f0484fSRodney W. Grimes
26658f0484fSRodney W. Grimes void
append(db,argv)26758f0484fSRodney W. Grimes append(db, argv)
26858f0484fSRodney W. Grimes DB *db;
26958f0484fSRodney W. Grimes char **argv;
27058f0484fSRodney W. Grimes {
27158f0484fSRodney W. Grimes DBT key, data;
27258f0484fSRodney W. Grimes int status;
27358f0484fSRodney W. Grimes
27458f0484fSRodney W. Grimes if (!recno) {
27558f0484fSRodney W. Grimes (void)fprintf(stderr,
27658f0484fSRodney W. Grimes "append only available for recno db's.\n");
27758f0484fSRodney W. Grimes return;
27858f0484fSRodney W. Grimes }
27958f0484fSRodney W. Grimes key.data = argv[1];
28058f0484fSRodney W. Grimes key.size = sizeof(recno_t);
28158f0484fSRodney W. Grimes data.data = argv[2];
28258f0484fSRodney W. Grimes data.size = strlen(data.data);
28358f0484fSRodney W. Grimes status = (db->put)(db, &key, &data, R_APPEND);
28458f0484fSRodney W. Grimes switch (status) {
28558f0484fSRodney W. Grimes case RET_ERROR:
28658f0484fSRodney W. Grimes perror("append/put");
28758f0484fSRodney W. Grimes break;
28858f0484fSRodney W. Grimes case RET_SPECIAL:
28958f0484fSRodney W. Grimes (void)printf("%s (duplicate key)\n", argv[1]);
29058f0484fSRodney W. Grimes break;
29158f0484fSRodney W. Grimes case RET_SUCCESS:
29258f0484fSRodney W. Grimes break;
29358f0484fSRodney W. Grimes }
29458f0484fSRodney W. Grimes }
29558f0484fSRodney W. Grimes
29658f0484fSRodney W. Grimes void
cursor(db,argv)29758f0484fSRodney W. Grimes cursor(db, argv)
29858f0484fSRodney W. Grimes DB *db;
29958f0484fSRodney W. Grimes char **argv;
30058f0484fSRodney W. Grimes {
30158f0484fSRodney W. Grimes DBT data, key;
30258f0484fSRodney W. Grimes int status;
30358f0484fSRodney W. Grimes
30458f0484fSRodney W. Grimes key.data = argv[1];
30558f0484fSRodney W. Grimes if (recno)
30658f0484fSRodney W. Grimes key.size = sizeof(recno_t);
30758f0484fSRodney W. Grimes else
30858f0484fSRodney W. Grimes key.size = strlen(argv[1]) + 1;
30958f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_CURSOR);
31058f0484fSRodney W. Grimes switch (status) {
31158f0484fSRodney W. Grimes case RET_ERROR:
31258f0484fSRodney W. Grimes perror("cursor/seq");
31358f0484fSRodney W. Grimes break;
31458f0484fSRodney W. Grimes case RET_SPECIAL:
31558f0484fSRodney W. Grimes (void)printf("key not found\n");
31658f0484fSRodney W. Grimes break;
31758f0484fSRodney W. Grimes case RET_SUCCESS:
31858f0484fSRodney W. Grimes keydata(&key, &data);
31958f0484fSRodney W. Grimes break;
32058f0484fSRodney W. Grimes }
32158f0484fSRodney W. Grimes }
32258f0484fSRodney W. Grimes
32358f0484fSRodney W. Grimes void
delcur(db,argv)32458f0484fSRodney W. Grimes delcur(db, argv)
32558f0484fSRodney W. Grimes DB *db;
32658f0484fSRodney W. Grimes char **argv;
32758f0484fSRodney W. Grimes {
32858f0484fSRodney W. Grimes int status;
32958f0484fSRodney W. Grimes
33058f0484fSRodney W. Grimes status = (*db->del)(db, NULL, R_CURSOR);
33158f0484fSRodney W. Grimes
33258f0484fSRodney W. Grimes if (status == RET_ERROR)
33358f0484fSRodney W. Grimes perror("delcur/del");
33458f0484fSRodney W. Grimes }
33558f0484fSRodney W. Grimes
33658f0484fSRodney W. Grimes void
delete(db,argv)33758f0484fSRodney W. Grimes delete(db, argv)
33858f0484fSRodney W. Grimes DB *db;
33958f0484fSRodney W. Grimes char **argv;
34058f0484fSRodney W. Grimes {
34158f0484fSRodney W. Grimes DBT key;
34258f0484fSRodney W. Grimes int status;
34358f0484fSRodney W. Grimes
34458f0484fSRodney W. Grimes key.data = argv[1];
34558f0484fSRodney W. Grimes if (recno)
34658f0484fSRodney W. Grimes key.size = sizeof(recno_t);
34758f0484fSRodney W. Grimes else
34858f0484fSRodney W. Grimes key.size = strlen(argv[1]) + 1;
34958f0484fSRodney W. Grimes
35058f0484fSRodney W. Grimes status = (*db->del)(db, &key, 0);
35158f0484fSRodney W. Grimes switch (status) {
35258f0484fSRodney W. Grimes case RET_ERROR:
35358f0484fSRodney W. Grimes perror("delete/del");
35458f0484fSRodney W. Grimes break;
35558f0484fSRodney W. Grimes case RET_SPECIAL:
35658f0484fSRodney W. Grimes (void)printf("key not found\n");
35758f0484fSRodney W. Grimes break;
35858f0484fSRodney W. Grimes case RET_SUCCESS:
35958f0484fSRodney W. Grimes break;
36058f0484fSRodney W. Grimes }
36158f0484fSRodney W. Grimes }
36258f0484fSRodney W. Grimes
36358f0484fSRodney W. Grimes void
dump(db,argv)36458f0484fSRodney W. Grimes dump(db, argv)
36558f0484fSRodney W. Grimes DB *db;
36658f0484fSRodney W. Grimes char **argv;
36758f0484fSRodney W. Grimes {
36858f0484fSRodney W. Grimes __bt_dump(db);
36958f0484fSRodney W. Grimes }
37058f0484fSRodney W. Grimes
37158f0484fSRodney W. Grimes void
first(db,argv)37258f0484fSRodney W. Grimes first(db, argv)
37358f0484fSRodney W. Grimes DB *db;
37458f0484fSRodney W. Grimes char **argv;
37558f0484fSRodney W. Grimes {
37658f0484fSRodney W. Grimes DBT data, key;
37758f0484fSRodney W. Grimes int status;
37858f0484fSRodney W. Grimes
37958f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_FIRST);
38058f0484fSRodney W. Grimes
38158f0484fSRodney W. Grimes switch (status) {
38258f0484fSRodney W. Grimes case RET_ERROR:
38358f0484fSRodney W. Grimes perror("first/seq");
38458f0484fSRodney W. Grimes break;
38558f0484fSRodney W. Grimes case RET_SPECIAL:
38658f0484fSRodney W. Grimes (void)printf("no more keys\n");
38758f0484fSRodney W. Grimes break;
38858f0484fSRodney W. Grimes case RET_SUCCESS:
38958f0484fSRodney W. Grimes keydata(&key, &data);
39058f0484fSRodney W. Grimes break;
39158f0484fSRodney W. Grimes }
39258f0484fSRodney W. Grimes }
39358f0484fSRodney W. Grimes
39458f0484fSRodney W. Grimes void
get(db,argv)39558f0484fSRodney W. Grimes get(db, argv)
39658f0484fSRodney W. Grimes DB *db;
39758f0484fSRodney W. Grimes char **argv;
39858f0484fSRodney W. Grimes {
39958f0484fSRodney W. Grimes DBT data, key;
40058f0484fSRodney W. Grimes int status;
40158f0484fSRodney W. Grimes
40258f0484fSRodney W. Grimes key.data = argv[1];
40358f0484fSRodney W. Grimes if (recno)
40458f0484fSRodney W. Grimes key.size = sizeof(recno_t);
40558f0484fSRodney W. Grimes else
40658f0484fSRodney W. Grimes key.size = strlen(argv[1]) + 1;
40758f0484fSRodney W. Grimes
40858f0484fSRodney W. Grimes status = (*db->get)(db, &key, &data, 0);
40958f0484fSRodney W. Grimes
41058f0484fSRodney W. Grimes switch (status) {
41158f0484fSRodney W. Grimes case RET_ERROR:
41258f0484fSRodney W. Grimes perror("get/get");
41358f0484fSRodney W. Grimes break;
41458f0484fSRodney W. Grimes case RET_SPECIAL:
41558f0484fSRodney W. Grimes (void)printf("key not found\n");
41658f0484fSRodney W. Grimes break;
41758f0484fSRodney W. Grimes case RET_SUCCESS:
41858f0484fSRodney W. Grimes keydata(&key, &data);
41958f0484fSRodney W. Grimes break;
42058f0484fSRodney W. Grimes }
42158f0484fSRodney W. Grimes }
42258f0484fSRodney W. Grimes
42358f0484fSRodney W. Grimes void
help(db,argv)42458f0484fSRodney W. Grimes help(db, argv)
42558f0484fSRodney W. Grimes DB *db;
42658f0484fSRodney W. Grimes char **argv;
42758f0484fSRodney W. Grimes {
42858f0484fSRodney W. Grimes int i;
42958f0484fSRodney W. Grimes
43058f0484fSRodney W. Grimes for (i = 0; commands[i].cmd; i++)
43158f0484fSRodney W. Grimes if (commands[i].descrip)
43258f0484fSRodney W. Grimes (void)printf("%s: %s\n",
43358f0484fSRodney W. Grimes commands[i].usage, commands[i].descrip);
43458f0484fSRodney W. Grimes }
43558f0484fSRodney W. Grimes
43658f0484fSRodney W. Grimes void
iafter(db,argv)43758f0484fSRodney W. Grimes iafter(db, argv)
43858f0484fSRodney W. Grimes DB *db;
43958f0484fSRodney W. Grimes char **argv;
44058f0484fSRodney W. Grimes {
44158f0484fSRodney W. Grimes DBT key, data;
44258f0484fSRodney W. Grimes int status;
44358f0484fSRodney W. Grimes
44458f0484fSRodney W. Grimes if (!recno) {
44558f0484fSRodney W. Grimes (void)fprintf(stderr,
44658f0484fSRodney W. Grimes "iafter only available for recno db's.\n");
44758f0484fSRodney W. Grimes return;
44858f0484fSRodney W. Grimes }
44958f0484fSRodney W. Grimes key.data = argv[1];
45058f0484fSRodney W. Grimes key.size = sizeof(recno_t);
45158f0484fSRodney W. Grimes data.data = argv[2];
45258f0484fSRodney W. Grimes data.size = strlen(data.data);
45358f0484fSRodney W. Grimes status = (db->put)(db, &key, &data, R_IAFTER);
45458f0484fSRodney W. Grimes switch (status) {
45558f0484fSRodney W. Grimes case RET_ERROR:
45658f0484fSRodney W. Grimes perror("iafter/put");
45758f0484fSRodney W. Grimes break;
45858f0484fSRodney W. Grimes case RET_SPECIAL:
45958f0484fSRodney W. Grimes (void)printf("%s (duplicate key)\n", argv[1]);
46058f0484fSRodney W. Grimes break;
46158f0484fSRodney W. Grimes case RET_SUCCESS:
46258f0484fSRodney W. Grimes break;
46358f0484fSRodney W. Grimes }
46458f0484fSRodney W. Grimes }
46558f0484fSRodney W. Grimes
46658f0484fSRodney W. Grimes void
ibefore(db,argv)46758f0484fSRodney W. Grimes ibefore(db, argv)
46858f0484fSRodney W. Grimes DB *db;
46958f0484fSRodney W. Grimes char **argv;
47058f0484fSRodney W. Grimes {
47158f0484fSRodney W. Grimes DBT key, data;
47258f0484fSRodney W. Grimes int status;
47358f0484fSRodney W. Grimes
47458f0484fSRodney W. Grimes if (!recno) {
47558f0484fSRodney W. Grimes (void)fprintf(stderr,
47658f0484fSRodney W. Grimes "ibefore only available for recno db's.\n");
47758f0484fSRodney W. Grimes return;
47858f0484fSRodney W. Grimes }
47958f0484fSRodney W. Grimes key.data = argv[1];
48058f0484fSRodney W. Grimes key.size = sizeof(recno_t);
48158f0484fSRodney W. Grimes data.data = argv[2];
48258f0484fSRodney W. Grimes data.size = strlen(data.data);
48358f0484fSRodney W. Grimes status = (db->put)(db, &key, &data, R_IBEFORE);
48458f0484fSRodney W. Grimes switch (status) {
48558f0484fSRodney W. Grimes case RET_ERROR:
48658f0484fSRodney W. Grimes perror("ibefore/put");
48758f0484fSRodney W. Grimes break;
48858f0484fSRodney W. Grimes case RET_SPECIAL:
48958f0484fSRodney W. Grimes (void)printf("%s (duplicate key)\n", argv[1]);
49058f0484fSRodney W. Grimes break;
49158f0484fSRodney W. Grimes case RET_SUCCESS:
49258f0484fSRodney W. Grimes break;
49358f0484fSRodney W. Grimes }
49458f0484fSRodney W. Grimes }
49558f0484fSRodney W. Grimes
49658f0484fSRodney W. Grimes void
icursor(db,argv)49758f0484fSRodney W. Grimes icursor(db, argv)
49858f0484fSRodney W. Grimes DB *db;
49958f0484fSRodney W. Grimes char **argv;
50058f0484fSRodney W. Grimes {
50158f0484fSRodney W. Grimes int status;
50258f0484fSRodney W. Grimes DBT data, key;
50358f0484fSRodney W. Grimes
50458f0484fSRodney W. Grimes key.data = argv[1];
50558f0484fSRodney W. Grimes if (recno)
50658f0484fSRodney W. Grimes key.size = sizeof(recno_t);
50758f0484fSRodney W. Grimes else
50858f0484fSRodney W. Grimes key.size = strlen(argv[1]) + 1;
50958f0484fSRodney W. Grimes data.data = argv[2];
51058f0484fSRodney W. Grimes data.size = strlen(argv[2]) + 1;
51158f0484fSRodney W. Grimes
51258f0484fSRodney W. Grimes status = (*db->put)(db, &key, &data, R_CURSOR);
51358f0484fSRodney W. Grimes switch (status) {
51458f0484fSRodney W. Grimes case RET_ERROR:
51558f0484fSRodney W. Grimes perror("icursor/put");
51658f0484fSRodney W. Grimes break;
51758f0484fSRodney W. Grimes case RET_SPECIAL:
51858f0484fSRodney W. Grimes (void)printf("%s (duplicate key)\n", argv[1]);
51958f0484fSRodney W. Grimes break;
52058f0484fSRodney W. Grimes case RET_SUCCESS:
52158f0484fSRodney W. Grimes break;
52258f0484fSRodney W. Grimes }
52358f0484fSRodney W. Grimes }
52458f0484fSRodney W. Grimes
52558f0484fSRodney W. Grimes void
insert(db,argv)52658f0484fSRodney W. Grimes insert(db, argv)
52758f0484fSRodney W. Grimes DB *db;
52858f0484fSRodney W. Grimes char **argv;
52958f0484fSRodney W. Grimes {
53058f0484fSRodney W. Grimes int status;
53158f0484fSRodney W. Grimes DBT data, key;
53258f0484fSRodney W. Grimes
53358f0484fSRodney W. Grimes key.data = argv[1];
53458f0484fSRodney W. Grimes if (recno)
53558f0484fSRodney W. Grimes key.size = sizeof(recno_t);
53658f0484fSRodney W. Grimes else
53758f0484fSRodney W. Grimes key.size = strlen(argv[1]) + 1;
53858f0484fSRodney W. Grimes data.data = argv[2];
53958f0484fSRodney W. Grimes data.size = strlen(argv[2]) + 1;
54058f0484fSRodney W. Grimes
54158f0484fSRodney W. Grimes status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
54258f0484fSRodney W. Grimes switch (status) {
54358f0484fSRodney W. Grimes case RET_ERROR:
54458f0484fSRodney W. Grimes perror("insert/put");
54558f0484fSRodney W. Grimes break;
54658f0484fSRodney W. Grimes case RET_SPECIAL:
54758f0484fSRodney W. Grimes (void)printf("%s (duplicate key)\n", argv[1]);
54858f0484fSRodney W. Grimes break;
54958f0484fSRodney W. Grimes case RET_SUCCESS:
55058f0484fSRodney W. Grimes break;
55158f0484fSRodney W. Grimes }
55258f0484fSRodney W. Grimes }
55358f0484fSRodney W. Grimes
55458f0484fSRodney W. Grimes void
last(db,argv)55558f0484fSRodney W. Grimes last(db, argv)
55658f0484fSRodney W. Grimes DB *db;
55758f0484fSRodney W. Grimes char **argv;
55858f0484fSRodney W. Grimes {
55958f0484fSRodney W. Grimes DBT data, key;
56058f0484fSRodney W. Grimes int status;
56158f0484fSRodney W. Grimes
56258f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_LAST);
56358f0484fSRodney W. Grimes
56458f0484fSRodney W. Grimes switch (status) {
56558f0484fSRodney W. Grimes case RET_ERROR:
56658f0484fSRodney W. Grimes perror("last/seq");
56758f0484fSRodney W. Grimes break;
56858f0484fSRodney W. Grimes case RET_SPECIAL:
56958f0484fSRodney W. Grimes (void)printf("no more keys\n");
57058f0484fSRodney W. Grimes break;
57158f0484fSRodney W. Grimes case RET_SUCCESS:
57258f0484fSRodney W. Grimes keydata(&key, &data);
57358f0484fSRodney W. Grimes break;
57458f0484fSRodney W. Grimes }
57558f0484fSRodney W. Grimes }
57658f0484fSRodney W. Grimes
57758f0484fSRodney W. Grimes void
list(db,argv)57858f0484fSRodney W. Grimes list(db, argv)
57958f0484fSRodney W. Grimes DB *db;
58058f0484fSRodney W. Grimes char **argv;
58158f0484fSRodney W. Grimes {
58258f0484fSRodney W. Grimes DBT data, key;
58358f0484fSRodney W. Grimes FILE *fp;
58458f0484fSRodney W. Grimes int status;
58558f0484fSRodney W. Grimes
58658f0484fSRodney W. Grimes if ((fp = fopen(argv[1], "w")) == NULL) {
58758f0484fSRodney W. Grimes (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
58858f0484fSRodney W. Grimes return;
58958f0484fSRodney W. Grimes }
59058f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_FIRST);
59158f0484fSRodney W. Grimes while (status == RET_SUCCESS) {
59258f0484fSRodney W. Grimes (void)fprintf(fp, "%s\n", key.data);
59358f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_NEXT);
59458f0484fSRodney W. Grimes }
59558f0484fSRodney W. Grimes if (status == RET_ERROR)
59658f0484fSRodney W. Grimes perror("list/seq");
59758f0484fSRodney W. Grimes }
59858f0484fSRodney W. Grimes
59958f0484fSRodney W. Grimes DB *BUGdb;
60058f0484fSRodney W. Grimes void
load(db,argv)60158f0484fSRodney W. Grimes load(db, argv)
60258f0484fSRodney W. Grimes DB *db;
60358f0484fSRodney W. Grimes char **argv;
60458f0484fSRodney W. Grimes {
6058fb3f3f6SDavid E. O'Brien char *p, *t;
60658f0484fSRodney W. Grimes FILE *fp;
60758f0484fSRodney W. Grimes DBT data, key;
60858f0484fSRodney W. Grimes recno_t cnt;
60958f0484fSRodney W. Grimes size_t len;
61058f0484fSRodney W. Grimes int status;
61158f0484fSRodney W. Grimes char *lp, buf[16 * 1024];
61258f0484fSRodney W. Grimes
61358f0484fSRodney W. Grimes BUGdb = db;
61458f0484fSRodney W. Grimes if ((fp = fopen(argv[1], "r")) == NULL) {
61558f0484fSRodney W. Grimes (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
61658f0484fSRodney W. Grimes return;
61758f0484fSRodney W. Grimes }
61858f0484fSRodney W. Grimes (void)printf("loading %s...\n", argv[1]);
61958f0484fSRodney W. Grimes
62058f0484fSRodney W. Grimes for (cnt = 1; (lp = fgetline(fp, &len)) != NULL; ++cnt) {
62158f0484fSRodney W. Grimes if (recno) {
62258f0484fSRodney W. Grimes key.data = &cnt;
62358f0484fSRodney W. Grimes key.size = sizeof(recno_t);
62458f0484fSRodney W. Grimes data.data = lp;
62558f0484fSRodney W. Grimes data.size = len + 1;
62658f0484fSRodney W. Grimes } else {
62758f0484fSRodney W. Grimes key.data = lp;
62858f0484fSRodney W. Grimes key.size = len + 1;
62958f0484fSRodney W. Grimes for (p = lp + len - 1, t = buf; p >= lp; *t++ = *p--);
63058f0484fSRodney W. Grimes *t = '\0';
63158f0484fSRodney W. Grimes data.data = buf;
63258f0484fSRodney W. Grimes data.size = len + 1;
63358f0484fSRodney W. Grimes }
63458f0484fSRodney W. Grimes
63558f0484fSRodney W. Grimes status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
63658f0484fSRodney W. Grimes switch (status) {
63758f0484fSRodney W. Grimes case RET_ERROR:
63858f0484fSRodney W. Grimes perror("load/put");
63958f0484fSRodney W. Grimes exit(1);
64058f0484fSRodney W. Grimes case RET_SPECIAL:
64158f0484fSRodney W. Grimes if (recno)
64258f0484fSRodney W. Grimes (void)fprintf(stderr,
64358f0484fSRodney W. Grimes "duplicate: %ld {%s}\n", cnt, data.data);
64458f0484fSRodney W. Grimes else
64558f0484fSRodney W. Grimes (void)fprintf(stderr,
64658f0484fSRodney W. Grimes "duplicate: %ld {%s}\n", cnt, key.data);
64758f0484fSRodney W. Grimes exit(1);
64858f0484fSRodney W. Grimes case RET_SUCCESS:
64958f0484fSRodney W. Grimes break;
65058f0484fSRodney W. Grimes }
65158f0484fSRodney W. Grimes }
65258f0484fSRodney W. Grimes (void)fclose(fp);
65358f0484fSRodney W. Grimes }
65458f0484fSRodney W. Grimes
65558f0484fSRodney W. Grimes void
next(db,argv)65658f0484fSRodney W. Grimes next(db, argv)
65758f0484fSRodney W. Grimes DB *db;
65858f0484fSRodney W. Grimes char **argv;
65958f0484fSRodney W. Grimes {
66058f0484fSRodney W. Grimes DBT data, key;
66158f0484fSRodney W. Grimes int status;
66258f0484fSRodney W. Grimes
66358f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_NEXT);
66458f0484fSRodney W. Grimes
66558f0484fSRodney W. Grimes switch (status) {
66658f0484fSRodney W. Grimes case RET_ERROR:
66758f0484fSRodney W. Grimes perror("next/seq");
66858f0484fSRodney W. Grimes break;
66958f0484fSRodney W. Grimes case RET_SPECIAL:
67058f0484fSRodney W. Grimes (void)printf("no more keys\n");
67158f0484fSRodney W. Grimes break;
67258f0484fSRodney W. Grimes case RET_SUCCESS:
67358f0484fSRodney W. Grimes keydata(&key, &data);
67458f0484fSRodney W. Grimes break;
67558f0484fSRodney W. Grimes }
67658f0484fSRodney W. Grimes }
67758f0484fSRodney W. Grimes
67858f0484fSRodney W. Grimes void
previous(db,argv)67958f0484fSRodney W. Grimes previous(db, argv)
68058f0484fSRodney W. Grimes DB *db;
68158f0484fSRodney W. Grimes char **argv;
68258f0484fSRodney W. Grimes {
68358f0484fSRodney W. Grimes DBT data, key;
68458f0484fSRodney W. Grimes int status;
68558f0484fSRodney W. Grimes
68658f0484fSRodney W. Grimes status = (*db->seq)(db, &key, &data, R_PREV);
68758f0484fSRodney W. Grimes
68858f0484fSRodney W. Grimes switch (status) {
68958f0484fSRodney W. Grimes case RET_ERROR:
69058f0484fSRodney W. Grimes perror("previous/seq");
69158f0484fSRodney W. Grimes break;
69258f0484fSRodney W. Grimes case RET_SPECIAL:
69358f0484fSRodney W. Grimes (void)printf("no more keys\n");
69458f0484fSRodney W. Grimes break;
69558f0484fSRodney W. Grimes case RET_SUCCESS:
69658f0484fSRodney W. Grimes keydata(&key, &data);
69758f0484fSRodney W. Grimes break;
69858f0484fSRodney W. Grimes }
69958f0484fSRodney W. Grimes }
70058f0484fSRodney W. Grimes
70158f0484fSRodney W. Grimes void
show(db,argv)70258f0484fSRodney W. Grimes show(db, argv)
70358f0484fSRodney W. Grimes DB *db;
70458f0484fSRodney W. Grimes char **argv;
70558f0484fSRodney W. Grimes {
70658f0484fSRodney W. Grimes BTREE *t;
70758f0484fSRodney W. Grimes PAGE *h;
70858f0484fSRodney W. Grimes pgno_t pg;
70958f0484fSRodney W. Grimes
71058f0484fSRodney W. Grimes pg = atoi(argv[1]);
71158f0484fSRodney W. Grimes t = db->internal;
71258f0484fSRodney W. Grimes if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) {
71358f0484fSRodney W. Grimes (void)printf("getpage of %ld failed\n", pg);
71458f0484fSRodney W. Grimes return;
71558f0484fSRodney W. Grimes }
71658f0484fSRodney W. Grimes if (pg == 0)
71758f0484fSRodney W. Grimes __bt_dmpage(h);
71858f0484fSRodney W. Grimes else
71958f0484fSRodney W. Grimes __bt_dpage(h);
72058f0484fSRodney W. Grimes mpool_put(t->bt_mp, h, 0);
72158f0484fSRodney W. Grimes }
72258f0484fSRodney W. Grimes
72358f0484fSRodney W. Grimes void
bstat(db,argv)72458f0484fSRodney W. Grimes bstat(db, argv)
72558f0484fSRodney W. Grimes DB *db;
72658f0484fSRodney W. Grimes char **argv;
72758f0484fSRodney W. Grimes {
72858f0484fSRodney W. Grimes (void)printf("BTREE\n");
72958f0484fSRodney W. Grimes __bt_stat(db);
73058f0484fSRodney W. Grimes }
73158f0484fSRodney W. Grimes
73258f0484fSRodney W. Grimes void
mstat(db,argv)73358f0484fSRodney W. Grimes mstat(db, argv)
73458f0484fSRodney W. Grimes DB *db;
73558f0484fSRodney W. Grimes char **argv;
73658f0484fSRodney W. Grimes {
73758f0484fSRodney W. Grimes (void)printf("MPOOL\n");
73858f0484fSRodney W. Grimes mpool_stat(((BTREE *)db->internal)->bt_mp);
73958f0484fSRodney W. Grimes }
74058f0484fSRodney W. Grimes
74158f0484fSRodney W. Grimes void
keydata(key,data)74258f0484fSRodney W. Grimes keydata(key, data)
74358f0484fSRodney W. Grimes DBT *key, *data;
74458f0484fSRodney W. Grimes {
74558f0484fSRodney W. Grimes if (!recno && key->size > 0)
74658f0484fSRodney W. Grimes (void)printf("%s/", key->data);
74758f0484fSRodney W. Grimes if (data->size > 0)
74858f0484fSRodney W. Grimes (void)printf("%s", data->data);
74958f0484fSRodney W. Grimes (void)printf("\n");
75058f0484fSRodney W. Grimes }
75158f0484fSRodney W. Grimes
75258f0484fSRodney W. Grimes void
usage()75358f0484fSRodney W. Grimes usage()
75458f0484fSRodney W. Grimes {
75558f0484fSRodney W. Grimes (void)fprintf(stderr,
75658f0484fSRodney W. Grimes "usage: %s [-bdlu] [-c cache] [-i file] [-p page] [file]\n",
75758f0484fSRodney W. Grimes progname);
75858f0484fSRodney W. Grimes exit (1);
75958f0484fSRodney W. Grimes }
760