]> git.sur5r.net Git - openldap/blob - libraries/libmdb/mtest.c
6b084f96589088ee16e9aa92cf573e14b81441a3
[openldap] / libraries / libmdb / mtest.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include "mdb.h"
5
6 int main(int argc,char * argv[])
7 {
8         int i = 0, j = 0, rc;
9         MDB_env *env;
10         MDB_db *db;
11         MDB_val key, data;
12         MDB_txn *txn;
13         MDB_stat *mst;
14         MDB_cursor *cursor, *cur2;
15         int count;
16         int *values;
17         char sval[32];
18
19         srandom(time(NULL));
20
21             count = (random()%384) + 64;
22             values = (int *)malloc(count*sizeof(int));
23
24             for(i = 0;i<count;i++) {
25                         values[i] = random()%1024;
26             }
27     
28                 rc = mdbenv_create(&env);
29                 rc = mdbenv_set_mapsize(env, 10485760);
30                 rc = mdbenv_open(env, "./testdb", MDB_FIXEDMAP|MDB_NOSYNC, 0664);
31                 rc = mdb_txn_begin(env, 0, &txn);
32                 rc = mdb_open(env, txn, NULL, 0, &db);
33    
34                 key.mv_size = sizeof(int);
35                 key.mv_data = sval;
36                 data.mv_size = sizeof(sval);
37                 data.mv_data = sval;
38
39                 printf("Adding %d values\n", count);
40             for (i=0;i<count;i++) {     
41                         sprintf(sval, "%03x %d foo bar", values[i], values[i]);
42                         rc = mdb_put(db, txn, &key, &data, MDB_NOOVERWRITE);
43                         if (rc) j++;
44             }
45                 if (j) printf("%d duplicates skipped\n", j);
46                 rc = mdb_txn_commit(txn);
47                 rc = mdbenv_stat(env, &mst);
48
49                 rc = mdb_cursor_open(db, NULL, &cursor);
50                 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
51                         printf("key: %p %.*s, data: %p %.*s\n",
52                                 key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
53                                 data.mv_data, (int) data.mv_size, (char *) data.mv_data);
54                 }
55                 mdb_cursor_close(cursor);
56
57                 j=0;
58                 key.mv_data = sval;
59             for (i= count - 1; i > -1; i-= (random()%5)) {      
60                         j++;
61                         txn=NULL;
62                         rc = mdb_txn_begin(env, 0, &txn);
63                         sprintf(sval, "%03x ", values[i]);
64                         rc = mdb_del(db, txn, &key, NULL);
65                         if (rc) {
66                                 j--;
67                                 mdb_txn_abort(txn);
68                         } else {
69                                 rc = mdb_txn_commit(txn);
70                         }
71             }
72             free(values);
73                 printf("Deleted %d values\n", j);
74
75                 rc = mdbenv_stat(env, &mst);
76                 rc = mdb_cursor_open(db, NULL, &cursor);
77                 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
78                         printf("key: %.*s, data: %.*s\n",
79                                 (int) key.mv_size,  (char *) key.mv_data,
80                                 (int) data.mv_size, (char *) data.mv_data);
81                 }
82 #if 0
83                 /* write ops aren't coordinated with cursors,
84                  * this stuff all breaks
85                  */
86                 printf("Deleting with cursor\n");
87                 rc = mdb_txn_begin(env, 0, &txn);
88                 rc = mdb_cursor_open(db, txn, &cur2);
89                 for (i=0; i<50; i++) {
90                         rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
91                         printf("key: %p %.*s, data: %p %.*s\n",
92                                 key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
93                                 data.mv_data, (int) data.mv_size, (char *) data.mv_data);
94                         rc = mdb_del(db, txn, &key, NULL);
95                 }
96
97                 printf("Restarting cursor in txn\n");
98                 rc = mdb_cursor_get(cur2, &key, &data, MDB_FIRST);
99                 printf("key: %p %.*s, data: %p %.*s\n",
100                         key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
101                         data.mv_data, (int) data.mv_size, (char *) data.mv_data);
102                 for (i=0; i<32; i++) {
103                         rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
104                         printf("key: %p %.*s, data: %p %.*s\n",
105                                 key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
106                                 data.mv_data, (int) data.mv_size, (char *) data.mv_data);
107                 }
108                 mdb_cursor_close(cur2);
109                 rc = mdb_txn_commit(txn);
110                 mdb_cursor_close(cursor);
111                 printf("Restarting cursor outside txn\n");
112                 rc = mdb_cursor_open(db, NULL, &cursor);
113                 rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST);
114                 printf("key: %p %.*s, data: %p %.*s\n",
115                         key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
116                         data.mv_data, (int) data.mv_size, (char *) data.mv_data);
117                 for (i=0; i<32; i++) {
118                         rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT);
119                         printf("key: %p %.*s, data: %p %.*s\n",
120                                 key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
121                                 data.mv_data, (int) data.mv_size, (char *) data.mv_data);
122                 }
123 #endif
124                 mdb_cursor_close(cursor);
125
126                 mdb_close(db);
127                 mdbenv_close(env);
128
129         return 0;
130 }