5#ifndef ANNADB_DRIVER_CONNECTION_HPP
6#define ANNADB_DRIVER_CONNECTION_HPP
18 const std::regex pattern (
"(,)\\b[\\w-]{2,}+\\b\\|");
23 auto separation = data.find_first_of(
':');
24 auto start = data[0] ==
',' ? 1 : 0;
25 auto end = data[data.size() - 1] ==
',' ? 1 : 0;
26 link = data.substr(start, separation - start);
27 value = data.substr(separation + 1, data.size() - 1 - separation - end);
34 enum class MetaType:
unsigned char
43 inline std::ostream& operator<< (std::ostream& os, MetaType metaType)
noexcept
47 case MetaType::insert_meta:
48 return os <<
"insert_meta";
49 case MetaType::get_meta:
50 return os <<
"get_meta";
51 case MetaType::find_meta:
52 return os <<
"find_meta";
53 case MetaType::update_meta:
54 return os <<
"update_meta";
62 const auto metaTypes = std::map<std::string, MetaType>{std::make_pair(
":insert_meta", MetaType::insert_meta),
63 std::make_pair(
":get_meta", MetaType::get_meta),
64 std::make_pair(
":find_meta", MetaType::find_meta),
65 std::make_pair(
":update_meta", MetaType::update_meta),};
77 std::vector<KeyVal> split_data(std::string_view str_data)
noexcept
79 auto new_data = std::regex_replace(str_data.data(), pattern,
"^$&");
80 auto data = utils::split(new_data,
'^');
82 std::vector<KeyVal> parts {};
83 parts.reserve(data.size());
84 std::transform(data.begin(), data.end(), std::back_inserter(parts), [](
auto &val){return KeyVal(val);});
95 explicit Data(std::string_view data) noexcept : data_(data) {}
104 template<tyson::TySonType T>
105 requires (T == tyson::TySonType::Objects || T == tyson::TySonType::IDs)
106 std::optional<tyson::TySonCollectionObject>
get()
noexcept
108 if (data_.starts_with(std::string(
"s|data|:objects")) && T == tyson::TySonType::Objects)
110 auto start_val = data_.find_first_of(
'{') + 1;
111 auto end_val = data_.find_last_of(
'}');
113 auto tyson_str_data = split_data(data_.substr(start_val, end_val - start_val));
116 for (
auto &key_val: tyson_str_data)
118 object.
add(key_val.link, key_val.value);
121 tyson_str_data.clear();
122 tyson_str_data.shrink_to_fit();
126 else if (data_.starts_with(std::string(
"s|data|:ids")) && T == tyson::TySonType::IDs)
128 auto start_val = data_.find_first_of(
'[');
129 auto end_val = data_.find_last_of(
']');
131 auto tyson_str_data = utils::split(data_.substr(start_val + 1, end_val - start_val - 1),
',');
133 for (
auto &link_data: tyson_str_data)
135 object.
add(link_data);
138 tyson_str_data.clear();
139 tyson_str_data.shrink_to_fit();
154 std::string meta_txt_;
157 MetaType metaType = MetaType::none;
167 void parse_data()
noexcept
169 auto pos_map_start = meta_txt_.find(
'{');
170 auto pos_map_end = meta_txt_.rfind(
'}') + 1;
171 auto map_str =
"m" + meta_txt_.substr(pos_map_start, pos_map_end - pos_map_start);
182 void parse_type()
noexcept
184 auto pos_type_start = meta_txt_.find(
':');
185 auto pos_type_end = meta_txt_.find(
'{');
186 auto meta_type_str = meta_txt_.substr(pos_type_start, pos_type_end - pos_type_start);
187 metaType = metaTypes.at(meta_type_str);
190 friend std::ostream & operator<<(std::ostream &os,
const Meta& meta)
noexcept
192 std::string count_val =
"0";
194 auto count = meta.data_[
"count"];
197 count_val = count.
value().value<tyson::TySonType::String>();
200 std::string repr =
"{s|count|:n|" + count_val +
"|";
201 return os <<
"s|meta|:" << meta.metaType << repr <<
"}";
211 explicit Meta(std::string_view meta_txt)
noexcept
213 meta_txt_ = meta_txt;
230 requires std::is_integral_v<T>
231 std::optional<T> rows() noexcept
233 auto count = data_[
"count"];
236 auto res = count.
value().value<T>();
256 bool result_ =
false;
264 void parse_response(std::string_view response)
noexcept
270 auto pos_result_end = response.find(
'[');
271 auto pos_data_begin = response.find(
"s|data|:");
275 auto pos_meta_begin = response.rfind(
"s|meta|:");
278 auto pos_response_end = response.rfind(
",}]");
280 auto res = response.substr(0, pos_result_end);
281 if (res.find(
"ok") != std::string::npos)
286 data_ = response.substr(pos_data_begin, pos_meta_begin - pos_data_begin);
287 meta_ = response.substr(pos_meta_begin, pos_response_end - pos_meta_begin);
290 friend std::ostream & operator<<(std::ostream &os,
const Journal& journal)
noexcept
292 std::string result = journal.
ok() ?
"ok" :
"err";
294 auto data =
"journal.data()";
296 std::string repr =
"result:" + result +
"[response{";
297 return os << repr <<
data <<
meta <<
",},];";
307 explicit Journal(std::string_view response)
noexcept
309 parse_response(response);
319 [[nodiscard]]
bool ok() const noexcept
347 std::string username_;
348 std::string password_;
352 zmq::context_t context {1};
353 zmq::socket_t requester {context, ZMQ_REQ};
355 bool zmq_send(std::string_view query)
noexcept
357 zmq::message_t message(query.size());
358 std::memcpy(message.data(), query.data(), query.size());
360 auto response = requester.send(message, zmq::send_flags::none);
370 std::optional<std::string> zmq_receive()
noexcept
372 zmq::message_t message;
373 auto response = requester.recv(message, zmq::recv_flags::none);
377 auto result = std::string(
static_cast<char *
>(message.data()), message.size());
395 std::string_view password,
396 std::string_view host,
398 ) noexcept : username_(username),
401 port_(std::to_string(port))
412 requester.connect(
"tcp://" + host_ +
":" + port_);
429 [[nodiscard]] std::optional<Journal>
send(std::string_view query)
noexcept
431 auto result = zmq_send(query);
435 auto response = zmq_receive();
452 std::stringstream sstream;
455 auto query_str = sstream.str();
456 auto result = zmq_send(query_str);
460 auto response = zmq_receive();
Definition: connection.hpp:346
std::optional< Journal > send(std::string_view query) noexcept
Definition: connection.hpp:429
void connect() noexcept
Definition: connection.hpp:410
std::optional< Journal > send(annadb::Query::Query &query) noexcept
Definition: connection.hpp:450
AnnaDB(std::string_view username, std::string_view password, std::string_view host, u_short port) noexcept
Definition: connection.hpp:394
void close() noexcept
Definition: connection.hpp:418
Definition: connection.hpp:68
std::optional< tyson::TySonCollectionObject > get() noexcept
Definition: connection.hpp:106
Data(std::string_view data) noexcept
Definition: connection.hpp:95
Definition: connection.hpp:253
Journal(std::string_view response) noexcept
Definition: connection.hpp:307
Data data() const noexcept
Definition: connection.hpp:338
bool ok() const noexcept
Definition: connection.hpp:319
Meta meta() const noexcept
Definition: connection.hpp:328
Definition: query.hpp:775
Definition: TySON.hpp:702
void add(const std::string &object)
Definition: TySON.hpp:727
std::string value() const noexcept
Definition: TySON.hpp:588
Definition: connection.hpp:20