X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=binmerger.cpp;h=7e25a8f5cdabfa63aaede31f23d6a83c9354fbc3;hb=74f1261e4067cbc1b743b329ed2d419aee735cbf;hp=480bd8321d645a5453d2d840ad1e3a6697eb181c;hpb=1e683bba44dd60c04eea0cd8b6d1a7e36ad4acc8;p=remoteglot-book diff --git a/binmerger.cpp b/binmerger.cpp index 480bd83..7e25a8f 100644 --- a/binmerger.cpp +++ b/binmerger.cpp @@ -2,42 +2,38 @@ #include #include #include +#include #include #include -#include "count.h" +#include "merge_count.h" +#include "count.pb.h" using namespace std; - -void merge_count(void* userdata, - const uint8_t *key, size_t len_key, - const uint8_t *val0, size_t len_val0, - const uint8_t *val1, size_t len_val1, - uint8_t **merged_val, size_t *len_merged_val) +void merge_serialized_count(void* userdata, + const uint8_t *key, size_t len_key, + const uint8_t *val0, size_t len_val0, + const uint8_t *val1, size_t len_val1, + uint8_t **merged_val, size_t *len_merged_val) { - assert(len_val0 == sizeof(Count)); - assert(len_val1 == sizeof(Count)); - - const Count* c0 = reinterpret_cast(val0); - const Count* c1 = reinterpret_cast(val1); - unique_ptr c((Count *)malloc(sizeof(Count))); // Needs to be with malloc, per merger spec. - - c->white = c0->white + c1->white; - c->draw = c0->draw + c1->draw; - c->black = c0->black + c1->black; - c->opening_num = c0->opening_num; // Arbitrary choice. - c->sum_white_elo = c0->sum_white_elo + c1->sum_white_elo; - c->sum_black_elo = c0->sum_black_elo + c1->sum_black_elo; - c->num_elo = c0->num_elo + c1->num_elo; - - *merged_val = reinterpret_cast(c.release()); - *len_merged_val = sizeof(Count); + Count c0, c1; + c0.ParseFromArray(val0, len_val0); + c1.ParseFromArray(val1, len_val1); + + Count c = merge_count(c0, c1); + + static string buf; // Keep allocated. + c.SerializeToString(&buf); + + *merged_val = reinterpret_cast(malloc(buf.size())); + *len_merged_val = buf.size(); + memcpy(*merged_val, buf.data(), buf.size()); } int main(int argc, char **argv) { mtbl_merger_options* mopt = mtbl_merger_options_init(); - mtbl_merger_options_set_merge_func(mopt, merge_count, NULL); + mtbl_merger_options_set_merge_func(mopt, merge_serialized_count, NULL); mtbl_merger* merger = mtbl_merger_init(mopt); for (int i = 1; i < argc - 1; ++i) { @@ -45,7 +41,9 @@ int main(int argc, char **argv) mtbl_merger_add_source(merger, mtbl_reader_source(mtbl)); } - mtbl_writer* writer = mtbl_writer_init(argv[argc - 1], NULL); + mtbl_writer_options* wopt = mtbl_writer_options_init(); + mtbl_writer_options_set_block_size(wopt, 65536); + mtbl_writer* writer = mtbl_writer_init(argv[argc - 1], wopt); mtbl_source_write(mtbl_merger_source(merger), writer); mtbl_writer_destroy(&writer); }