tdb/tools/tdbtest.c

ソースコードを見る。

関数

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_contextdb
static GDBM_FILE gdbm
timeval tp1 tp2


関数

static void _start_timer ( void   )  [static]

tdbtest.c19 行で定義されています。

参照元 main().

00020 {
00021         gettimeofday(&tp1,NULL);
00022 }

static double _end_timer ( void   )  [static]

tdbtest.c24 行で定義されています。

参照先 tp2.

参照元 main().

00025 {
00026         gettimeofday(&tp2,NULL);
00027         return((tp2.tv_sec - tp1.tv_sec) + 
00028                (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
00029 }

static void fatal ( const char *  why  )  [static]

tdbtest.c31 行で定義されています。

参照元 addrec_db()addrec_gdbm()compare_db()main()merge_test().

00032 {
00033         perror(why);
00034         exit(1);
00035 }

static void static void tdb_log ( struct tdb_context tdb,
int  level,
const char *  format,
  ... 
) [static]

tdbtest.c40 行で定義されています。

00041 {
00042         va_list ap;
00043     
00044         va_start(ap, format);
00045         vfprintf(stdout, format, ap);
00046         va_end(ap);
00047         fflush(stdout);
00048 }

static void compare_db ( void   )  [static]

tdbtest.c50 行で定義されています。

参照先 dbTDB_DATA::dptrTDB_DATA::dsizefatal()gdbmtdb_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]

tdbtest.c98 行で定義されています。

参照先 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]

tdbtest.c111 行で定義されています。

参照先 dbTDB_DATA::dptrTDB_DATA::dsizefatal()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]

tdbtest.c144 行で定義されています。

参照先 fatal()gdbmrandbuf().

参照元 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]

tdbtest.c177 行で定義されています。

参照先 TDB_DATA::dptrprintf()tdbtdb_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]

tdbtest.c186 行で定義されています。

参照先 dbTDB_DATA::dptrTDB_DATA::dsizefatal()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[] 
)

tdbtest.c218 行で定義されています。

参照先 _end_timer()_start_timer()addrec_db()addrec_gdbm()compare_db()dbfatal()gdbmmerge_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]

tdbtest.c14 行で定義されています。

参照元 addrec_db()compare_db()main()merge_test().

GDBM_FILE gdbm [static]

tdbtest.c15 行で定義されています。

参照元 addrec_gdbm()compare_db()main().

struct timeval tp1 tp2

tdbtest.c17 行で定義されています。

参照元 _end_timer().


Sambaに対してSat Aug 29 21:24:31 2009に生成されました。  doxygen 1.4.7