mirror of
https://github.com/boostorg/mysql.git
synced 2026-02-14 12:52:17 +00:00
Renamed (de)serialization contexts
This commit is contained in:
1
TODO.txt
1
TODO.txt
@@ -1,7 +1,6 @@
|
||||
Name change
|
||||
Refactor file structucture for serialization and tests
|
||||
Deserialize common should be in namespace mysql::test, not in detail
|
||||
Rename (De)SerializationContext
|
||||
Multiresultset
|
||||
Text protocol
|
||||
Binary protocol (stored procedures)
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace mysql {
|
||||
namespace detail {
|
||||
|
||||
using deserialize_row_fn = error_code (*)(
|
||||
DeserializationContext&,
|
||||
deserialization_context&,
|
||||
const std::vector<field_metadata>&,
|
||||
std::vector<value>&
|
||||
);
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
// Response may be: ok_packet, err_packet, local infile request (not implemented)
|
||||
// If it is none of this, then the message type itself is the beginning of
|
||||
// a length-encoded int containing the field count
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer_), channel_.current_capabilities());
|
||||
deserialization_context ctx (boost::asio::buffer(buffer_), channel_.current_capabilities());
|
||||
std::uint8_t msg_type;
|
||||
std::tie(err, msg_type) = deserialize_message_type(ctx);
|
||||
if (err) return {};
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
error_code process_field_definition()
|
||||
{
|
||||
column_definition_packet field_definition;
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer_), channel_.current_capabilities());
|
||||
deserialization_context ctx (boost::asio::buffer(buffer_), channel_.current_capabilities());
|
||||
auto err = deserialize_message(field_definition, ctx);
|
||||
if (err) return err;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ inline error_code deserialize_handshake(
|
||||
error_info& info
|
||||
)
|
||||
{
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer), capabilities());
|
||||
deserialization_context ctx (boost::asio::buffer(buffer), capabilities());
|
||||
auto [err, msg_type] = deserialize_message_type(ctx);
|
||||
if (err) return err;
|
||||
if (msg_type == handshake_protocol_version_9)
|
||||
@@ -161,7 +161,7 @@ public:
|
||||
error_info& info
|
||||
)
|
||||
{
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer), negotiated_caps_);
|
||||
deserialization_context ctx (boost::asio::buffer(buffer), negotiated_caps_);
|
||||
auto [err, msg_type] = deserialize_message_type(ctx);
|
||||
if (err) return err;
|
||||
if (msg_type == ok_packet_header)
|
||||
@@ -203,7 +203,7 @@ public:
|
||||
error_info& info
|
||||
)
|
||||
{
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer), negotiated_caps_);
|
||||
deserialization_context ctx (boost::asio::buffer(buffer), negotiated_caps_);
|
||||
auto [err, msg_type] = deserialize_message_type(ctx);
|
||||
if (err) return err;
|
||||
if (msg_type == error_packet_header)
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
}
|
||||
void process_response(error_code& err, error_info& info)
|
||||
{
|
||||
DeserializationContext ctx (
|
||||
deserialization_context ctx (
|
||||
boost::asio::buffer(channel_.shared_buffer()),
|
||||
channel_.current_capabilities()
|
||||
);
|
||||
|
||||
@@ -23,7 +23,7 @@ inline read_row_result process_read_message(
|
||||
|
||||
// Message type: row, error or eof?
|
||||
std::uint8_t msg_type;
|
||||
DeserializationContext ctx (boost::asio::buffer(buffer), current_capabilities);
|
||||
deserialization_context ctx (boost::asio::buffer(buffer), current_capabilities);
|
||||
std::tie(err, msg_type) = deserialize_message_type(ctx);
|
||||
if (err) return read_row_result::error;
|
||||
if (msg_type == eof_packet_header)
|
||||
|
||||
@@ -12,13 +12,13 @@ namespace mysql {
|
||||
namespace detail {
|
||||
|
||||
inline errc deserialize_binary_value(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const field_metadata& meta,
|
||||
value& output
|
||||
);
|
||||
|
||||
inline error_code deserialize_binary_row(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const std::vector<field_metadata>& meta,
|
||||
std::vector<value>& output
|
||||
);
|
||||
|
||||
@@ -10,20 +10,20 @@ namespace boost {
|
||||
namespace mysql {
|
||||
namespace detail {
|
||||
|
||||
inline std::size_t get_size(const date& input, const SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const date& input, SerializationContext& ctx) noexcept;
|
||||
inline errc deserialize(date& output, DeserializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const date& input, const serialization_context& ctx) noexcept;
|
||||
inline void serialize(const date& input, serialization_context& ctx) noexcept;
|
||||
inline errc deserialize(date& output, deserialization_context& ctx) noexcept;
|
||||
|
||||
inline std::size_t get_size(const datetime& input, const SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const datetime& input, SerializationContext& ctx) noexcept;
|
||||
inline errc deserialize(datetime& output, DeserializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const datetime& input, const serialization_context& ctx) noexcept;
|
||||
inline void serialize(const datetime& input, serialization_context& ctx) noexcept;
|
||||
inline errc deserialize(datetime& output, deserialization_context& ctx) noexcept;
|
||||
|
||||
inline std::size_t get_size(const time& input, const SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const time& input, SerializationContext& ctx) noexcept;
|
||||
inline errc deserialize(time& output, DeserializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const time& input, const serialization_context& ctx) noexcept;
|
||||
inline void serialize(const time& input, serialization_context& ctx) noexcept;
|
||||
inline errc deserialize(time& output, deserialization_context& ctx) noexcept;
|
||||
|
||||
inline std::size_t get_size(const value& input, const SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const value& input, SerializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const value& input, const serialization_context& ctx) noexcept;
|
||||
inline void serialize(const value& input, serialization_context& ctx) noexcept;
|
||||
|
||||
} // detail
|
||||
} // mysql
|
||||
|
||||
@@ -87,7 +87,7 @@ inline binary_protocol_value get_deserializable_type(
|
||||
} // boost
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize_binary_value(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const field_metadata& meta,
|
||||
value& output
|
||||
)
|
||||
@@ -117,7 +117,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize_binary_value(
|
||||
}
|
||||
|
||||
inline boost::mysql::error_code boost::mysql::detail::deserialize_binary_row(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const std::vector<field_metadata>& meta,
|
||||
std::vector<value>& output
|
||||
)
|
||||
|
||||
@@ -30,7 +30,7 @@ inline get_serializable_type_t<T> to_serializable_type(T input) noexcept
|
||||
}
|
||||
|
||||
|
||||
inline errc deserialize_binary_date(date& output, std::uint8_t length, DeserializationContext& ctx) noexcept
|
||||
inline errc deserialize_binary_date(date& output, std::uint8_t length, deserialization_context& ctx) noexcept
|
||||
{
|
||||
int2 year;
|
||||
int1 month;
|
||||
@@ -51,7 +51,7 @@ inline errc deserialize_binary_date(date& output, std::uint8_t length, Deseriali
|
||||
// Does not add the length prefix byte
|
||||
inline void serialize_binary_ymd(
|
||||
const ::date::year_month_day& ymd,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
serialize_fields(
|
||||
@@ -134,7 +134,7 @@ struct broken_time
|
||||
// date
|
||||
inline std::size_t boost::mysql::detail::get_size(
|
||||
const date&,
|
||||
const SerializationContext&
|
||||
const serialization_context&
|
||||
) noexcept
|
||||
{
|
||||
// TODO: consider zero dates?
|
||||
@@ -143,7 +143,7 @@ inline std::size_t boost::mysql::detail::get_size(
|
||||
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const date& input,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
// TODO: consider zero dates?
|
||||
@@ -153,7 +153,7 @@ inline void boost::mysql::detail::serialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
date& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
int1 length;
|
||||
@@ -165,7 +165,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
// datetime
|
||||
inline std::size_t boost::mysql::detail::get_size(
|
||||
const datetime& input,
|
||||
const SerializationContext&
|
||||
const serialization_context&
|
||||
) noexcept
|
||||
{
|
||||
broken_datetime dt (input);
|
||||
@@ -174,7 +174,7 @@ inline std::size_t boost::mysql::detail::get_size(
|
||||
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const datetime& input,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
broken_datetime brokendt (input);
|
||||
@@ -202,7 +202,7 @@ inline void boost::mysql::detail::serialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
datetime& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
int1 length;
|
||||
@@ -240,7 +240,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
// time
|
||||
inline std::size_t boost::mysql::detail::get_size(
|
||||
const time& input,
|
||||
const SerializationContext&
|
||||
const serialization_context&
|
||||
) noexcept
|
||||
{
|
||||
return broken_time(input).binary_serialized_length() + 1; // length byte
|
||||
@@ -248,7 +248,7 @@ inline std::size_t boost::mysql::detail::get_size(
|
||||
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const time& input,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
broken_time broken (input);
|
||||
@@ -275,7 +275,7 @@ inline void boost::mysql::detail::serialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
time& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
// Length
|
||||
@@ -321,7 +321,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
// mysql::value
|
||||
inline std::size_t boost::mysql::detail::get_size(
|
||||
const value& input,
|
||||
const SerializationContext& ctx
|
||||
const serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
return std::visit([&ctx](const auto& v) {
|
||||
@@ -331,7 +331,7 @@ inline std::size_t boost::mysql::detail::get_size(
|
||||
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const value& input,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
std::visit([&ctx](const auto& v) {
|
||||
|
||||
@@ -50,7 +50,7 @@ boost::mysql::error_code boost::mysql::detail::channel<AsyncStream>::process_hea
|
||||
)
|
||||
{
|
||||
packet_header header;
|
||||
DeserializationContext ctx (boost::asio::buffer(header_buffer_), capabilities(0)); // unaffected by capabilities
|
||||
deserialization_context ctx (boost::asio::buffer(header_buffer_), capabilities(0)); // unaffected by capabilities
|
||||
[[maybe_unused]] errc err = deserialize(header, ctx);
|
||||
assert(err == errc::ok); // this should always succeed
|
||||
if (!process_sequence_number(header.sequence_number.value))
|
||||
@@ -69,7 +69,7 @@ void boost::mysql::detail::channel<AsyncStream>::process_header_write(
|
||||
packet_header header;
|
||||
header.packet_size.value = size_to_write;
|
||||
header.sequence_number.value = next_sequence_number();
|
||||
SerializationContext ctx (capabilities(0), header_buffer_.data()); // capabilities not relevant here
|
||||
serialization_context ctx (capabilities(0), header_buffer_.data()); // capabilities not relevant here
|
||||
serialize(header, ctx);
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ inline bool is_unsigned(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
ok_packet& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
auto err = deserialize_fields(
|
||||
@@ -72,7 +72,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
handshake_packet& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
constexpr std::uint8_t auth1_length = 8;
|
||||
@@ -136,7 +136,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
|
||||
std::size_t boost::mysql::detail::get_size(
|
||||
const handshake_response_packet& value,
|
||||
const SerializationContext& ctx
|
||||
const serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
std::size_t res =
|
||||
@@ -156,7 +156,7 @@ std::size_t boost::mysql::detail::get_size(
|
||||
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const handshake_response_packet& value,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
serialize(value.client_flag, ctx);
|
||||
@@ -175,7 +175,7 @@ inline void boost::mysql::detail::serialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
auth_switch_request_packet& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
auto err = deserialize_fields(ctx, output.plugin_name, output.auth_plugin_data);
|
||||
@@ -191,7 +191,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
column_definition_packet& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
int_lenenc length_of_fixed_fields;
|
||||
@@ -216,7 +216,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
|
||||
inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
com_stmt_prepare_ok_packet& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
int1 reserved;
|
||||
@@ -233,7 +233,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize(
|
||||
template <typename ForwardIterator>
|
||||
inline std::size_t boost::mysql::detail::get_size(
|
||||
const com_stmt_execute_packet<ForwardIterator>& value,
|
||||
const SerializationContext& ctx
|
||||
const serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
std::size_t res = 1 + // command ID
|
||||
@@ -255,7 +255,7 @@ inline std::size_t boost::mysql::detail::get_size(
|
||||
template <typename ForwardIterator>
|
||||
inline void boost::mysql::detail::serialize(
|
||||
const com_stmt_execute_packet<ForwardIterator>& input,
|
||||
SerializationContext& ctx
|
||||
serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
serialize(int1(com_stmt_execute_packet<ForwardIterator>::command_id), ctx);
|
||||
@@ -306,7 +306,7 @@ void boost::mysql::detail::serialize_message(
|
||||
basic_bytestring<Allocator>& buffer
|
||||
)
|
||||
{
|
||||
SerializationContext ctx (caps);
|
||||
serialization_context ctx (caps);
|
||||
std::size_t size = get_size(input, ctx);
|
||||
buffer.resize(size);
|
||||
ctx.set_first(buffer.data());
|
||||
@@ -317,7 +317,7 @@ void boost::mysql::detail::serialize_message(
|
||||
template <typename Deserializable>
|
||||
boost::mysql::error_code boost::mysql::detail::deserialize_message(
|
||||
Deserializable& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
)
|
||||
{
|
||||
auto err = deserialize(output, ctx);
|
||||
@@ -329,7 +329,7 @@ boost::mysql::error_code boost::mysql::detail::deserialize_message(
|
||||
|
||||
inline std::pair<boost::mysql::error_code, std::uint8_t>
|
||||
boost::mysql::detail::deserialize_message_type(
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
)
|
||||
{
|
||||
int1 msg_type;
|
||||
@@ -347,7 +347,7 @@ boost::mysql::detail::deserialize_message_type(
|
||||
}
|
||||
|
||||
inline boost::mysql::error_code boost::mysql::detail::process_error_packet(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
error_info& info
|
||||
)
|
||||
{
|
||||
|
||||
@@ -125,7 +125,7 @@ errc deserialize_text_value_to_variant(std::string_view from, value& to, Args&&.
|
||||
}
|
||||
|
||||
inline bool is_next_field_null(
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
)
|
||||
{
|
||||
int1 type_byte;
|
||||
@@ -198,7 +198,7 @@ inline boost::mysql::errc boost::mysql::detail::deserialize_text_value(
|
||||
|
||||
|
||||
boost::mysql::error_code boost::mysql::detail::deserialize_text_row(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const std::vector<field_metadata>& fields,
|
||||
std::vector<value>& output
|
||||
)
|
||||
|
||||
@@ -300,19 +300,19 @@ struct get_struct_fields<com_stmt_close_packet>
|
||||
|
||||
|
||||
// serialization functions
|
||||
inline errc deserialize(ok_packet& output, DeserializationContext& ctx) noexcept;
|
||||
inline errc deserialize(handshake_packet& output, DeserializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const handshake_response_packet& value, const SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const handshake_response_packet& value, SerializationContext& ctx) noexcept;
|
||||
inline errc deserialize(auth_switch_request_packet& output, DeserializationContext& ctx) noexcept;
|
||||
inline errc deserialize(column_definition_packet& output, DeserializationContext& ctx) noexcept;
|
||||
inline errc deserialize(com_stmt_prepare_ok_packet& output, DeserializationContext& ctx) noexcept;
|
||||
inline errc deserialize(ok_packet& output, deserialization_context& ctx) noexcept;
|
||||
inline errc deserialize(handshake_packet& output, deserialization_context& ctx) noexcept;
|
||||
inline std::size_t get_size(const handshake_response_packet& value, const serialization_context& ctx) noexcept;
|
||||
inline void serialize(const handshake_response_packet& value, serialization_context& ctx) noexcept;
|
||||
inline errc deserialize(auth_switch_request_packet& output, deserialization_context& ctx) noexcept;
|
||||
inline errc deserialize(column_definition_packet& output, deserialization_context& ctx) noexcept;
|
||||
inline errc deserialize(com_stmt_prepare_ok_packet& output, deserialization_context& ctx) noexcept;
|
||||
|
||||
template <typename FowardIterator>
|
||||
inline std::size_t get_size(const com_stmt_execute_packet<FowardIterator>& value, const SerializationContext& ctx) noexcept;
|
||||
inline std::size_t get_size(const com_stmt_execute_packet<FowardIterator>& value, const serialization_context& ctx) noexcept;
|
||||
|
||||
template <typename FowardIterator>
|
||||
inline void serialize(const com_stmt_execute_packet<FowardIterator>& input, SerializationContext& ctx) noexcept;
|
||||
inline void serialize(const com_stmt_execute_packet<FowardIterator>& input, serialization_context& ctx) noexcept;
|
||||
|
||||
|
||||
|
||||
@@ -327,14 +327,14 @@ void serialize_message(
|
||||
template <typename Deserializable>
|
||||
error_code deserialize_message(
|
||||
Deserializable& output,
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
);
|
||||
|
||||
inline std::pair<error_code, std::uint8_t> deserialize_message_type(
|
||||
DeserializationContext& ctx
|
||||
deserialization_context& ctx
|
||||
);
|
||||
|
||||
inline error_code process_error_packet(DeserializationContext& ctx, error_info& info);
|
||||
inline error_code process_error_packet(deserialization_context& ctx, error_info& info);
|
||||
|
||||
} // detail
|
||||
} // mysql
|
||||
|
||||
@@ -17,16 +17,16 @@ namespace boost {
|
||||
namespace mysql {
|
||||
namespace detail {
|
||||
|
||||
class DeserializationContext
|
||||
class deserialization_context
|
||||
{
|
||||
ReadIterator first_;
|
||||
ReadIterator last_;
|
||||
capabilities capabilities_;
|
||||
public:
|
||||
DeserializationContext(ReadIterator first, ReadIterator last, capabilities caps) noexcept:
|
||||
deserialization_context(ReadIterator first, ReadIterator last, capabilities caps) noexcept:
|
||||
first_(first), last_(last), capabilities_(caps) { assert(last_ >= first_); };
|
||||
DeserializationContext(boost::asio::const_buffer buff, capabilities caps) noexcept:
|
||||
DeserializationContext(
|
||||
deserialization_context(boost::asio::const_buffer buff, capabilities caps) noexcept:
|
||||
deserialization_context(
|
||||
static_cast<const std::uint8_t*>(buff.data()),
|
||||
static_cast<const std::uint8_t*>(buff.data()) + buff.size(),
|
||||
caps
|
||||
@@ -49,12 +49,12 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class SerializationContext
|
||||
class serialization_context
|
||||
{
|
||||
WriteIterator first_;
|
||||
capabilities capabilities_;
|
||||
public:
|
||||
SerializationContext(capabilities caps, WriteIterator first = nullptr) noexcept:
|
||||
serialization_context(capabilities caps, WriteIterator first = nullptr) noexcept:
|
||||
first_(first), capabilities_(caps) {};
|
||||
WriteIterator first() const noexcept { return first_; }
|
||||
void set_first(WriteIterator new_first) noexcept { first_ = new_first; }
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
|
||||
/**
|
||||
* Base forms:
|
||||
* errc deserialize(T& output, DeserializationContext&) noexcept
|
||||
* errc deserialize(T& output, deserialization_context&) noexcept
|
||||
* void serialize(const T& input, SerializationContext&) noexcept
|
||||
* std::size_t get_size(const T& input, const SerializationContext&) noexcept
|
||||
*/
|
||||
@@ -132,7 +132,7 @@ template <std::size_t size> void native_to_little_inplace(string_fixed<size>&) n
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<is_fixed_size_v<T>, errc>
|
||||
deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
deserialize(T& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
static_assert(std::is_standard_layout_v<decltype(T::value)>);
|
||||
|
||||
@@ -152,7 +152,7 @@ deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<is_fixed_size_v<T>>
|
||||
serialize(T input, SerializationContext& ctx) noexcept
|
||||
serialize(T input, serialization_context& ctx) noexcept
|
||||
{
|
||||
native_to_little_inplace(input);
|
||||
ctx.write(&input.value, get_fixed_size<T>::value);
|
||||
@@ -160,13 +160,13 @@ serialize(T input, SerializationContext& ctx) noexcept
|
||||
|
||||
template <typename T>
|
||||
constexpr std::enable_if_t<is_fixed_size_v<T>, std::size_t>
|
||||
get_size(T, const SerializationContext&) noexcept
|
||||
get_size(T, const serialization_context&) noexcept
|
||||
{
|
||||
return get_fixed_size<T>::value;
|
||||
}
|
||||
|
||||
// int_lenenc
|
||||
inline errc deserialize(int_lenenc& output, DeserializationContext& ctx) noexcept
|
||||
inline errc deserialize(int_lenenc& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
int1 first_byte;
|
||||
errc err = deserialize(first_byte, ctx);
|
||||
@@ -200,7 +200,7 @@ inline errc deserialize(int_lenenc& output, DeserializationContext& ctx) noexcep
|
||||
}
|
||||
return err;
|
||||
}
|
||||
inline void serialize(int_lenenc input, SerializationContext& ctx) noexcept
|
||||
inline void serialize(int_lenenc input, serialization_context& ctx) noexcept
|
||||
{
|
||||
if (input.value < 251)
|
||||
{
|
||||
@@ -222,7 +222,7 @@ inline void serialize(int_lenenc input, SerializationContext& ctx) noexcept
|
||||
serialize(int8(static_cast<std::uint64_t>(input.value)), ctx);
|
||||
}
|
||||
}
|
||||
inline std::size_t get_size(int_lenenc input, const SerializationContext&) noexcept
|
||||
inline std::size_t get_size(int_lenenc input, const serialization_context&) noexcept
|
||||
{
|
||||
if (input.value < 251) return 1;
|
||||
else if (input.value < 0x10000) return 3;
|
||||
@@ -237,7 +237,7 @@ inline std::string_view get_string(ReadIterator from, std::size_t size)
|
||||
}
|
||||
|
||||
// string_null
|
||||
inline errc deserialize(string_null& output, DeserializationContext& ctx) noexcept
|
||||
inline errc deserialize(string_null& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
ReadIterator string_end = std::find(ctx.first(), ctx.last(), 0);
|
||||
if (string_end == ctx.last())
|
||||
@@ -248,34 +248,34 @@ inline errc deserialize(string_null& output, DeserializationContext& ctx) noexce
|
||||
ctx.set_first(string_end + 1); // skip the null terminator
|
||||
return errc::ok;
|
||||
}
|
||||
inline void serialize(string_null input, SerializationContext& ctx) noexcept
|
||||
inline void serialize(string_null input, serialization_context& ctx) noexcept
|
||||
{
|
||||
ctx.write(input.value.data(), input.value.size());
|
||||
ctx.write(0); // null terminator
|
||||
}
|
||||
inline std::size_t get_size(string_null input, const SerializationContext&) noexcept
|
||||
inline std::size_t get_size(string_null input, const serialization_context&) noexcept
|
||||
{
|
||||
return input.value.size() + 1;
|
||||
}
|
||||
|
||||
// string_eof
|
||||
inline errc deserialize(string_eof& output, DeserializationContext& ctx) noexcept
|
||||
inline errc deserialize(string_eof& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
output.value = get_string(ctx.first(), ctx.last()-ctx.first());
|
||||
ctx.set_first(ctx.last());
|
||||
return errc::ok;
|
||||
}
|
||||
inline void serialize(string_eof input, SerializationContext& ctx) noexcept
|
||||
inline void serialize(string_eof input, serialization_context& ctx) noexcept
|
||||
{
|
||||
ctx.write(input.value.data(), input.value.size());
|
||||
}
|
||||
inline std::size_t get_size(string_eof input, const SerializationContext&) noexcept
|
||||
inline std::size_t get_size(string_eof input, const serialization_context&) noexcept
|
||||
{
|
||||
return input.value.size();
|
||||
}
|
||||
|
||||
// string_lenenc
|
||||
inline errc deserialize(string_lenenc& output, DeserializationContext& ctx) noexcept
|
||||
inline errc deserialize(string_lenenc& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
int_lenenc length;
|
||||
errc err = deserialize(length, ctx);
|
||||
@@ -292,14 +292,14 @@ inline errc deserialize(string_lenenc& output, DeserializationContext& ctx) noex
|
||||
ctx.advance(length.value);
|
||||
return errc::ok;
|
||||
}
|
||||
inline void serialize(string_lenenc input, SerializationContext& ctx) noexcept
|
||||
inline void serialize(string_lenenc input, serialization_context& ctx) noexcept
|
||||
{
|
||||
int_lenenc length;
|
||||
length.value = input.value.size();
|
||||
serialize(length, ctx);
|
||||
ctx.write(input.value.data(), input.value.size());
|
||||
}
|
||||
inline std::size_t get_size(string_lenenc input, const SerializationContext& ctx) noexcept
|
||||
inline std::size_t get_size(string_lenenc input, const serialization_context& ctx) noexcept
|
||||
{
|
||||
int_lenenc length;
|
||||
length.value = input.value.size();
|
||||
@@ -308,7 +308,7 @@ inline std::size_t get_size(string_lenenc input, const SerializationContext& ctx
|
||||
|
||||
// Enums
|
||||
template <typename T, typename=std::enable_if_t<std::is_enum_v<T>>>
|
||||
errc deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
errc deserialize(T& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
value_holder<std::underlying_type_t<T>> value;
|
||||
errc err = deserialize(value, ctx);
|
||||
@@ -321,21 +321,21 @@ errc deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
}
|
||||
|
||||
template <typename T, typename=std::enable_if_t<std::is_enum_v<T>>>
|
||||
void serialize(T input, SerializationContext& ctx) noexcept
|
||||
void serialize(T input, serialization_context& ctx) noexcept
|
||||
{
|
||||
value_holder<std::underlying_type_t<T>> value {static_cast<std::underlying_type_t<T>>(input)};
|
||||
serialize(value, ctx);
|
||||
}
|
||||
|
||||
template <typename T, typename=std::enable_if_t<std::is_enum_v<T>>>
|
||||
std::size_t get_size(T, const SerializationContext&) noexcept
|
||||
std::size_t get_size(T, const serialization_context&) noexcept
|
||||
{
|
||||
return get_fixed_size<value_holder<std::underlying_type_t<T>>>::value;
|
||||
}
|
||||
|
||||
// Floating points
|
||||
template <typename T, typename=std::enable_if_t<std::is_floating_point_v<T>>>
|
||||
errc deserialize(value_holder<T>& output, DeserializationContext& ctx) noexcept
|
||||
errc deserialize(value_holder<T>& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
// Size check
|
||||
if (!ctx.enough_size(sizeof(T))) return errc::incomplete_message;
|
||||
@@ -355,7 +355,7 @@ errc deserialize(value_holder<T>& output, DeserializationContext& ctx) noexcept
|
||||
}
|
||||
|
||||
template <typename T, typename=std::enable_if_t<std::is_floating_point_v<T>>>
|
||||
void serialize(const value_holder<T>& input, SerializationContext& ctx) noexcept
|
||||
void serialize(const value_holder<T>& input, serialization_context& ctx) noexcept
|
||||
{
|
||||
// Endianness conversion
|
||||
#if BOOST_ENDIAN_BIG_BYTE
|
||||
@@ -369,7 +369,7 @@ void serialize(const value_holder<T>& input, SerializationContext& ctx) noexcept
|
||||
}
|
||||
|
||||
template <typename T, typename=std::enable_if_t<std::is_floating_point_v<T>>>
|
||||
std::size_t get_size(const value_holder<T>&, const SerializationContext&) noexcept
|
||||
std::size_t get_size(const value_holder<T>&, const serialization_context&) noexcept
|
||||
{
|
||||
return sizeof(T);
|
||||
}
|
||||
@@ -412,7 +412,7 @@ struct is_command : decltype(is_command_helper::get<T>(nullptr))
|
||||
template <std::size_t index, typename T>
|
||||
errc deserialize_struct(
|
||||
[[maybe_unused]] T& output,
|
||||
[[maybe_unused]] DeserializationContext& ctx
|
||||
[[maybe_unused]] deserialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
constexpr auto fields = get_struct_fields<T>::value;
|
||||
@@ -437,7 +437,7 @@ errc deserialize_struct(
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<is_struct_with_fields<T>::value, errc>
|
||||
deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
deserialize(T& output, deserialization_context& ctx) noexcept
|
||||
{
|
||||
return deserialize_struct<0>(output, ctx);
|
||||
}
|
||||
@@ -445,7 +445,7 @@ deserialize(T& output, DeserializationContext& ctx) noexcept
|
||||
template <std::size_t index, typename T>
|
||||
void serialize_struct(
|
||||
[[maybe_unused]] const T& value,
|
||||
[[maybe_unused]] SerializationContext& ctx
|
||||
[[maybe_unused]] serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
constexpr auto fields = get_struct_fields<T>::value;
|
||||
@@ -461,7 +461,7 @@ template <typename T>
|
||||
std::enable_if_t<is_struct_with_fields<T>::value>
|
||||
serialize(
|
||||
[[maybe_unused]] const T& input,
|
||||
[[maybe_unused]] SerializationContext& ctx
|
||||
[[maybe_unused]] serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
// For commands, add the command ID. Commands are only sent by the client,
|
||||
@@ -476,7 +476,7 @@ serialize(
|
||||
template <std::size_t index, typename T>
|
||||
std::size_t get_size_struct(
|
||||
[[maybe_unused]] const T& input,
|
||||
[[maybe_unused]] const SerializationContext& ctx
|
||||
[[maybe_unused]] const serialization_context& ctx
|
||||
) noexcept
|
||||
{
|
||||
constexpr auto fields = get_struct_fields<T>::value;
|
||||
@@ -494,7 +494,7 @@ std::size_t get_size_struct(
|
||||
|
||||
template <typename T>
|
||||
std::enable_if_t<is_struct_with_fields<T>::value, std::size_t>
|
||||
get_size(const T& input, const SerializationContext& ctx) noexcept
|
||||
get_size(const T& input, const serialization_context& ctx) noexcept
|
||||
{
|
||||
std::size_t res = is_command<T>::value ? 1 : 0;
|
||||
res += get_size_struct<0>(input, ctx);
|
||||
@@ -503,10 +503,10 @@ get_size(const T& input, const SerializationContext& ctx) noexcept
|
||||
|
||||
// Helper to write custom struct (de)serialize()
|
||||
template <typename FirstType>
|
||||
errc deserialize_fields(DeserializationContext& ctx, FirstType& field) noexcept { return deserialize(field, ctx); }
|
||||
errc deserialize_fields(deserialization_context& ctx, FirstType& field) noexcept { return deserialize(field, ctx); }
|
||||
|
||||
template <typename FirstType, typename... Types>
|
||||
errc deserialize_fields(DeserializationContext& ctx, FirstType& field, Types&... fields_tail) noexcept
|
||||
errc deserialize_fields(deserialization_context& ctx, FirstType& field, Types&... fields_tail) noexcept
|
||||
{
|
||||
errc err = deserialize(field, ctx);
|
||||
if (err == errc::ok)
|
||||
@@ -517,10 +517,10 @@ errc deserialize_fields(DeserializationContext& ctx, FirstType& field, Types&...
|
||||
}
|
||||
|
||||
template <typename FirstType>
|
||||
void serialize_fields(SerializationContext& ctx, const FirstType& field) noexcept { serialize(field, ctx); }
|
||||
void serialize_fields(serialization_context& ctx, const FirstType& field) noexcept { serialize(field, ctx); }
|
||||
|
||||
template <typename FirstType, typename... Types>
|
||||
void serialize_fields(SerializationContext& ctx, const FirstType& field, const Types&... fields_tail)
|
||||
void serialize_fields(serialization_context& ctx, const FirstType& field, const Types&... fields_tail)
|
||||
{
|
||||
serialize(field, ctx);
|
||||
serialize_fields(ctx, fields_tail...);
|
||||
@@ -531,9 +531,9 @@ struct dummy_serializable
|
||||
{
|
||||
dummy_serializable(...) {} // Make it constructible from anything
|
||||
};
|
||||
inline std::size_t get_size(dummy_serializable, const SerializationContext&) noexcept { return 0; }
|
||||
inline void serialize(dummy_serializable, SerializationContext&) noexcept {}
|
||||
inline errc deserialize(dummy_serializable, DeserializationContext&) noexcept { return errc::ok; }
|
||||
inline std::size_t get_size(dummy_serializable, const serialization_context&) noexcept { return 0; }
|
||||
inline void serialize(dummy_serializable, serialization_context&) noexcept {}
|
||||
inline errc deserialize(dummy_serializable, deserialization_context&) noexcept { return errc::ok; }
|
||||
|
||||
} // detail
|
||||
} // mysql
|
||||
|
||||
@@ -18,7 +18,7 @@ inline errc deserialize_text_value(
|
||||
);
|
||||
|
||||
inline error_code deserialize_text_row(
|
||||
DeserializationContext& ctx,
|
||||
deserialization_context& ctx,
|
||||
const std::vector<field_metadata>& meta,
|
||||
std::vector<value>& output
|
||||
);
|
||||
|
||||
@@ -94,9 +94,9 @@ class TypeErasedValue
|
||||
{
|
||||
public:
|
||||
virtual ~TypeErasedValue() {}
|
||||
virtual void serialize(SerializationContext& ctx) const = 0;
|
||||
virtual std::size_t get_size(const SerializationContext& ctx) const = 0;
|
||||
virtual errc deserialize(DeserializationContext& ctx) = 0;
|
||||
virtual void serialize(serialization_context& ctx) const = 0;
|
||||
virtual std::size_t get_size(const serialization_context& ctx) const = 0;
|
||||
virtual errc deserialize(deserialization_context& ctx) = 0;
|
||||
virtual std::shared_ptr<TypeErasedValue> default_construct() const = 0;
|
||||
virtual bool equals(const TypeErasedValue& rhs) const = 0;
|
||||
virtual void print(std::ostream& os) const = 0;
|
||||
@@ -115,9 +115,9 @@ class TypeErasedValueImpl : public TypeErasedValue
|
||||
T value_;
|
||||
public:
|
||||
TypeErasedValueImpl(const T& v): value_(v) {};
|
||||
void serialize(SerializationContext& ctx) const override { ::boost::mysql::detail::serialize(value_, ctx); }
|
||||
std::size_t get_size(const SerializationContext& ctx) const override { return ::boost::mysql::detail::get_size(value_, ctx); }
|
||||
errc deserialize(DeserializationContext& ctx) override { return ::boost::mysql::detail::deserialize(value_, ctx); }
|
||||
void serialize(serialization_context& ctx) const override { ::boost::mysql::detail::serialize(value_, ctx); }
|
||||
std::size_t get_size(const serialization_context& ctx) const override { return ::boost::mysql::detail::get_size(value_, ctx); }
|
||||
errc deserialize(deserialization_context& ctx) override { return ::boost::mysql::detail::deserialize(value_, ctx); }
|
||||
std::shared_ptr<TypeErasedValue> default_construct() const override
|
||||
{
|
||||
return std::make_shared<TypeErasedValueImpl<T>>(T{});
|
||||
@@ -168,7 +168,7 @@ struct SerializationFixture : public testing::TestWithParam<SerializeParams>
|
||||
// get_size
|
||||
void get_size_test()
|
||||
{
|
||||
SerializationContext ctx (GetParam().caps, nullptr);
|
||||
serialization_context ctx (GetParam().caps, nullptr);
|
||||
auto size = GetParam().value->get_size(ctx);
|
||||
EXPECT_EQ(size, GetParam().expected_buffer.size());
|
||||
}
|
||||
@@ -178,7 +178,7 @@ struct SerializationFixture : public testing::TestWithParam<SerializeParams>
|
||||
{
|
||||
auto expected_size = GetParam().expected_buffer.size();
|
||||
std::vector<uint8_t> buffer (expected_size + 8, 0x7a); // buffer overrun detector
|
||||
SerializationContext ctx (GetParam().caps, buffer.data());
|
||||
serialization_context ctx (GetParam().caps, buffer.data());
|
||||
GetParam().value->serialize(ctx);
|
||||
|
||||
// Iterator
|
||||
@@ -200,7 +200,7 @@ struct SerializationFixture : public testing::TestWithParam<SerializeParams>
|
||||
{
|
||||
auto first = GetParam().expected_buffer.data();
|
||||
auto size = GetParam().expected_buffer.size();
|
||||
DeserializationContext ctx (first, first + size, GetParam().caps);
|
||||
deserialization_context ctx (first, first + size, GetParam().caps);
|
||||
auto actual_value = GetParam().value->default_construct();
|
||||
auto err = actual_value->deserialize(ctx);
|
||||
|
||||
@@ -219,7 +219,7 @@ struct SerializationFixture : public testing::TestWithParam<SerializeParams>
|
||||
std::vector<uint8_t> buffer (GetParam().expected_buffer);
|
||||
buffer.push_back(0xff);
|
||||
auto first = buffer.data();
|
||||
DeserializationContext ctx (first, first + buffer.size(), GetParam().caps);
|
||||
deserialization_context ctx (first, first + buffer.size(), GetParam().caps);
|
||||
auto actual_value = GetParam().value->default_construct();
|
||||
auto err = actual_value->deserialize(ctx);
|
||||
|
||||
@@ -237,7 +237,7 @@ struct SerializationFixture : public testing::TestWithParam<SerializeParams>
|
||||
{
|
||||
std::vector<uint8_t> buffer (GetParam().expected_buffer);
|
||||
buffer.back() = 0x7a; // try to detect any overruns
|
||||
DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size() - 1, GetParam().caps);
|
||||
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size() - 1, GetParam().caps);
|
||||
auto actual_value = GetParam().value->default_construct();
|
||||
auto err = actual_value->deserialize(ctx);
|
||||
EXPECT_EQ(err, errc::incomplete_message);
|
||||
@@ -302,7 +302,7 @@ TEST_P(DeserializeErrorTest, Deserialize_ErrorCondition_ReturnsErrorCode)
|
||||
{
|
||||
auto first = GetParam().buffer.data();
|
||||
auto last = GetParam().buffer.data() + GetParam().buffer.size();
|
||||
DeserializationContext ctx (first, last, capabilities(0));
|
||||
deserialization_context ctx (first, last, capabilities(0));
|
||||
auto value = GetParam().value->default_construct();
|
||||
auto err = value->deserialize(ctx);
|
||||
EXPECT_EQ(err, GetParam().expected_error);
|
||||
|
||||
@@ -73,7 +73,7 @@ TEST_P(DeserializeBinaryValueTest, CorrectFormat_SetsOutputValueReturnsTrue)
|
||||
boost::mysql::field_metadata meta (coldef);
|
||||
value actual_value;
|
||||
const auto& buffer = GetParam().from;
|
||||
DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
auto err = deserialize_binary_value(ctx, meta, actual_value);
|
||||
EXPECT_EQ(err, errc::ok);
|
||||
EXPECT_EQ(actual_value, GetParam().expected);
|
||||
@@ -166,7 +166,7 @@ TEST_P(DeserializeBinaryRowTest, CorrectFormat_SetsOutputValueReturnsTrue)
|
||||
{
|
||||
auto meta = make_meta(GetParam().types);
|
||||
const auto& buffer = GetParam().from;
|
||||
DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
|
||||
std::vector<value> actual;
|
||||
auto err = deserialize_binary_row(ctx, meta, actual);
|
||||
@@ -242,7 +242,7 @@ TEST_P(DeserializeBinaryRowErrorTest, ErrorCondition_ReturnsErrorCode)
|
||||
{
|
||||
auto meta = make_meta(GetParam().types);
|
||||
const auto& buffer = GetParam().from;
|
||||
DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
|
||||
std::vector<value> actual;
|
||||
auto err = deserialize_binary_row(ctx, meta, actual);
|
||||
|
||||
@@ -340,7 +340,7 @@ struct DeserializeTextRowTest : public Test
|
||||
|
||||
error_code deserialize(const std::vector<std::uint8_t>& buffer)
|
||||
{
|
||||
DeserializationContext ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
deserialization_context ctx (buffer.data(), buffer.data() + buffer.size(), capabilities());
|
||||
return deserialize_text_row(ctx, meta, values);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user