1 #include "tdb1-lock-tracking.h"
2 #define fcntl fcntl_with_lockcheck1
3 #include "tdb2-source.h"
4 #include "tap-interface.h"
8 #include "tdb1-external-agent.h"
11 static struct agent *agent;
13 static bool correct_key(TDB_DATA key)
15 return key.dsize == strlen("hi")
16 && memcmp(key.dptr, "hi", key.dsize) == 0;
19 static bool correct_data(TDB_DATA data)
21 return data.dsize == strlen("world")
22 && memcmp(data.dptr, "world", data.dsize) == 0;
25 static int traverse2(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
28 ok1(correct_key(key));
29 ok1(correct_data(data));
33 static int traverse1(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
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);
42 /* That should *not* release the transaction lock! */
43 ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
44 == WOULD_HAVE_BLOCKED);
48 int main(int argc, char *argv[])
50 struct tdb_context *tdb;
52 union tdb_attribute hsize;
54 hsize.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE;
55 hsize.base.next = &tap_log_attr;
56 hsize.tdb1_hashsize.hsize = 1024;
59 agent = prepare_external_agent1();
61 err(1, "preparing agent");
63 tdb = tdb_open("run-nested-traverse.tdb1", TDB_VERSION1,
64 O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
67 ok1(external_agent_operation1(agent, OPEN, tdb->name) == SUCCESS);
68 ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
70 ok1(external_agent_operation1(agent, TRANSACTION_COMMIT, tdb->name)
73 key = tdb_mkdata("hi", strlen("hi"));
74 data = tdb_mkdata("world", strlen("world"));
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);