5#ifdef USE_CONTAINER_SYSTEM
8#include <core/container.h>
9#include <core/value_types.h>
13using namespace container_module;
15std::vector<uint8_t> container_protocol_serializer::serialize_container(
16 const query_request& request) {
18 auto container = std::make_shared<value_container>();
19 container->set_message_type(
"query_request");
22 container->set(
"operation",
static_cast<int>(request.operation));
25 container->set(
"query_string", std::string(request.query_string));
28 container->set(
"param_count",
static_cast<unsigned int>(request.parameters.size()));
31 for (
size_t i = 0; i < request.parameters.size(); ++i) {
32 std::string param_key =
"param_" + std::to_string(i);
33 container->set(param_key, std::string(request.parameters[i]));
37 auto result = container->serialize(value_container::serialization_format::binary);
39 return result.value();
44kcenon::common::Result<query_request> container_protocol_serializer::deserialize_container_query_request(
45 const std::vector<uint8_t>& data) {
48 auto container = std::make_shared<value_container>(data,
false);
51 if (container->message_type() !=
"query_request") {
52 return kcenon::common::error_info{
54 "Invalid message type: " + container->message_type(),
58 query_request request;
61 auto operation_val = container->get(
"operation");
62 if (operation_val.has_value()) {
63 if (std::holds_alternative<int>(operation_val->data)) {
65 std::get<int>(operation_val->data));
67 return kcenon::common::error_info{
69 "Invalid operation field type",
73 return kcenon::common::error_info{
75 "Missing operation field",
80 auto query_val = container->get(
"query_string");
81 if (query_val.has_value()) {
82 if (std::holds_alternative<std::string>(query_val->data)) {
83 request.query_string = std::get<std::string>(query_val->data);
85 return kcenon::common::error_info{
87 "Invalid query_string field type",
91 return kcenon::common::error_info{
93 "Missing query_string field",
98 auto param_count_val = container->get(
"param_count");
99 if (param_count_val.has_value()) {
100 if (std::holds_alternative<unsigned int>(param_count_val->data)) {
101 uint32_t count = std::get<unsigned int>(param_count_val->data);
102 request.parameters.reserve(count);
105 for (uint32_t i = 0; i < count; ++i) {
106 std::string param_key =
"param_" + std::to_string(i);
107 auto param_val = container->get(param_key);
108 if (param_val.has_value()) {
109 if (std::holds_alternative<std::string>(param_val->data)) {
110 request.parameters.push_back(std::get<std::string>(param_val->data));
112 return kcenon::common::error_info{
114 "Invalid parameter type at index " + std::to_string(i),
115 "database_protocol"};
118 return kcenon::common::error_info{
120 "Missing parameter at index " + std::to_string(i),
121 "database_protocol"};
125 return kcenon::common::error_info{
127 "Invalid param_count field type",
128 "database_protocol"};
131 return kcenon::common::error_info{
133 "Missing param_count field",
134 "database_protocol"};
138 }
catch (
const std::exception& e) {
139 return kcenon::common::error_info{
141 std::string(
"Deserialization exception: ") + e.what(),
142 "database_protocol"};
146std::string container_protocol_serializer::serialize_to_json(
const query_request& request) {
148 auto container = std::make_shared<value_container>();
149 container->set_message_type(
"query_request");
152 container->set(
"operation",
static_cast<int>(request.operation));
153 container->set(
"query_string", std::string(request.query_string));
154 container->set(
"param_count",
static_cast<unsigned int>(request.parameters.size()));
156 for (
size_t i = 0; i < request.parameters.size(); ++i) {
157 std::string param_key =
"param_" + std::to_string(i);
158 container->set(param_key, std::string(request.parameters[i]));
162 auto result = container->serialize_string(value_container::serialization_format::json);
163 if (result.is_ok()) {
164 return result.value();
query_operation
Type of query operation.