TDB2: make SAMBA use tdb1 again for the moment.
[ddiss/samba.git] / lib / tdb2 / test / run-tdb1-nested-traverse.c
1 #include "tdb1-lock-tracking.h"
2 #define fcntl fcntl_with_lockcheck1
3 #include "tdb2-source.h"
4 #include "tap-interface.h"
5 #undef fcntl
6 #include <stdlib.h>
7 #include <stdbool.h>
8 #include "tdb1-external-agent.h"
9 #include "logging.h"
10
11 static struct agent *agent;
12
13 static bool correct_key(TDB_DATA key)
14 {
15         return key.dsize == strlen("hi")
16                 && memcmp(key.dptr, "hi", key.dsize) == 0;
17 }
18
19 static bool correct_data(TDB_DATA data)
20 {
21         return data.dsize == strlen("world")
22                 && memcmp(data.dptr, "world", data.dsize) == 0;
23 }
24
25 static int traverse2(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
26                      void *p)
27 {
28         ok1(correct_key(key));
29         ok1(correct_data(data));
30         return 0;
31 }
32
33 static int traverse1(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
34                      void *p)
35 {
36         ok1(correct_key(key));
37         ok1(correct_data(data));
38         ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
39             == WOULD_HAVE_BLOCKED);
40         tdb_traverse(tdb, traverse2, NULL);
41
42         /* That should *not* release the transaction lock! */
43         ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
44             == WOULD_HAVE_BLOCKED);
45         return 0;
46 }
47
48 int main(int argc, char *argv[])
49 {
50         struct tdb_context *tdb;
51         TDB_DATA key, data;
52         union tdb_attribute hsize;
53
54         hsize.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE;
55         hsize.base.next = &tap_log_attr;
56         hsize.tdb1_hashsize.hsize = 1024;
57
58         plan_tests(17);
59         agent = prepare_external_agent1();
60         if (!agent)
61                 err(1, "preparing agent");
62
63         tdb = tdb_open("run-nested-traverse.tdb1", TDB_VERSION1,
64                        O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
65         ok1(tdb);
66
67         ok1(external_agent_operation1(agent, OPEN, tdb->name) == SUCCESS);
68         ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
69             == SUCCESS);
70         ok1(external_agent_operation1(agent, TRANSACTION_COMMIT, tdb->name)
71             == SUCCESS);
72
73         key = tdb_mkdata("hi", strlen("hi"));
74         data = tdb_mkdata("world", strlen("world"));
75
76         ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
77         tdb_traverse(tdb, traverse1, NULL);
78         tdb_add_flag(tdb, TDB_RDONLY);
79         tdb_traverse(tdb, traverse1, NULL);
80         tdb_remove_flag(tdb, TDB_RDONLY);
81         tdb_close(tdb);
82
83         return exit_status();
84 }