2 #include "RedisInternal.h"
8 int passwordLength = strlen(password);
9 if (passwordLength > 0)
11 auto cmdRet =
RedisCommand(
"AUTH", ArgList{password}).issue(conn);
12 return cmdRet->type() == RedisObject::Type::SimpleString && (String)*cmdRet ==
"OK"
13 ? RedisSuccess : RedisAuthFailure;
19 return RedisNotConnectedFailure;
24 return ((String)*
RedisCommand(
"SET", ArgList{key, value}).issue(conn)).indexOf(
"OK") != -1;
27 #define TRCMD(t, c, ...) return RedisCommand(c, ArgList{__VA_ARGS__}).issue_typed<t>(conn)
31 TRCMD(String,
"GET", key);
36 TRCMD(
bool,
"DEL", key);
41 TRCMD(
int,
"APPEND", key, value);
46 TRCMD(
int,
"PUBLISH", channel, message);
51 TRCMD(
bool,
"EXISTS", key);
54 bool Redis::_expire_(
const char* key,
int arg,
const char* cmd_var)
56 TRCMD(
bool, cmd_var, key, String(arg));
61 TRCMD(
bool,
"PERSIST", key);
64 int Redis::_ttl_(
const char* key,
const char* cmd_var)
66 TRCMD(
int, cmd_var, key);
69 bool Redis::_hset_(
const char* key,
const char* field,
const char* value,
const char* cmd_var)
71 TRCMD(
int, cmd_var, key, field, value);
76 TRCMD(String,
"HGET", key, field);
81 TRCMD(
bool,
"HDEL", key, field);
86 TRCMD(
int,
"HLEN", key);
91 TRCMD(
int,
"HSTRLEN", key, field);
96 TRCMD(
bool,
"HEXISTS", key, field);
101 auto rv =
RedisCommand(
"LRANGE", ArgList{key, String(start), String(stop)}).issue(conn);
102 return rv->type() == RedisObject::Type::Array
103 ? (std::vector<String>)*((
RedisArray*)rv.get())
104 : std::vector<String>();
107 bool Redis::_subscribe(SubscribeSpec spec)
109 if (!subscriberMode) {
110 subSpec.push_back(spec);
114 const char* cmdName = spec.pattern ?
"PSUBSCRIBE" :
"SUBSCRIBE";
115 auto rv =
RedisCommand(cmdName, ArgList{spec.spec}).issue(conn);
116 return rv->type() == RedisObject::Type::Array;
121 auto rv =
RedisCommand(
"UNSUBSCRIBE", ArgList{channelOrPattern}).issue(conn);
123 if (rv->type() == RedisObject::Type::Array) {
124 auto vec = (std::vector<String>)*((
RedisArray*)rv.get());
125 return vec.size() == 3 && vec[1] == String(channelOrPattern);
133 if (!messageCallback) {
134 return RedisSubscribeBadCallback;
138 subscriberMode =
true;
139 if (subSpec.size()) {
140 for (
auto spec : subSpec) {
141 success = _subscribe(spec) && success;
146 return RedisSubscribeSetupFailure;
149 auto emitErr = [=](RedisMessageError errCode) ->
bool {
151 errCallback(
this, errCode);
157 auto msg = RedisObject::parseType(conn);
159 if (msg->type() != RedisObject::Type::Array) {
160 emitErr(RedisMessageBadResponseType);
164 auto msgVec = (std::vector<String>)*((
RedisArray*)msg.get());
166 if (msgVec.size() < 3) {
167 emitErr(RedisMessageTruncatedResponse);
171 if (msgVec[0] !=
"message" && msgVec[0] !=
"pmessage") {
172 emitErr(RedisMessageUnknownType);
177 auto pMsgAdd = msgVec[0] ==
"pmessage" ? 1 : 0;
178 messageCallback(
this, msgVec[1 + pMsgAdd], msgVec[2 + pMsgAdd]);
181 return RedisSubscribeSuccess;