11 void merge_count(void* userdata,
12 const uint8_t *key, size_t len_key,
13 const uint8_t *val0, size_t len_val0,
14 const uint8_t *val1, size_t len_val1,
15 uint8_t **merged_val, size_t *len_merged_val)
18 c0.ParseFromArray(val0, len_val0);
19 c1.ParseFromArray(val1, len_val1);
23 c.set_white(c0.white() + c1.white());
24 c.set_draw(c0.draw() + c1.draw());
25 c.set_black(c0.black() + c1.black());
26 c.set_sum_white_elo(c0.sum_white_elo() + c1.sum_white_elo());
27 c.set_sum_black_elo(c0.sum_black_elo() + c1.sum_black_elo());
28 c.set_num_elo(c0.num_elo() + c1.num_elo());
29 if (c0.first_timestamp() <= c1.first_timestamp()) {
30 c.set_opening_num(c0.opening_num());
31 if (c0.has_first_timestamp()) {
32 c.set_first_timestamp(c0.first_timestamp());
35 c.set_opening_num(c1.opening_num());
36 if (c1.has_first_timestamp()) {
37 c.set_first_timestamp(c1.first_timestamp());
41 static string buf; // Keep allocated.
42 c.SerializeToString(&buf);
44 *merged_val = reinterpret_cast<uint8_t *>(malloc(buf.size()));
45 *len_merged_val = buf.size();
46 memcpy(*merged_val, buf.data(), buf.size());
49 int main(int argc, char **argv)
51 mtbl_merger_options* mopt = mtbl_merger_options_init();
52 mtbl_merger_options_set_merge_func(mopt, merge_count, NULL);
53 mtbl_merger* merger = mtbl_merger_init(mopt);
55 for (int i = 1; i < argc - 1; ++i) {
56 mtbl_reader* mtbl = mtbl_reader_init(argv[i], NULL);
57 mtbl_merger_add_source(merger, mtbl_reader_source(mtbl));
60 mtbl_writer_options* wopt = mtbl_writer_options_init();
61 mtbl_writer_options_set_block_size(wopt, 65536);
62 mtbl_writer* writer = mtbl_writer_init(argv[argc - 1], wopt);
63 mtbl_source_write(mtbl_merger_source(merger), writer);
64 mtbl_writer_destroy(&writer);