10#include <unordered_map>
11#include <unordered_set>
14#include <userver/compiler/impl/lifetime.hpp>
15#include <userver/engine/awaitable.hpp>
16#include <userver/formats/json/value.hpp>
17#include <userver/storages/redis/exception.hpp>
18#include <userver/storages/redis/fwd.hpp>
19#include <userver/storages/redis/hexpiretime_reply.hpp>
20#include <userver/storages/redis/hpexpiretime_reply.hpp>
21#include <userver/storages/redis/pttl_reply.hpp>
22#include <userver/storages/redis/reply_types.hpp>
23#include <userver/storages/redis/request_data_base.hpp>
24#include <userver/storages/redis/scan_tag.hpp>
26USERVER_NAMESPACE_BEGIN
28namespace storages::
redis {
37template <
typename ResultType,
typename ReplyType>
40 using Result = ResultType;
41 using Reply = ReplyType;
44 : impl_(std::move(impl))
51 void Wait() { impl_->Wait(); }
58 ReplyType
Get(
const std::string& request_description = {}) {
return impl_->Get(request_description); }
62 return impl_->GetAwaitableToken();
65 template <
typename T1,
typename T2>
66 friend class RequestEval;
68 template <
typename T1,
typename T2>
69 friend class RequestEvalSha;
74 template <
typename T1>
75 friend class RequestGeneric;
78 ReplyPtr GetRaw() {
return impl_->GetRaw(); }
88class ScanRequest final {
93 : impl_(std::move(impl))
96 template <
typename T = std::vector<ReplyElem>>
97 T GetAll(std::string request_description) {
98 SetRequestDescription(std::move(request_description));
102 template <
typename T = std::vector<ReplyElem>>
104 return T{begin(), end()};
107 void SetRequestDescription(std::string request_description) {
108 impl_->SetRequestDescription(std::move(request_description));
113 using iterator_category = std::input_iterator_tag;
114 using difference_type = ptrdiff_t;
115 using value_type = ReplyElem;
116 using reference = value_type&;
117 using pointer = value_type*;
119 explicit Iterator(ScanRequest* stream)
122 if (stream_ && !stream_->HasMore()) {
129 ReplyElemHolder(value_type reply_elem)
130 : reply_elem_(std::move(reply_elem))
133 value_type& operator*() {
return reply_elem_; }
136 value_type reply_elem_;
147 if (!stream_->HasMore()) {
153 reference operator*()
const {
return stream_->Current(); }
155 pointer operator->()
const {
return &**
this; }
157 bool operator==(
const Iterator& rhs)
const {
return stream_ == rhs.stream_; }
160 ScanRequest* stream_;
172 ReplyElem& Current() {
return impl_->Current(); }
174 ReplyElem Get() {
return impl_->Get(); }
176 bool HasMore() {
return !impl_->Eof(); }
185using RequestAppend =
Request<size_t>;
186using RequestBitop =
Request<size_t>;
187using RequestDbsize =
Request<size_t>;
188using RequestDecr =
Request<int64_t>;
189using RequestDel =
Request<size_t>;
190using RequestUnlink =
Request<size_t>;
191using RequestGenericCommon =
Request<ReplyData>;
192using RequestEvalCommon =
Request<ReplyData>;
193using RequestEvalShaCommon =
Request<ReplyData>;
194using RequestScriptLoad =
Request<std::string>;
195using RequestExec =
Request<ReplyData,
void>;
196using RequestExists =
Request<size_t>;
197using RequestExpire =
Request<ExpireReply>;
198using RequestGeoadd =
Request<size_t>;
199using RequestGeopos =
Request<std::vector<std::optional<
Point>>>;
200using RequestGeoradius =
Request<std::vector<GeoPoint>>;
201using RequestGeosearch =
Request<std::vector<GeoPoint>>;
202using RequestGet =
Request<std::optional<std::string>>;
203using RequestGetdel =
Request<std::optional<std::string>>;
204using RequestGetset =
Request<std::optional<std::string>>;
205using RequestHdel =
Request<size_t>;
206using RequestHexists =
Request<size_t>;
207using RequestHget =
Request<std::optional<std::string>>;
208using RequestHgetall =
Request<std::unordered_map<std::string, std::string>>;
209using RequestHincrby =
Request<int64_t>;
210using RequestHincrbyfloat =
Request<
double>;
211using RequestHkeys =
Request<std::vector<std::string>>;
212using RequestHlen =
Request<size_t>;
213using RequestHmget =
Request<std::vector<std::optional<std::string>>>;
214using RequestHmset =
Request<StatusOk,
void>;
216using RequestHset =
Request<HsetReply>;
217using RequestHsetnx =
Request<size_t,
bool>;
218using RequestHvals =
Request<std::vector<std::string>>;
219using RequestIncr =
Request<int64_t>;
220using RequestKeys =
Request<std::vector<std::string>>;
221using RequestLindex =
Request<std::optional<std::string>>;
222using RequestLlen =
Request<size_t>;
223using RequestLpop =
Request<std::optional<std::string>>;
224using RequestLpush =
Request<size_t>;
225using RequestLpushx =
Request<size_t>;
226using RequestLrange =
Request<std::vector<std::string>>;
227using RequestLrem =
Request<size_t>;
228using RequestLtrim =
Request<StatusOk,
void>;
229using RequestMget =
Request<std::vector<std::optional<std::string>>>;
230using RequestMset =
Request<StatusOk,
void>;
231using RequestPersist =
Request<PersistReply>;
232using RequestPexpire =
Request<ExpireReply>;
233using RequestPing =
Request<StatusPong,
void>;
234using RequestPingMessage =
Request<std::string>;
235using RequestPublish =
Request<size_t>;
236using RequestRename =
Request<StatusOk,
void>;
237using RequestRpop =
Request<std::optional<std::string>>;
238using RequestRpush =
Request<size_t>;
239using RequestRpushx =
Request<size_t>;
240using RequestSadd =
Request<size_t>;
242using RequestScard =
Request<size_t>;
243using RequestSet =
Request<StatusOk,
void>;
244using RequestSetIfExist =
Request<std::optional<StatusOk>,
bool>;
245using RequestSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
246using RequestSetIfNotExistOrGet =
Request<std::optional<std::string>>;
247using RequestSetOptions =
Request<SetReply>;
248using RequestSetex =
Request<StatusOk,
void>;
249using RequestSetAndGetPrevious =
Request<std::optional<std::string>>;
250using RequestSismember =
Request<size_t>;
251using RequestSmembers =
Request<std::unordered_set<std::string>>;
252using RequestSrandmember =
Request<std::optional<std::string>>;
253using RequestSrandmembers =
Request<std::vector<std::string>>;
254using RequestSrem =
Request<size_t>;
256using RequestStrlen =
Request<size_t>;
257using RequestTime =
Request<std::chrono::system_clock::time_point>;
258using RequestTtl =
Request<TtlReply>;
260using RequestZadd =
Request<size_t>;
261using RequestZaddIncr =
Request<
double>;
262using RequestZaddIncrExisting =
Request<std::optional<
double>>;
263using RequestZcard =
Request<size_t>;
264using RequestZcount =
Request<size_t>;
265using RequestZrange =
Request<std::vector<std::string>>;
266using RequestZrangeWithScores =
Request<std::vector<MemberScore>>;
267using RequestZrangebyscore =
Request<std::vector<std::string>>;
268using RequestZrangebyscoreWithScores =
Request<std::vector<MemberScore>>;
269using RequestZrem =
Request<size_t>;
270using RequestZremrangebyrank =
Request<size_t>;
271using RequestZremrangebyscore =
Request<size_t>;
273using RequestZscore =
Request<std::optional<
double>>;
277using RequestHexpiretime =
Request<std::vector<HexpiretimeReply>>;
278using RequestHpexpiretime =
Request<std::vector<HpexpiretimeReply>>;
279using RequestHttl =
Request<std::vector<TtlReply>>;
280using RequestHpttl =
Request<std::vector<PttlReply>>;
282using RequestHgetex =
Request<std::vector<std::optional<std::string>>>;
286using RequestJsonSet =
Request<StatusOk,
void>;
287using RequestJsonSetIfExist =
Request<std::optional<StatusOk>,
bool>;
288using RequestJsonSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
290using RequestJsonMget =
Request<std::vector<std::optional<formats::
json::
Value>>>;
291using RequestJsonMset =
Request<StatusOk,
void>;