userver: userver/storages/clickhouse/io/impl/escape.hpp Source File
⚠️ This is the documentation for an old userver version. Click here to switch to the latest version.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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