/* * Copyright 2015 Cloudius Systems */ #ifndef DB_SERIALIZER_HH_ #define DB_SERIALIZER_HH_ #include "utils/data_input.hh" #include "utils/data_output.hh" #include "bytes_ostream.hh" #include "bytes.hh" #include "mutation.hh" #include "keys.hh" #include "database_fwd.hh" #include "frozen_mutation.hh" #include "db/commitlog/replay_position.hh" namespace db { /** * Serialization objects for various types and using "internal" format. (Not CQL, origin whatnot). * The design rationale is that a "serializer" can be instantiated for an object, and will contain * the obj + size, and is usable as a functor. * * Serialization can also be done "explicitly" through the static method "write" * (Not using "serialize", because writing "serializer::serialize" all the time is tiring and redundant) * though care should be takes than data will fit of course. */ template class serializer { public: typedef T type; typedef data_output output; typedef data_input input; typedef serializer _MyType; serializer(const type&); // apply to memory, must be at least size() large. const _MyType& operator()(output& out) const { write(out, _item); return *this; } static void write(output&, const T&); static void read(T&, input&); static T read(input&); static void skip(input& in); size_t size() const { return _size; } void write(bytes_ostream& out) const { auto buf = out.write_place_holder(_size); data_output data_out((char*)buf, _size); write(data_out, _item); } void write(data_output& out) const { write(out, _item); } private: const T& _item; size_t _size; }; template<> serializer::serializer(const utils::UUID &); template<> void serializer::write(output&, const type&); template<> void serializer::read(utils::UUID&, input&); template<> void serializer::skip(input&); template<> utils::UUID serializer::read(input&); template<> serializer::serializer(const bytes &); template<> void serializer::write(output&, const type&); template<> void serializer::read(bytes&, input&); template<> serializer::serializer(const bytes_view&); template<> void serializer::write(output&, const type&); template<> void serializer::read(bytes_view&, input&); template<> bytes_view serializer::read(input&); template<> serializer::serializer(const sstring&); template<> void serializer::write(output&, const type&); template<> void serializer::read(sstring&, input&); template<> serializer::serializer(const tombstone &); template<> void serializer::write(output&, const type&); template<> void serializer::read(tombstone&, input&); template<> serializer::serializer(const atomic_cell_view &); template<> void serializer::write(output&, const type&); template<> void serializer::read(atomic_cell_view&, input&); template<> atomic_cell_view serializer::read(input&); template<> serializer::serializer(const collection_mutation::view &); template<> void serializer::write(output&, const type&); template<> void serializer::read(collection_mutation::view&, input&); template<> serializer::serializer(const frozen_mutation &); template<> void serializer::write(output&, const type&); template<> void serializer::read(frozen_mutation&, input&) = delete; template<> frozen_mutation serializer::read(input&); template<> serializer::serializer(const partition_key_view &); template<> void serializer::write(output&, const partition_key_view&); template<> void serializer::read(partition_key_view&, input&); template<> partition_key_view serializer::read(input&); template<> void serializer::skip(input&); template<> serializer::serializer(const clustering_key_view &); template<> void serializer::write(output&, const clustering_key_view&); template<> void serializer::read(clustering_key_view&, input&); template<> clustering_key_view serializer::read(input&); template<> serializer::serializer(const clustering_key_prefix_view &); template<> void serializer::write(output&, const clustering_key_prefix_view&); template<> void serializer::read(clustering_key_prefix_view&, input&); template<> clustering_key_prefix_view serializer::read(input&); template<> serializer::serializer(const db::replay_position&); template<> void serializer::write(output&, const db::replay_position&); template<> void serializer::read(db::replay_position&, input&); template T serializer::read(input& in) { type t; read(t, in); return t; } extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; extern template class serializer; typedef serializer tombstone_serializer; typedef serializer bytes_serializer; // Compatible with bytes_view_serializer typedef serializer bytes_view_serializer; // Compatible with bytes_serializer typedef serializer sstring_serializer; typedef serializer atomic_cell_view_serializer; typedef serializer collection_mutation_view_serializer; typedef serializer uuid_serializer; typedef serializer partition_key_view_serializer; typedef serializer clustering_key_view_serializer; typedef serializer clustering_key_prefix_view_serializer; typedef serializer frozen_mutation_serializer; typedef serializer replay_position_serializer; } #endif /* DB_SERIALIZER_HH_ */