]> git.sur5r.net Git - openldap/blob - libraries/libmdb/mtest.c
More cursor tests, fail...
[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, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
53                 }
54                 mdb_cursor_close(cursor);
55
56                 j=0;
57                 key.mv_data = sval;
58             for (i= count - 1; i > -1; i-= (random()%5)) {      
59                         j++;
60                         txn=NULL;
61                         rc = mdb_txn_begin(env, 0, &txn);
62                         sprintf(sval, "%03x ", values[i]);
63                         rc = mdb_del(db, txn, &key, NULL);
64                         if (rc) {
65                                 j--;
66                                 mdb_txn_abort(txn);
67                         } else {
68                                 rc = mdb_txn_commit(txn);
69                         }
70             }
71             free(values);
72                 printf("Deleted %d values\n", j);
73
74                 rc = mdbenv_stat(env, &mst);
75                 rc = mdb_cursor_open(db, NULL, &cursor);
76                 while (rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == 0) {
77                         printf("key: %.*s, data: %.*s\n",
78                                 key.mv_size, key.mv_data, data.mv_size, data.mv_data);
79                 }
80 #if 0
81                 /* write ops aren't coordinated with cursors,
82                  * this stuff all breaks
83                  */
84                 printf("Deleting with cursor\n");
85                 rc = mdb_txn_begin(env, 0, &txn);
86                 rc = mdb_cursor_open(db, txn, &cur2);
87                 for (i=0; i<50; i++) {
88                         rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
89                         printf("key: %p %.*s, data: %p %.*s\n",
90                                 key.mv_data, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
91                         rc = mdb_del(db, txn, &key, NULL);
92                 }
93
94                 printf("Restarting cursor in txn\n");
95                 rc = mdb_cursor_get(cur2, &key, &data, MDB_FIRST);
96                 printf("key: %p %.*s, data: %p %.*s\n",
97                         key.mv_data, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
98                 for (i=0; i<32; i++) {
99                         rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
100                         printf("key: %p %.*s, data: %p %.*s\n",
101                                 key.mv_data, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
102                 }
103                 mdb_cursor_close(cur2);
104                 rc = mdb_txn_commit(txn);
105                 mdb_cursor_close(cursor);
106                 printf("Restarting cursor outside txn\n");
107                 rc = mdb_cursor_open(db, NULL, &cursor);
108                 rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST);
109                 printf("key: %p %.*s, data: %p %.*s\n",
110                         key.mv_data, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
111                 for (i=0; i<32; i++) {
112                         rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT);
113                         printf("key: %p %.*s, data: %p %.*s\n",
114                                 key.mv_data, key.mv_size, key.mv_data, data.mv_data, data.mv_size, data.mv_data);
115                 }
116 #endif
117                 mdb_cursor_close(cursor);
118
119                 mdb_close(db);
120                 mdbenv_close(env);
121
122         return 0;
123 }