1 /* We use direct access to hand to the parse function: what if db expands? */
4 #include "tap-interface.h"
9 #include "../private.h" /* To establish size, esp. for NTDB_INTERNAL dbs */
11 static struct ntdb_context
*ntdb
;
13 static off_t
ntdb_size(void)
15 return ntdb
->file
->map_size
;
23 static enum NTDB_ERROR
parse(NTDB_DATA key
, NTDB_DATA data
,
24 struct parse_info
*pinfo
)
29 if (!ntdb_deq(data
, pinfo
->expected
))
30 return NTDB_ERR_EINVAL
;
34 for (i
= 0; ntdb_size() == flen
; i
++) {
35 NTDB_DATA add
= ntdb_mkdata(&i
, sizeof(i
));
37 /* This is technically illegal parse(), which is why we
38 * grabbed allrecord lock.*/
39 ntdb_store(ntdb
, add
, add
, NTDB_INSERT
);
42 /* Access the record again. */
43 if (!ntdb_deq(data
, pinfo
->expected
))
44 return NTDB_ERR_EINVAL
;
47 if (pinfo
->depth
!= 0) {
48 enum NTDB_ERROR ecode
;
51 ecode
= ntdb_parse_record(ntdb
, key
, parse
, pinfo
);
57 /* Access the record one more time. */
58 if (!ntdb_deq(data
, pinfo
->expected
))
59 return NTDB_ERR_EINVAL
;
64 int main(int argc
, char *argv
[])
67 int flags
[] = { NTDB_INTERNAL
, NTDB_DEFAULT
, NTDB_NOMMAP
,
68 NTDB_INTERNAL
|NTDB_CONVERT
, NTDB_CONVERT
,
69 NTDB_NOMMAP
|NTDB_CONVERT
};
70 struct parse_info pinfo
;
71 NTDB_DATA key
= ntdb_mkdata("hello", 5), data
= ntdb_mkdata("world", 5);
73 plan_tests(sizeof(flags
) / sizeof(flags
[0]) * 3 + 1);
74 for (i
= 0; i
< sizeof(flags
) / sizeof(flags
[0]); i
++) {
75 ntdb
= ntdb_open("api-94-expand-during-parse.ntdb",
76 flags
[i
]|MAYBE_NOSYNC
,
77 O_RDWR
|O_CREAT
|O_TRUNC
, 0600, &tap_log_attr
);
78 ok1(ntdb_store(ntdb
, key
, data
, NTDB_INSERT
) == NTDB_SUCCESS
);
79 ok1(ntdb_lockall(ntdb
) == NTDB_SUCCESS
);
80 pinfo
.expected
= data
;
82 ok1(ntdb_parse_record(ntdb
, key
, parse
, &pinfo
) == NTDB_SUCCESS
);
87 ok1(tap_log_messages
== 0);