summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/db/dbtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/regress/lib/libc/db/dbtest.c')
-rw-r--r--src/regress/lib/libc/db/dbtest.c213
1 files changed, 150 insertions, 63 deletions
diff --git a/src/regress/lib/libc/db/dbtest.c b/src/regress/lib/libc/db/dbtest.c
index 1fcf09af97..65587a6fcb 100644
--- a/src/regress/lib/libc/db/dbtest.c
+++ b/src/regress/lib/libc/db/dbtest.c
@@ -1,7 +1,7 @@
1/* $NetBSD: dbtest.c,v 1.7 1995/04/20 22:39:22 cgd Exp $ */ 1/* $NetBSD: dbtest.c,v 1.8 1996/05/03 21:57:48 cgd Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 1992, 1993 4 * Copyright (c) 1992, 1993, 1994
5 * The Regents of the University of California. All rights reserved. 5 * The Regents of the University of California. All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
@@ -35,15 +35,15 @@
35 35
36#ifndef lint 36#ifndef lint
37static char copyright[] = 37static char copyright[] =
38"@(#) Copyright (c) 1992, 1993\n\ 38"@(#) Copyright (c) 1992, 1993, 1994\n\
39 The Regents of the University of California. All rights reserved.\n"; 39 The Regents of the University of California. All rights reserved.\n";
40#endif /* not lint */ 40#endif /* not lint */
41 41
42#ifndef lint 42#ifndef lint
43#if 0 43#if 0
44static char sccsid[] = "@(#)dbtest.c 8.8 (Berkeley) 2/21/94"; 44static char sccsid[] = "@(#)dbtest.c 8.17 (Berkeley) 9/1/94";
45#else 45#else
46static char rcsid[] = "$NetBSD: dbtest.c,v 1.7 1995/04/20 22:39:22 cgd Exp $"; 46static char rcsid[] = "$NetBSD: dbtest.c,v 1.8 1996/05/03 21:57:48 cgd Exp $";
47#endif 47#endif
48#endif /* not lint */ 48#endif /* not lint */
49 49
@@ -71,6 +71,8 @@ void get __P((DB *, DBT *));
71void getdata __P((DB *, DBT *, DBT *)); 71void getdata __P((DB *, DBT *, DBT *));
72void put __P((DB *, DBT *, DBT *)); 72void put __P((DB *, DBT *, DBT *));
73void rem __P((DB *, DBT *)); 73void rem __P((DB *, DBT *));
74char *sflags __P((int));
75void synk __P((DB *));
74void *rfile __P((char *, size_t *)); 76void *rfile __P((char *, size_t *));
75void seq __P((DB *, DBT *)); 77void seq __P((DB *, DBT *));
76u_int setflags __P((char *)); 78u_int setflags __P((char *));
@@ -78,13 +80,14 @@ void *setinfo __P((DBTYPE, char *));
78void usage __P((void)); 80void usage __P((void));
79void *xmalloc __P((char *, size_t)); 81void *xmalloc __P((char *, size_t));
80 82
81DBTYPE type; 83DBTYPE type; /* Database type. */
82void *infop; 84void *infop; /* Iflags. */
83u_long lineno; 85u_long lineno; /* Current line in test script. */
84u_int flags; 86u_int flags; /* Current DB flags. */
85int ofd = STDOUT_FILENO; 87int ofd = STDOUT_FILENO; /* Standard output fd. */
86 88
87DB *XXdbp; /* Global for gdb. */ 89DB *XXdbp; /* Global for gdb. */
90int XXlineno; /* Fast breakpoint for gdb. */
88 91
89int 92int
90main(argc, argv) 93main(argc, argv)
@@ -97,14 +100,15 @@ main(argc, argv)
97 DB *dbp; 100 DB *dbp;
98 DBT data, key, keydata; 101 DBT data, key, keydata;
99 size_t len; 102 size_t len;
100 int ch, oflags; 103 int ch, oflags, sflag;
101 char *fname, *infoarg, *p, buf[8 * 1024]; 104 char *fname, *infoarg, *p, *t, buf[8 * 1024];
102 105
103 infoarg = NULL; 106 infoarg = NULL;
104 fname = NULL; 107 fname = NULL;
105 oflags = O_CREAT | O_RDWR; 108 oflags = O_CREAT | O_RDWR;
106 while ((ch = getopt(argc, argv, "f:i:lo:")) != EOF) 109 sflag = 0;
107 switch(ch) { 110 while ((ch = getopt(argc, argv, "f:i:lo:s")) != EOF)
111 switch (ch) {
108 case 'f': 112 case 'f':
109 fname = optarg; 113 fname = optarg;
110 break; 114 break;
@@ -119,6 +123,9 @@ main(argc, argv)
119 O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) 123 O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
120 err("%s: %s", optarg, strerror(errno)); 124 err("%s: %s", optarg, strerror(errno));
121 break; 125 break;
126 case 's':
127 sflag = 1;
128 break;
122 case '?': 129 case '?':
123 default: 130 default:
124 usage(); 131 usage();
@@ -133,8 +140,8 @@ main(argc, argv)
133 type = dbtype(*argv++); 140 type = dbtype(*argv++);
134 141
135 /* Open the descriptor file. */ 142 /* Open the descriptor file. */
136 if (freopen(*argv, "r", stdin) == NULL) 143 if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL)
137 err("%s: %s", *argv, strerror(errno)); 144 err("%s: %s", *argv, strerror(errno));
138 145
139 /* Set up the db structure as necessary. */ 146 /* Set up the db structure as necessary. */
140 if (infoarg == NULL) 147 if (infoarg == NULL)
@@ -145,7 +152,10 @@ main(argc, argv)
145 if (*p != '\0') 152 if (*p != '\0')
146 infop = setinfo(type, p); 153 infop = setinfo(type, p);
147 154
148 /* Open the DB. */ 155 /*
156 * Open the DB. Delete any preexisting copy, you almost never
157 * want it around, and it often screws up tests.
158 */
149 if (fname == NULL) { 159 if (fname == NULL) {
150 p = getenv("TMPDIR"); 160 p = getenv("TMPDIR");
151 if (p == NULL) 161 if (p == NULL)
@@ -153,7 +163,9 @@ main(argc, argv)
153 (void)sprintf(buf, "%s/__dbtest", p); 163 (void)sprintf(buf, "%s/__dbtest", p);
154 fname = buf; 164 fname = buf;
155 (void)unlink(buf); 165 (void)unlink(buf);
156 } 166 } else if (!sflag)
167 (void)unlink(fname);
168
157 if ((dbp = dbopen(fname, 169 if ((dbp = dbopen(fname,
158 oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL) 170 oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL)
159 err("dbopen: %s", strerror(errno)); 171 err("dbopen: %s", strerror(errno));
@@ -162,8 +174,16 @@ main(argc, argv)
162 state = COMMAND; 174 state = COMMAND;
163 for (lineno = 1; 175 for (lineno = 1;
164 (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) { 176 (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) {
165 len = strlen(buf); 177 /* Delete the newline, displaying the key/data is easier. */
166 switch(*p) { 178 if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL)
179 *t = '\0';
180 if ((len = strlen(buf)) == 0 || isspace(*p) || *p == '#')
181 continue;
182
183 /* Convenient gdb break point. */
184 if (XXlineno == lineno)
185 XXlineno = 1;
186 switch (*p) {
167 case 'c': /* compare */ 187 case 'c': /* compare */
168 if (state != COMMAND) 188 if (state != COMMAND)
169 err("line %lu: not expecting command", lineno); 189 err("line %lu: not expecting command", lineno);
@@ -176,7 +196,8 @@ main(argc, argv)
176 /* Don't display the newline, if CR at EOL. */ 196 /* Don't display the newline, if CR at EOL. */
177 if (p[len - 2] == '\r') 197 if (p[len - 2] == '\r')
178 --len; 198 --len;
179 if (write(ofd, p + 1, len - 1) != len - 1) 199 if (write(ofd, p + 1, len - 1) != len - 1 ||
200 write(ofd, "\n", 1) != 1)
180 err("write: %s", strerror(errno)); 201 err("write: %s", strerror(errno));
181 break; 202 break;
182 case 'g': /* get */ 203 case 'g': /* get */
@@ -194,8 +215,19 @@ main(argc, argv)
194 case 'r': /* remove */ 215 case 'r': /* remove */
195 if (state != COMMAND) 216 if (state != COMMAND)
196 err("line %lu: not expecting command", lineno); 217 err("line %lu: not expecting command", lineno);
197 state = KEY; 218 if (flags == R_CURSOR) {
198 command = REMOVE; 219 rem(dbp, &key);
220 state = COMMAND;
221 } else {
222 state = KEY;
223 command = REMOVE;
224 }
225 break;
226 case 'S': /* sync */
227 if (state != COMMAND)
228 err("line %lu: not expecting command", lineno);
229 synk(dbp);
230 state = COMMAND;
199 break; 231 break;
200 case 's': /* seq */ 232 case 's': /* seq */
201 if (state != COMMAND) 233 if (state != COMMAND)
@@ -219,7 +251,7 @@ main(argc, argv)
219 err("line %lu: not expecting data", lineno); 251 err("line %lu: not expecting data", lineno);
220 data.data = xmalloc(p + 1, len - 1); 252 data.data = xmalloc(p + 1, len - 1);
221 data.size = len - 1; 253 data.size = len - 1;
222ldata: switch(command) { 254ldata: switch (command) {
223 case COMPARE: 255 case COMPARE:
224 compare(&keydata, &data); 256 compare(&keydata, &data);
225 break; 257 break;
@@ -255,7 +287,7 @@ ldata: switch(command) {
255 key.data = xmalloc(p + 1, len - 1); 287 key.data = xmalloc(p + 1, len - 1);
256 key.size = len - 1; 288 key.size = len - 1;
257 } 289 }
258lkey: switch(command) { 290lkey: switch (command) {
259 case COMPARE: 291 case COMPARE:
260 getdata(dbp, &key, &keydata); 292 getdata(dbp, &key, &keydata);
261 state = DATA; 293 state = DATA;
@@ -271,13 +303,13 @@ lkey: switch(command) {
271 break; 303 break;
272 case REMOVE: 304 case REMOVE:
273 rem(dbp, &key); 305 rem(dbp, &key);
274 if (type != DB_RECNO) 306 if ((type != DB_RECNO) && (flags != R_CURSOR))
275 free(key.data); 307 free(key.data);
276 state = COMMAND; 308 state = COMMAND;
277 break; 309 break;
278 case SEQ: 310 case SEQ:
279 seq(dbp, &key); 311 seq(dbp, &key);
280 if (type != DB_RECNO) 312 if ((type != DB_RECNO) && (flags != R_CURSOR))
281 free(key.data); 313 free(key.data);
282 state = COMMAND; 314 state = COMMAND;
283 break; 315 break;
@@ -291,11 +323,15 @@ lkey: switch(command) {
291 break; 323 break;
292 default: 324 default:
293 err("line %lu: %s: unknown command character", 325 err("line %lu: %s: unknown command character",
294 p, lineno); 326 lineno, p);
295 } 327 }
296 } 328 }
297#ifdef STATISTICS 329#ifdef STATISTICS
298 if (type == DB_BTREE) 330 /*
331 * -l must be used (DB_LOCK must be set) for this to be
332 * used, otherwise a page will be locked and it will fail.
333 */
334 if (type == DB_BTREE && oflags & DB_LOCK)
299 __bt_stat(dbp); 335 __bt_stat(dbp);
300#endif 336#endif
301 if (dbp->close(dbp)) 337 if (dbp->close(dbp))
@@ -305,7 +341,6 @@ lkey: switch(command) {
305} 341}
306 342
307#define NOOVERWRITE "put failed, would overwrite key\n" 343#define NOOVERWRITE "put failed, would overwrite key\n"
308#define NOSUCHKEY "get failed, no such key\n"
309 344
310void 345void
311compare(db1, db2) 346compare(db1, db2)
@@ -334,17 +369,23 @@ get(dbp, kp)
334{ 369{
335 DBT data; 370 DBT data;
336 371
337 switch(dbp->get(dbp, kp, &data, flags)) { 372 switch (dbp->get(dbp, kp, &data, flags)) {
338 case 0: 373 case 0:
339 (void)write(ofd, data.data, data.size); 374 (void)write(ofd, data.data, data.size);
375 if (ofd == STDOUT_FILENO)
376 (void)write(ofd, "\n", 1);
340 break; 377 break;
341 case -1: 378 case -1:
342 err("line %lu: get: %s", lineno, strerror(errno)); 379 err("line %lu: get: %s", lineno, strerror(errno));
343 /* NOTREACHED */ 380 /* NOTREACHED */
344 case 1: 381 case 1:
345 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); 382#define NOSUCHKEY "get failed, no such key\n"
346 (void)fprintf(stderr, "%d: %.*s: %s\n", 383 if (ofd != STDOUT_FILENO)
347 lineno, kp->size, kp->data, NOSUCHKEY); 384 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
385 else
386 (void)fprintf(stderr, "%d: %.*s: %s",
387 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
388#undef NOSUCHKEY
348 break; 389 break;
349 } 390 }
350} 391}
@@ -354,14 +395,14 @@ getdata(dbp, kp, dp)
354 DB *dbp; 395 DB *dbp;
355 DBT *kp, *dp; 396 DBT *kp, *dp;
356{ 397{
357 switch(dbp->get(dbp, kp, dp, flags)) { 398 switch (dbp->get(dbp, kp, dp, flags)) {
358 case 0: 399 case 0:
359 return; 400 return;
360 case -1: 401 case -1:
361 err("line %lu: getdata: %s", lineno, strerror(errno)); 402 err("line %lu: getdata: %s", lineno, strerror(errno));
362 /* NOTREACHED */ 403 /* NOTREACHED */
363 case 1: 404 case 1:
364 err("line %lu: get failed, no such key", lineno); 405 err("line %lu: getdata failed, no such key", lineno);
365 /* NOTREACHED */ 406 /* NOTREACHED */
366 } 407 }
367} 408}
@@ -371,7 +412,7 @@ put(dbp, kp, dp)
371 DB *dbp; 412 DB *dbp;
372 DBT *kp, *dp; 413 DBT *kp, *dp;
373{ 414{
374 switch(dbp->put(dbp, kp, dp, flags)) { 415 switch (dbp->put(dbp, kp, dp, flags)) {
375 case 0: 416 case 0:
376 break; 417 break;
377 case -1: 418 case -1:
@@ -388,34 +429,67 @@ rem(dbp, kp)
388 DB *dbp; 429 DB *dbp;
389 DBT *kp; 430 DBT *kp;
390{ 431{
391 switch(dbp->del(dbp, kp, flags)) { 432 switch (dbp->del(dbp, kp, flags)) {
392 case 0: 433 case 0:
393 break; 434 break;
394 case -1: 435 case -1:
395 err("line %lu: get: %s", lineno, strerror(errno)); 436 err("line %lu: rem: %s", lineno, strerror(errno));
396 /* NOTREACHED */ 437 /* NOTREACHED */
397 case 1: 438 case 1:
398 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); 439#define NOSUCHKEY "rem failed, no such key\n"
440 if (ofd != STDOUT_FILENO)
441 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
442 else if (flags != R_CURSOR)
443 (void)fprintf(stderr, "%d: %.*s: %s",
444 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
445 else
446 (void)fprintf(stderr,
447 "%d: rem of cursor failed\n", lineno);
448#undef NOSUCHKEY
399 break; 449 break;
400 } 450 }
401} 451}
402 452
403void 453void
454synk(dbp)
455 DB *dbp;
456{
457 switch (dbp->sync(dbp, flags)) {
458 case 0:
459 break;
460 case -1:
461 err("line %lu: synk: %s", lineno, strerror(errno));
462 /* NOTREACHED */
463 }
464}
465
466void
404seq(dbp, kp) 467seq(dbp, kp)
405 DB *dbp; 468 DB *dbp;
406 DBT *kp; 469 DBT *kp;
407{ 470{
408 DBT data; 471 DBT data;
409 472
410 switch(dbp->seq(dbp, kp, &data, flags)) { 473 switch (dbp->seq(dbp, kp, &data, flags)) {
411 case 0: 474 case 0:
412 (void)write(ofd, data.data, data.size); 475 (void)write(ofd, data.data, data.size);
476 if (ofd == STDOUT_FILENO)
477 (void)write(ofd, "\n", 1);
413 break; 478 break;
414 case -1: 479 case -1:
415 err("line %lu: seq: %s", lineno, strerror(errno)); 480 err("line %lu: seq: %s", lineno, strerror(errno));
416 /* NOTREACHED */ 481 /* NOTREACHED */
417 case 1: 482 case 1:
418 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1); 483#define NOSUCHKEY "seq failed, no such key\n"
484 if (ofd != STDOUT_FILENO)
485 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
486 else if (flags == R_CURSOR)
487 (void)fprintf(stderr, "%d: %.*s: %s",
488 lineno, MIN(kp->size, 20), kp->data, NOSUCHKEY);
489 else
490 (void)fprintf(stderr,
491 "%d: seq (%s) failed\n", lineno, sflags(flags));
492#undef NOSUCHKEY
419 break; 493 break;
420 } 494 }
421} 495}
@@ -436,9 +510,11 @@ dump(dbp, rev)
436 nflags = R_NEXT; 510 nflags = R_NEXT;
437 } 511 }
438 for (;; flags = nflags) 512 for (;; flags = nflags)
439 switch(dbp->seq(dbp, &key, &data, flags)) { 513 switch (dbp->seq(dbp, &key, &data, flags)) {
440 case 0: 514 case 0:
441 (void)write(ofd, data.data, data.size); 515 (void)write(ofd, data.data, data.size);
516 if (ofd == STDOUT_FILENO)
517 (void)write(ofd, "\n", 1);
442 break; 518 break;
443 case 1: 519 case 1:
444 goto done; 520 goto done;
@@ -457,31 +533,42 @@ setflags(s)
457 char *p, *index(); 533 char *p, *index();
458 534
459 for (; isspace(*s); ++s); 535 for (; isspace(*s); ++s);
460 if (*s == '\n') 536 if (*s == '\n' || *s == '\0')
461 return (0); 537 return (0);
462 if ((p = index(s, '\n')) != NULL) 538 if ((p = index(s, '\n')) != NULL)
463 *p = '\0'; 539 *p = '\0';
464 if (!strcmp(s, "R_CURSOR")) 540 if (!strcmp(s, "R_CURSOR")) return (R_CURSOR);
465 return (R_CURSOR); 541 if (!strcmp(s, "R_FIRST")) return (R_FIRST);
466 if (!strcmp(s, "R_FIRST")) 542 if (!strcmp(s, "R_IAFTER")) return (R_IAFTER);
467 return (R_FIRST); 543 if (!strcmp(s, "R_IBEFORE")) return (R_IBEFORE);
468 if (!strcmp(s, "R_IAFTER")) 544 if (!strcmp(s, "R_LAST")) return (R_LAST);
469 return (R_IAFTER); 545 if (!strcmp(s, "R_NEXT")) return (R_NEXT);
470 if (!strcmp(s, "R_IBEFORE")) 546 if (!strcmp(s, "R_NOOVERWRITE")) return (R_NOOVERWRITE);
471 return (R_IBEFORE); 547 if (!strcmp(s, "R_PREV")) return (R_PREV);
472 if (!strcmp(s, "R_LAST")) 548 if (!strcmp(s, "R_SETCURSOR")) return (R_SETCURSOR);
473 return (R_LAST); 549
474 if (!strcmp(s, "R_NEXT"))
475 return (R_NEXT);
476 if (!strcmp(s, "R_NOOVERWRITE"))
477 return (R_NOOVERWRITE);
478 if (!strcmp(s, "R_PREV"))
479 return (R_PREV);
480 if (!strcmp(s, "R_SETCURSOR"))
481 return (R_SETCURSOR);
482 err("line %lu: %s: unknown flag", lineno, s); 550 err("line %lu: %s: unknown flag", lineno, s);
483 /* NOTREACHED */ 551 /* NOTREACHED */
484} 552}
553
554char *
555sflags(flags)
556 int flags;
557{
558 switch (flags) {
559 case R_CURSOR: return ("R_CURSOR");
560 case R_FIRST: return ("R_FIRST");
561 case R_IAFTER: return ("R_IAFTER");
562 case R_IBEFORE: return ("R_IBEFORE");
563 case R_LAST: return ("R_LAST");
564 case R_NEXT: return ("R_NEXT");
565 case R_NOOVERWRITE: return ("R_NOOVERWRITE");
566 case R_PREV: return ("R_PREV");
567 case R_SETCURSOR: return ("R_SETCURSOR");
568 }
569
570 return ("UNKNOWN!");
571}
485 572
486DBTYPE 573DBTYPE
487dbtype(s) 574dbtype(s)
@@ -513,7 +600,7 @@ setinfo(type, s)
513 if (!isdigit(*eq)) 600 if (!isdigit(*eq))
514 err("%s: structure set statement must be a number", s); 601 err("%s: structure set statement must be a number", s);
515 602
516 switch(type) { 603 switch (type) {
517 case DB_BTREE: 604 case DB_BTREE:
518 if (!strcmp("flags", s)) { 605 if (!strcmp("flags", s)) {
519 ib.flags = atoi(eq); 606 ib.flags = atoi(eq);