11#include <userver/clients/dns/resolver_fwd.hpp>
12#include <userver/components/component_fwd.hpp>
14#include <userver/storages/clickhouse/fwd.hpp>
15#include <userver/storages/clickhouse/impl/insertion_request.hpp>
16#include <userver/storages/clickhouse/impl/pool.hpp>
17#include <userver/storages/clickhouse/options.hpp>
18#include <userver/storages/clickhouse/query.hpp>
19#include <userver/utils/statistics/writer.hpp>
21USERVER_NAMESPACE_BEGIN
28struct ClickhouseSettings;
45 clients::dns::Resolver& resolver,
46 const impl::ClickhouseSettings& settings,
47 const components::ComponentConfig& config
52 Cluster(
const Cluster&) =
delete;
59 template <
typename... Args>
60 ExecutionResult
Execute(
const Query& query,
const Args&... args)
const;
67 template <
typename... Args>
68 ExecutionResult
Execute(OptionalCommandControl,
const Query& query,
const Args&... args)
const;
77 void Insert(
const std::string& table_name,
const std::vector<std::string_view>& column_names,
const T& data)
const;
89 OptionalCommandControl optional_cc,
90 const std::string& table_name,
91 const std::vector<std::string_view>& column_names,
106 template <
typename Container>
108 const std::string& table_name,
109 const std::vector<std::string_view>& column_names,
110 const Container& data
126 template <
typename Container>
128 OptionalCommandControl optional_cc,
129 const std::string& table_name,
130 const std::vector<std::string_view>& column_names,
131 const Container& data
139 using std::runtime_error::runtime_error;
143 void DoInsert(OptionalCommandControl,
const impl::InsertionRequest& request)
const;
145 ExecutionResult DoExecute(OptionalCommandControl,
const Query& query)
const;
147 const impl::Pool& GetPool()
const;
149 std::vector<impl::Pool> pools_;
150 mutable std::atomic<std::size_t> current_pool_ind_{0};
154void Cluster::
Insert(
const std::string& table_name,
const std::vector<std::string_view>& column_names,
const T& data)
156 Insert(OptionalCommandControl{}, table_name, column_names, data);
161 OptionalCommandControl optional_cc,
162 const std::string& table_name,
163 const std::vector<std::string_view>& column_names,
166 const auto request = impl::InsertionRequest::Create(table_name, column_names, data);
168 DoInsert(optional_cc, request);
171template <
typename Container>
173 const std::string& table_name,
174 const std::vector<std::string_view>& column_names,
175 const Container& data
177 InsertRows(OptionalCommandControl{}, table_name, column_names, data);
180template <
typename Container>
182 OptionalCommandControl optional_cc,
183 const std::string& table_name,
184 const std::vector<std::string_view>& column_names,
185 const Container& data
187 if (data.empty())
return;
189 const auto request = impl::InsertionRequest::CreateFromRows(table_name, column_names, data);
191 DoInsert(optional_cc, request);
194template <
typename... Args>
195ExecutionResult Cluster::
Execute(
const Query& query,
const Args&... args)
const {
196 return Execute(OptionalCommandControl{}, query, args...);
199template <
typename... Args>
200ExecutionResult Cluster::
Execute(OptionalCommandControl optional_cc,
const Query& query,
const Args&... args)
const {
201 const auto formatted_query = impl::WithArgs(query, args...);
202 return DoExecute(optional_cc, formatted_query);