関数 | |
static void | _start_timer (void) |
static double | _end_timer (void) |
static void | fatal (const char *why) |
static void | tdb_log (struct tdb_context *tdb, int level, const char *format,...) PRINTF_ATTRIBUTE(3 |
static void | compare_db (void) |
static char * | randbuf (int len) |
static void | addrec_db (void) |
static void | addrec_gdbm (void) |
static int | traverse_fn (struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, void *state) |
static void | merge_test (void) |
int | main (int argc, const char *argv[]) |
変数 | |
static struct tdb_context * | db |
static GDBM_FILE | gdbm |
timeval tp1 | tp2 |
static void _start_timer | ( | void | ) | [static] |
static double _end_timer | ( | void | ) | [static] |
static void fatal | ( | const char * | why | ) | [static] |
static void static void tdb_log | ( | struct tdb_context * | tdb, | |
int | level, | |||
const char * | format, | |||
... | ||||
) | [static] |
static void compare_db | ( | void | ) | [static] |
参照先 db・TDB_DATA::dptr・TDB_DATA::dsize・fatal()・gdbm・tdb_fetch()・tdb_firstkey()・tdb_nextkey().
参照元 main().
00051 { 00052 TDB_DATA d, key, nextkey; 00053 datum gd, gkey, gnextkey; 00054 00055 key = tdb_firstkey(db); 00056 while (key.dptr) { 00057 d = tdb_fetch(db, key); 00058 gkey.dptr = key.dptr; 00059 gkey.dsize = key.dsize; 00060 00061 gd = gdbm_fetch(gdbm, gkey); 00062 00063 if (!gd.dptr) fatal("key not in gdbm"); 00064 if (gd.dsize != d.dsize) fatal("data sizes differ"); 00065 if (memcmp(gd.dptr, d.dptr, d.dsize)) { 00066 fatal("data differs"); 00067 } 00068 00069 nextkey = tdb_nextkey(db, key); 00070 free(key.dptr); 00071 free(d.dptr); 00072 free(gd.dptr); 00073 key = nextkey; 00074 } 00075 00076 gkey = gdbm_firstkey(gdbm); 00077 while (gkey.dptr) { 00078 gd = gdbm_fetch(gdbm, gkey); 00079 key.dptr = gkey.dptr; 00080 key.dsize = gkey.dsize; 00081 00082 d = tdb_fetch(db, key); 00083 00084 if (!d.dptr) fatal("key not in db"); 00085 if (d.dsize != gd.dsize) fatal("data sizes differ"); 00086 if (memcmp(d.dptr, gd.dptr, gd.dsize)) { 00087 fatal("data differs"); 00088 } 00089 00090 gnextkey = gdbm_nextkey(gdbm, gkey); 00091 free(gkey.dptr); 00092 free(gd.dptr); 00093 free(d.dptr); 00094 gkey = gnextkey; 00095 } 00096 }
static char* randbuf | ( | int | len | ) | [static] |
参照先 buf.
参照元 addrec_db()・addrec_gdbm().
00099 { 00100 char *buf; 00101 int i; 00102 buf = (char *)malloc(len+1); 00103 00104 for (i=0;i<len;i++) { 00105 buf[i] = 'a' + (rand() % 26); 00106 } 00107 buf[i] = 0; 00108 return buf; 00109 }
static void addrec_db | ( | void | ) | [static] |
参照先 db・TDB_DATA::dptr・TDB_DATA::dsize・fatal()・randbuf()・tdb_delete()・tdb_fetch()・tdb_store().
参照元 main().
00112 { 00113 int klen, dlen; 00114 char *k, *d; 00115 TDB_DATA key, data; 00116 00117 klen = 1 + (rand() % 4); 00118 dlen = 1 + (rand() % 100); 00119 00120 k = randbuf(klen); 00121 d = randbuf(dlen); 00122 00123 key.dptr = k; 00124 key.dsize = klen+1; 00125 00126 data.dptr = d; 00127 data.dsize = dlen+1; 00128 00129 if (rand() % DELETE_PROB == 0) { 00130 tdb_delete(db, key); 00131 } else if (rand() % STORE_PROB == 0) { 00132 if (tdb_store(db, key, data, TDB_REPLACE) != 0) { 00133 fatal("tdb_store failed"); 00134 } 00135 } else { 00136 data = tdb_fetch(db, key); 00137 if (data.dptr) free(data.dptr); 00138 } 00139 00140 free(k); 00141 free(d); 00142 }
static void addrec_gdbm | ( | void | ) | [static] |
参照元 main().
00145 { 00146 int klen, dlen; 00147 char *k, *d; 00148 datum key, data; 00149 00150 klen = 1 + (rand() % 4); 00151 dlen = 1 + (rand() % 100); 00152 00153 k = randbuf(klen); 00154 d = randbuf(dlen); 00155 00156 key.dptr = k; 00157 key.dsize = klen+1; 00158 00159 data.dptr = d; 00160 data.dsize = dlen+1; 00161 00162 if (rand() % DELETE_PROB == 0) { 00163 gdbm_delete(gdbm, key); 00164 } else if (rand() % STORE_PROB == 0) { 00165 if (gdbm_store(gdbm, key, data, GDBM_REPLACE) != 0) { 00166 fatal("gdbm_store failed"); 00167 } 00168 } else { 00169 data = gdbm_fetch(gdbm, key); 00170 if (data.dptr) free(data.dptr); 00171 } 00172 00173 free(k); 00174 free(d); 00175 }
static int traverse_fn | ( | struct tdb_context * | tdb, | |
TDB_DATA | key, | |||
TDB_DATA | dbuf, | |||
void * | state | |||
) | [static] |
参照先 TDB_DATA::dptr・printf()・tdb・tdb_delete().
00178 { 00179 #if 0 00180 printf("[%s] [%s]\n", key.dptr, dbuf.dptr); 00181 #endif 00182 tdb_delete(tdb, key); 00183 return 0; 00184 }
static void merge_test | ( | void | ) | [static] |
参照先 db・TDB_DATA::dptr・TDB_DATA::dsize・fatal()・snprintf()・tdb_delete()・tdb_store().
参照元 main().
00187 { 00188 int i; 00189 char keys[5][2]; 00190 char tdata[] = "test"; 00191 TDB_DATA key, data; 00192 00193 for (i = 0; i < 5; i++) { 00194 snprintf(keys[i],2, "%d", i); 00195 key.dptr = keys[i]; 00196 key.dsize = 2; 00197 00198 data.dptr = tdata; 00199 data.dsize = 4; 00200 00201 if (tdb_store(db, key, data, TDB_REPLACE) != 0) { 00202 fatal("tdb_store failed"); 00203 } 00204 } 00205 00206 key.dptr = keys[0]; 00207 tdb_delete(db, key); 00208 key.dptr = keys[4]; 00209 tdb_delete(db, key); 00210 key.dptr = keys[2]; 00211 tdb_delete(db, key); 00212 key.dptr = keys[1]; 00213 tdb_delete(db, key); 00214 key.dptr = keys[3]; 00215 tdb_delete(db, key); 00216 }
int main | ( | int | argc, | |
const char * | argv[] | |||
) |
参照先 _end_timer()・_start_timer()・addrec_db()・addrec_gdbm()・compare_db()・db・fatal()・gdbm・merge_test()・printf()・tdb_close()・tdb_open()・tdb_traverse()・tdb_validate_freelist()・traverse_fn().
00219 { 00220 int i, seed=0; 00221 int loops = 10000; 00222 int num_entries; 00223 char test_gdbm[] = "test.gdbm"; 00224 00225 unlink("test.gdbm"); 00226 00227 db = tdb_open("test.tdb", 0, TDB_CLEAR_IF_FIRST, 00228 O_RDWR | O_CREAT | O_TRUNC, 0600); 00229 gdbm = gdbm_open(test_gdbm, 512, GDBM_WRITER|GDBM_NEWDB|GDBM_FAST, 00230 0600, NULL); 00231 00232 if (!db || !gdbm) { 00233 fatal("db open failed"); 00234 } 00235 00236 #if 1 00237 srand(seed); 00238 _start_timer(); 00239 for (i=0;i<loops;i++) addrec_gdbm(); 00240 printf("gdbm got %.2f ops/sec\n", i/_end_timer()); 00241 #endif 00242 00243 merge_test(); 00244 00245 srand(seed); 00246 _start_timer(); 00247 for (i=0;i<loops;i++) addrec_db(); 00248 printf("tdb got %.2f ops/sec\n", i/_end_timer()); 00249 00250 if (tdb_validate_freelist(db, &num_entries) == -1) { 00251 printf("tdb freelist is corrupt\n"); 00252 } else { 00253 printf("tdb freelist is good (%d entries)\n", num_entries); 00254 } 00255 00256 compare_db(); 00257 00258 printf("traversed %d records\n", tdb_traverse(db, traverse_fn, NULL)); 00259 printf("traversed %d records\n", tdb_traverse(db, traverse_fn, NULL)); 00260 00261 tdb_close(db); 00262 gdbm_close(gdbm); 00263 00264 return 0; 00265 }
struct tdb_context* db [static] |
GDBM_FILE gdbm [static] |
struct timeval tp1 tp2 |