31 RedisNotConnectedFailure = 1,
36 RedisSubscribeBadCallback = -255,
37 RedisSubscribeSetupFailure,
38 RedisSubscribeSuccess = 0
39 } RedisSubscribeResult;
42 RedisMessageBadResponseType = -255,
43 RedisMessageTruncatedResponse,
44 RedisMessageUnknownType,
57 typedef void (*RedisMsgCallback)(
Redis*, String, String);
59 typedef void (*RedisMsgErrorCallback)(
Redis*, RedisMessageError);
66 Redis(Client& client) : conn(client) {}
90 bool set(
const char* key,
const char* value);
97 String
get(
const char* key);
104 bool del(
const char* key);
111 bool exists(
const char* key);
119 int append(
const char* key,
const char* value);
127 int publish(
const char* channel,
const char* message);
135 bool expire(
const char* key,
int seconds) {
return _expire_(key, seconds,
"EXPIRE"); }
144 bool expire_at(
const char* key,
int timestamp) {
return _expire_(key, timestamp,
"EXPIREAT"); }
152 bool pexpire(
const char* key,
int ms) {
return _expire_(key, ms,
"PEXPIRE"); }
161 bool pexpire_at(
const char* key,
int timestamp) {
return _expire_(key, timestamp,
"PEXPIREAT"); }
176 int ttl(
const char* key) {
return _ttl_(key,
"TTL"); }
184 int pttl(
const char* key) {
return _ttl_(key,
"PTTL"); }
193 bool hset(
const char* key,
const char* field,
const char* value) {
return _hset_(key, field, value,
"HSET"); }
202 bool hsetnx(
const char* key,
const char* field,
const char* value) {
return _hset_(key, field, value,
"HSETNX"); }
210 String
hget(
const char* key,
const char* field);
217 bool hdel(
const char* key,
const char* field);
224 int hlen(
const char* key);
232 int hstrlen(
const char* key,
const char* field);
240 bool hexists(
const char* key,
const char* field);
248 std::vector<String>
lrange(
const char* key,
int start,
int stop);
253 bool subscribe(
const char* channel) {
return _subscribe(SubscribeSpec{
false, String(channel)}); }
258 bool psubscribe(
const char* pattern) {
return _subscribe(SubscribeSpec{
true, String(pattern)}); }
274 RedisSubscribeResult
startSubscribing(RedisMsgCallback messageCallback, RedisMsgErrorCallback errorCallback =
nullptr);
281 #if ARDUINO_REDIS_TEST
287 TestResults runTests(
bool logToSerial =
false,
288 String prefix =
"__com.arduino-redis.test",
289 bool retainData =
false);
290 #endif // ARDUINO_REDIS_TEST
298 bool _subscribe(SubscribeSpec spec);
301 std::vector<SubscribeSpec> subSpec;
302 bool subscriberMode =
false;
303 bool subLoopRun =
false;
305 bool _expire_(
const char*,
int,
const char*);
306 int _ttl_(
const char*,
const char*);
307 bool _hset_(
const char*,
const char*,
const char*,
const char*);
310 #if ARDUINO_REDIS_TEST
314 Redis::TestResults Redis::runTests(
bool logToSerial, String prefix,
bool retainData)
317 std::map<String, std::function<bool(
const char*)>> g_Tests
319 {
"set", [
this](
const char* k) {
return set(k,
"!"); } },
320 {
"setget", [
this](
const char* k) {
return set(k,
"!") == 1 &&
get(k) ==
"!"; } },
321 {
"expire", [
this](
const char* k) {
324 {
"pexpire", [
this](
const char* k) {
327 {
"dlyexp", [
this](
const char* k) {
328 auto sr =
set(k,
"DE");
332 return sr && t > 5 && t < 7;
334 {
"hset", [
this](
const char* k) {
return hset(k,
"TF",
"H!") &&
hexists(k,
"TF"); } },
335 {
"hsetget", [
this](
const char* k) {
336 return hset(k,
"TF",
"HH") &&
hget(k,
"TF") ==
"HH";
338 {
"hlen", [
this](
const char* k) {
339 for (
int i = 0; i < 10; i++) {
341 hset(k, String(
"field-" + fv).c_str(), fv.c_str());
343 return hlen(k) == 10;
345 {
"hstrlen", [
this](
const char* k) {
346 return hset(k,
"hsr", k) &&
hstrlen(k,
"hsr") == strlen(k);
348 {
"append", [
this](
const char* k) {
return append(k,
"foo") == 3; } },
349 {
"exists", [
this](
const char* k) {
return set(k, k) &&
exists(k); } }
353 Serial.begin(115200);
354 Serial.printf(
"Redis::run_tests(\"%s\") starting...\n", prefix.c_str());
357 auto pFunc = [&prefix](
const String& n) {
return String(prefix +
"." + n); };
359 int total = 0, pass = 0;
360 for (
auto& kv : g_Tests)
362 auto tName = kv.first;
363 auto tFunc = kv.second;
364 auto pName = pFunc(tName);
365 auto tRes = tFunc(pName.c_str());
367 Serial.printf(
"\tTest \"%s\":\t%s\n", tName.c_str(), tRes ?
"pass" :
"FAIL");
369 pass += tRes ? 1 : 0;
373 Serial.printf(
"Result: %d passed / %d total\n", pass, total);
376 for (
auto& kv : g_Tests)
377 (void)
del(pFunc(kv.first).c_str());
379 return { .total = total, .passed = pass };