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>;
232using RequestPersist =
Request<PersistReply>;
233using RequestPexpire =
Request<ExpireReply>;
234using RequestPing =
Request<StatusPong,
void>;
235using RequestPingMessage =
Request<std::string>;
236using RequestPublish =
Request<size_t>;
237using RequestRename =
Request<StatusOk,
void>;
238using RequestRpop =
Request<std::optional<std::string>>;
239using RequestRpush =
Request<size_t>;
240using RequestRpushx =
Request<size_t>;
241using RequestSadd =
Request<size_t>;
243using RequestScard =
Request<size_t>;
244using RequestSet =
Request<StatusOk,
void>;
245using RequestSetIfExist =
Request<std::optional<StatusOk>,
bool>;
246using RequestSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
247using RequestSetIfNotExistOrGet =
Request<std::optional<std::string>>;
248using RequestSetOptions =
Request<SetReply>;
249using RequestSetex =
Request<StatusOk,
void>;
250using RequestSetAndGetPrevious =
Request<std::optional<std::string>>;
251using RequestSismember =
Request<size_t>;
252using RequestSmembers =
Request<std::unordered_set<std::string>>;
253using RequestSrandmember =
Request<std::optional<std::string>>;
254using RequestSrandmembers =
Request<std::vector<std::string>>;
255using RequestSrem =
Request<size_t>;
257using RequestStrlen =
Request<size_t>;
258using RequestTime =
Request<std::chrono::system_clock::time_point>;
259using RequestTtl =
Request<TtlReply>;
261using RequestZadd =
Request<size_t>;
262using RequestZaddIncr =
Request<
double>;
263using RequestZaddIncrExisting =
Request<std::optional<
double>>;
264using RequestZcard =
Request<size_t>;
265using RequestZcount =
Request<size_t>;
266using RequestZrange =
Request<std::vector<std::string>>;
267using RequestZrangeWithScores =
Request<std::vector<MemberScore>>;
268using RequestZrangebyscore =
Request<std::vector<std::string>>;
269using RequestZrangebyscoreWithScores =
Request<std::vector<MemberScore>>;
270using RequestZrem =
Request<size_t>;
271using RequestZremrangebyrank =
Request<size_t>;
272using RequestZremrangebyscore =
Request<size_t>;
274using RequestZscore =
Request<std::optional<
double>>;
278using RequestHexpiretime =
Request<std::vector<HexpiretimeReply>>;
279using RequestHpexpiretime =
Request<std::vector<HpexpiretimeReply>>;
280using RequestHttl =
Request<std::vector<TtlReply>>;
281using RequestHpttl =
Request<std::vector<PttlReply>>;
283using RequestHgetex =
Request<std::vector<std::optional<std::string>>>;
287using RequestJsonSet =
Request<StatusOk,
void>;
288using RequestJsonSetIfExist =
Request<std::optional<StatusOk>,
bool>;
289using RequestJsonSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
291using RequestJsonMget =
Request<std::vector<std::optional<formats::
json::
Value>>>;
292using RequestJsonMset =
Request<StatusOk,
void>;