userver: userver/ydb/builder.hpp Source File
Loading...
Searching...
No Matches
builder.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/ydb/builder.hpp
4/// @brief @copybrief ydb::PreparedArgsBuilder
5
6#include <ydb-cpp-sdk/client/params/params.h>
7
8#include <string>
9#include <type_traits>
10#include <utility>
11
12#include <userver/ydb/impl/cast.hpp>
13#include <userver/ydb/io/traits.hpp>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace ydb {
18
19class TableClient;
20class Transaction;
21
22/// @brief Builder for prepared query parameters
23class PreparedArgsBuilder final {
24public:
25 PreparedArgsBuilder() = default;
26
27 PreparedArgsBuilder(PreparedArgsBuilder&&) noexcept = default;
28 PreparedArgsBuilder& operator=(PreparedArgsBuilder&&) = delete;
29
30 explicit PreparedArgsBuilder(NYdb::TParamsBuilder&& builder)
31 : builder_(std::move(builder))
32 {}
33
34 /// Supported types and required includes are documented in:
35 /// <userver/ydb/io/supported_types.hpp>
36 template <typename T>
37 void Add(const std::string& name, T&& value);
38
39 /// @cond
40 // For internal use only.
41 template <typename... NamesValues>
42 void AddParams(NamesValues&&... names_values);
43 /// @endcond
44
45private:
46 friend class Transaction;
47 friend class TableClient;
48 friend class TxActor;
49 struct PreparedArgsWithKey;
50
51 NYdb::TParams Build() && { return std::move(builder_).Build(); }
52
53 PreparedArgsWithKey operator<<(const std::string& key);
54
55 NYdb::TParamsBuilder builder_;
56};
57
58template <typename T>
59void PreparedArgsBuilder::Add(const std::string& name, T&& value) {
60 auto& param_builder = builder_.AddParam(impl::ToString(name));
61 Write(param_builder, std::forward<T>(value));
62 param_builder.Build();
63}
64
65/// @cond
66template <typename... NamesValues>
67void PreparedArgsBuilder::AddParams(NamesValues&&... names_values) {
68 [[maybe_unused]] decltype(auto) result = (*this << ... << std::forward<NamesValues>(names_values));
69 static_assert(std::is_same_v<decltype(result), PreparedArgsBuilder&>);
70}
71/// @endcond
72
73struct PreparedArgsBuilder::PreparedArgsWithKey final {
74 PreparedArgsBuilder& builder;
75 const std::string& key;
76
77 template <typename T>
78 PreparedArgsBuilder& operator<<(T&& value) const {
79 builder.Add(key, std::forward<T>(value));
80 return builder;
81 }
82};
83
84inline auto PreparedArgsBuilder::operator<<(const std::string& key) -> PreparedArgsWithKey {
85 return PreparedArgsWithKey{*this, key};
86}
87
88} // namespace ydb
89
90USERVER_NAMESPACE_END