1/* 2 * $Id: b_del.c,v 1.15 2008/01/31 17:01:22 bostic Exp $ 3 */ 4#include "bench.h" 5 6static int b_del_usage(void); 7 8int 9b_del(int argc, char *argv[]) 10{ 11 extern char *optarg; 12 extern int optind, __db_getopt_reset; 13 DB *dbp; 14 DBC *dbc; 15 DBT key, data; 16 DBTYPE type; 17 db_recno_t recno; 18 u_int32_t cachesize; 19 int ch, i, count, ret, use_cursor; 20 char *ts, buf[32]; 21 22 type = DB_BTREE; 23 cachesize = MEGABYTE; 24 count = 100000; 25 use_cursor = 0; 26 ts = "Btree"; 27 __db_getopt_reset = 1; 28 while ((ch = getopt(argc, argv, "C:c:t:w")) != EOF) 29 switch (ch) { 30 case 'C': 31 cachesize = (u_int32_t)atoi(optarg); 32 break; 33 case 'c': 34 count = atoi(optarg); 35 break; 36 case 't': 37 switch (optarg[0]) { 38 case 'B': case 'b': 39 ts = "Btree"; 40 type = DB_BTREE; 41 break; 42 case 'H': case 'h': 43 if (b_util_have_hash()) 44 return (0); 45 ts = "Hash"; 46 type = DB_HASH; 47 break; 48 case 'Q': case 'q': 49 if (b_util_have_queue()) 50 return (0); 51 ts = "Queue"; 52 type = DB_QUEUE; 53 break; 54 case 'R': case 'r': 55 ts = "Recno"; 56 type = DB_RECNO; 57 break; 58 default: 59 return (b_del_usage()); 60 } 61 break; 62 case 'w': 63 use_cursor = 1; 64 break; 65 case '?': 66 default: 67 return (b_del_usage()); 68 } 69 argc -= optind; 70 argv += optind; 71 if (argc != 0) 72 return (b_del_usage()); 73 74 /* Create the database. */ 75 DB_BENCH_ASSERT(db_create(&dbp, NULL, 0) == 0); 76 DB_BENCH_ASSERT(dbp->set_cachesize(dbp, 0, cachesize, 0) == 0); 77 dbp->set_errfile(dbp, stderr); 78 79 /* Set record length for Queue. */ 80 if (type == DB_QUEUE) 81 DB_BENCH_ASSERT(dbp->set_re_len(dbp, 20) == 0); 82 83#if DB_VERSION_MAJOR >= 4 && DB_VERSION_MINOR >= 1 84 DB_BENCH_ASSERT( 85 dbp->open(dbp, NULL, TESTFILE, NULL, type, DB_CREATE, 0666) == 0); 86#else 87 DB_BENCH_ASSERT( 88 dbp->open(dbp, TESTFILE, NULL, type, DB_CREATE, 0666) == 0); 89#endif 90 91 /* Initialize the data. */ 92 memset(&key, 0, sizeof(key)); 93 memset(&data, 0, sizeof(data)); 94 data.data = "01234567890123456789"; 95 data.size = 20; 96 97 /* Store a key/data pair. */ 98 switch (type) { 99 case DB_BTREE: 100 case DB_HASH: 101 key.data = buf; 102 key.size = 10; 103 break; 104 case DB_QUEUE: 105 case DB_RECNO: 106 key.data = &recno; 107 key.size = sizeof(recno); 108 break; 109 case DB_UNKNOWN: 110 b_util_abort(); 111 break; 112 } 113 114 /* Insert count in-order key/data pairs. */ 115 if (type == DB_BTREE || type == DB_HASH) 116 for (i = 0; i < count; ++i) { 117 (void)snprintf(buf, sizeof(buf), "%010d", i); 118 DB_BENCH_ASSERT( 119 dbp->put(dbp, NULL, &key, &data, 0) == 0); 120 } 121 else 122 for (i = 0, recno = 1; i < count; ++i, ++recno) 123 DB_BENCH_ASSERT( 124 dbp->put(dbp, NULL, &key, &data, 0) == 0); 125 126 /* Delete the records. */ 127 TIMER_START; 128 if (use_cursor) { 129 DB_BENCH_ASSERT(dbp->cursor(dbp, NULL, &dbc, 0) == 0); 130 while ((ret = dbc->c_get(dbc, &key, &data, DB_NEXT)) == 0) 131 DB_BENCH_ASSERT(dbc->c_del(dbc, 0) == 0); 132 DB_BENCH_ASSERT (ret == DB_NOTFOUND); 133 } else 134 if (type == DB_BTREE || type == DB_HASH) 135 for (i = 0; i < count; ++i) { 136 (void)snprintf(buf, sizeof(buf), "%010d", i); 137 DB_BENCH_ASSERT( 138 dbp->del(dbp, NULL, &key, 0) == 0); 139 } 140 else 141 for (i = 0, recno = 1; i < count; ++i, ++recno) 142 DB_BENCH_ASSERT( 143 dbp->del(dbp, NULL, &key, 0) == 0); 144 145 TIMER_STOP; 146 147 printf( 148 "# %d %s database in-order delete of 10/20 byte key/data pairs using %s\n", 149 count, ts, use_cursor ? "a cursor" : "the key"); 150 TIMER_DISPLAY(count); 151 152 DB_BENCH_ASSERT(dbp->close(dbp, 0) == 0); 153 154 return (0); 155} 156 157static int 158b_del_usage() 159{ 160 (void)fprintf(stderr, 161 "usage: b_del [-w] [-C cachesz] [-c count] [-t type]\n"); 162 return (EXIT_FAILURE); 163} 164