1 #include "tdb1-lock-tracking.h"
2 #define fcntl fcntl_with_lockcheck1
3 #include "tdb2-source.h"
4 #include <ccan/tap/tap.h>
9 #include "tdb1-external-agent.h"
12 static struct agent
*agent
;
14 static bool correct_key(TDB_DATA key
)
16 return key
.dsize
== strlen("hi")
17 && memcmp(key
.dptr
, "hi", key
.dsize
) == 0;
20 static bool correct_data(TDB_DATA data
)
22 return data
.dsize
== strlen("world")
23 && memcmp(data
.dptr
, "world", data
.dsize
) == 0;
26 static int traverse2(struct tdb_context
*tdb
, TDB_DATA key
, TDB_DATA data
,
29 ok1(correct_key(key
));
30 ok1(correct_data(data
));
34 static int traverse1(struct tdb_context
*tdb
, TDB_DATA key
, TDB_DATA data
,
37 ok1(correct_key(key
));
38 ok1(correct_data(data
));
39 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
40 == WOULD_HAVE_BLOCKED
);
41 tdb1_traverse(tdb
, traverse2
, NULL
);
43 /* That should *not* release the transaction lock! */
44 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
45 == WOULD_HAVE_BLOCKED
);
49 int main(int argc
, char *argv
[])
51 struct tdb_context
*tdb
;
53 union tdb_attribute hsize
;
55 hsize
.base
.attr
= TDB_ATTRIBUTE_TDB1_HASHSIZE
;
56 hsize
.base
.next
= &tap_log_attr
;
57 hsize
.tdb1_hashsize
.hsize
= 1024;
60 agent
= prepare_external_agent1();
62 err(1, "preparing agent");
64 tdb
= tdb1_open("run-nested-traverse.tdb", TDB_DEFAULT
,
65 O_CREAT
|O_TRUNC
|O_RDWR
, 0600, &hsize
);
68 ok1(external_agent_operation1(agent
, OPEN
, tdb
->name
) == SUCCESS
);
69 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
71 ok1(external_agent_operation1(agent
, TRANSACTION_COMMIT
, tdb
->name
)
74 key
.dsize
= strlen("hi");
75 key
.dptr
= (void *)"hi";
76 data
.dptr
= (void *)"world";
77 data
.dsize
= strlen("world");
79 ok1(tdb1_store(tdb
, key
, data
, TDB_INSERT
) == 0);
80 tdb1_traverse(tdb
, traverse1
, NULL
);
81 tdb1_traverse_read(tdb
, traverse1
, NULL
);