12 void merge_count(void* userdata,
13 const uint8_t *key, size_t len_key,
14 const uint8_t *val0, size_t len_val0,
15 const uint8_t *val1, size_t len_val1,
16 uint8_t **merged_val, size_t *len_merged_val)
18 assert(len_val0 == sizeof(Count));
19 assert(len_val1 == sizeof(Count));
21 const Count* c0 = reinterpret_cast<const Count*>(val0);
22 const Count* c1 = reinterpret_cast<const Count*>(val1);
23 unique_ptr<Count> c((Count *)malloc(sizeof(Count))); // Needs to be with malloc, per merger spec.
25 c->white = c0->white + c1->white;
26 c->draw = c0->draw + c1->draw;
27 c->black = c0->black + c1->black;
28 c->sum_white_elo = c0->sum_white_elo + c1->sum_white_elo;
29 c->sum_black_elo = c0->sum_black_elo + c1->sum_black_elo;
30 c->num_elo = c0->num_elo + c1->num_elo;
31 if (c0->first_timestamp <= c1->first_timestamp) {
32 c->opening_num = c0->opening_num;
33 c->first_timestamp = c0->first_timestamp;
35 c->opening_num = c1->opening_num;
36 c->first_timestamp = c1->first_timestamp;
39 *merged_val = reinterpret_cast<uint8_t *>(c.release());
40 *len_merged_val = sizeof(Count);
43 int main(int argc, char **argv)
45 mtbl_merger_options* mopt = mtbl_merger_options_init();
46 mtbl_merger_options_set_merge_func(mopt, merge_count, NULL);
47 mtbl_merger* merger = mtbl_merger_init(mopt);
49 for (int i = 1; i < argc - 1; ++i) {
50 mtbl_reader* mtbl = mtbl_reader_init(argv[i], NULL);
51 mtbl_merger_add_source(merger, mtbl_reader_source(mtbl));
54 mtbl_writer_options* wopt = mtbl_writer_options_init();
55 mtbl_writer_options_set_block_size(wopt, 65536);
56 mtbl_writer* writer = mtbl_writer_init(argv[argc - 1], wopt);
57 mtbl_source_write(mtbl_merger_source(merger), writer);
58 mtbl_writer_destroy(&writer);