std::string big_endian_string(ulong input, std::size_t size) { char * buffer = new char[size]; write_big_endian(input, buffer, size); std::string output = std::string(buffer, size); delete buffer; return output; }
void save_server(FILE* fp, const server_base& server, const std::string& id) { init_versions(); msgpack::sbuffer system_data_buf; msgpack::pack(&system_data_buf, system_data_container(server, id)); msgpack::sbuffer user_data_buf; { core::framework::stream_writer<msgpack::sbuffer> st(user_data_buf); core::framework::jubatus_packer jp(st); core::framework::packer packer(jp); packer.pack_array(2); uint64_t user_data_version = server.user_data_version(); packer.pack(user_data_version); server.get_driver()->pack(packer); } char header_buf[48]; std::memcpy(header_buf, magic_number, 8); write_big_endian(format_version, &header_buf[8]); write_big_endian(jubatus_version_major, &header_buf[16]); write_big_endian(jubatus_version_minor, &header_buf[20]); write_big_endian(jubatus_version_maintenance, &header_buf[24]); // write_big_endian(crc32, &header_buf[28]); // skipped write_big_endian(static_cast<uint64_t>(system_data_buf.size()), &header_buf[32]); write_big_endian(static_cast<uint64_t>(user_data_buf.size()), &header_buf[40]); uint32_t crc32 = calc_crc32(header_buf, system_data_buf.data(), system_data_buf.size(), user_data_buf.data(), user_data_buf.size()); write_big_endian(crc32, &header_buf[28]); if (!fwrite_helper(header_buf, sizeof(header_buf), fp)) { throw std::ios_base::failure("Failed to write header_buf."); } if (!fwrite_helper(system_data_buf.data(), system_data_buf.size(), fp)) { throw std::ios_base::failure("Failed to write system_data_buf."); } if (!fwrite_helper(user_data_buf.data(), user_data_buf.size(), fp)) { throw std::ios_base::failure("Failed to write user_data_buf."); } }