6 #include <ccan/err/err.h>
11 static void logfn(struct ntdb_context
*ntdb
,
12 enum ntdb_log_level level
,
13 enum NTDB_ERROR ecode
,
17 fprintf(stderr
, "ntdb:%s:%s:%s\n",
18 ntdb_name(ntdb
), ntdb_errorstr(ecode
), message
);
21 int main(int argc
, char *argv
[])
23 unsigned int i
, j
, users
, groups
;
24 NTDB_DATA idxkey
, idxdata
;
27 struct ntdb_context
*ntdb
;
28 enum NTDB_ERROR ecode
;
29 union ntdb_attribute log
;
32 printf("Usage: growtdb-bench <users> <groups>\n");
35 users
= atoi(argv
[1]);
36 groups
= atoi(argv
[2]);
38 sprintf(cmd
, "cat /proc/%i/statm", getpid());
40 log
.base
.attr
= NTDB_ATTRIBUTE_LOG
;
44 ntdb
= ntdb_open("/tmp/growtdb.ntdb", NTDB_DEFAULT
,
45 O_RDWR
|O_CREAT
|O_TRUNC
, 0600, &log
);
47 idxkey
.dptr
= (unsigned char *)"User index";
48 idxkey
.dsize
= strlen("User index");
50 idxdata
.dptr
= calloc(idxdata
.dsize
, 1);
54 k
.dptr
= calloc(k
.dsize
, 1);
56 d
.dptr
= calloc(d
.dsize
, 1);
58 ntdb_transaction_start(ntdb
);
59 for (i
= 0; i
< users
; i
++) {
60 memcpy(k
.dptr
, &i
, sizeof(i
));
61 ecode
= ntdb_store(ntdb
, k
, d
, NTDB_INSERT
);
62 if (ecode
!= NTDB_SUCCESS
)
63 errx(1, "ntdb insert failed: %s", ntdb_errorstr(ecode
));
65 /* This simulates a growing index record. */
66 ecode
= ntdb_append(ntdb
, idxkey
, idxdata
);
67 if (ecode
!= NTDB_SUCCESS
)
68 errx(1, "ntdb append failed: %s", ntdb_errorstr(ecode
));
70 if ((ecode
= ntdb_transaction_commit(ntdb
)) != 0)
71 errx(1, "ntdb commit1 failed: %s", ntdb_errorstr(ecode
));
73 if ((ecode
= ntdb_check(ntdb
, NULL
, NULL
)) != 0)
74 errx(1, "ntdb_check failed after initial insert!");
78 /* Now put them all in groups: add 32 bytes to each record for
81 gk
.dptr
= calloc(k
.dsize
, 1);
82 gk
.dptr
[gk
.dsize
-1] = 1;
85 for (i
= 0; i
< groups
; i
++) {
86 ntdb_transaction_start(ntdb
);
87 /* Create the "group". */
88 memcpy(gk
.dptr
, &i
, sizeof(i
));
89 ecode
= ntdb_store(ntdb
, gk
, d
, NTDB_INSERT
);
90 if (ecode
!= NTDB_SUCCESS
)
91 errx(1, "ntdb insert failed: %s", ntdb_errorstr(ecode
));
93 /* Now populate it. */
94 for (j
= 0; j
< users
; j
++) {
95 /* Append to the user. */
96 memcpy(k
.dptr
, &j
, sizeof(j
));
97 if ((ecode
= ntdb_append(ntdb
, k
, d
)) != 0)
98 errx(1, "ntdb append failed: %s",
99 ntdb_errorstr(ecode
));
101 /* Append to the group. */
102 if ((ecode
= ntdb_append(ntdb
, gk
, d
)) != 0)
103 errx(1, "ntdb append failed: %s",
104 ntdb_errorstr(ecode
));
106 if ((ecode
= ntdb_transaction_commit(ntdb
)) != 0)
107 errx(1, "ntdb commit2 failed: %s", ntdb_errorstr(ecode
));
108 if ((ecode
= ntdb_check(ntdb
, NULL
, NULL
)) != 0)
109 errx(1, "ntdb_check failed after iteration %i!", i
);