userver: userver/storages/clickhouse/io/impl/escape.hpp Source File
Loading...
Searching...
No Matches
escape.hpp
1#pragma once
2
3#include <chrono>
4#include <string>
5#include <string_view>
6#include <vector>
7
8#include <userver/utils/strong_typedef.hpp>
9
10#include <userver/storages/clickhouse/io/type_traits.hpp>
11#include <userver/storages/clickhouse/io/typedefs.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace storages::clickhouse::io::impl {
16
17std::string Escape(uint8_t);
18std::string Escape(uint16_t);
19std::string Escape(uint32_t);
20std::string Escape(uint64_t);
21std::string Escape(int8_t);
22std::string Escape(int16_t);
23std::string Escape(int32_t);
24std::string Escape(int64_t);
25
26std::string Escape(const char* source);
27std::string Escape(const std::string& source);
28std::string Escape(std::string_view source);
29
30std::string Escape(std::chrono::system_clock::time_point source);
31std::string Escape(DateTime64Milli source);
32std::string Escape(DateTime64Micro source);
33std::string Escape(DateTime64Nano source);
34
35template <typename Container>
36std::string Escape(const Container& source) {
37 static_assert(traits::kIsRange<Container>,
38 "There's no escape implementation for the type.");
39
40 std::string result;
41 if constexpr (traits::kIsSizeable<Container>) {
42 // just an approximation, wild guess
43 constexpr size_t kResultReserveMultiplier = 5;
44 result.reserve(source.size() * kResultReserveMultiplier);
45 }
46 result.push_back('[');
47
48 bool is_first_item = true;
49 for (const auto& item : source) {
50 if (!is_first_item) {
51 result.push_back(',');
52 }
53 result += impl::Escape(item);
54 is_first_item = false;
55 }
56 result.push_back(']');
57
58 return result;
59}
60
61} // namespace storages::clickhouse::io::impl
62
63USERVER_NAMESPACE_END