1 #include "RedisInternal.h"
7 data = client.readStringUntil(
'\r');
13 String emitStr((
char)_type);
16 data.replace(CRLF, F(
""));
24 auto dLen = data.toInt();
28 data = (
const char*)
nullptr;
32 auto charBuf =
new char[dLen + 1];
33 bzero(charBuf, dLen + 1);
35 auto readB = client.readBytes(charBuf, dLen);
37 Serial.printf(
"ERROR! Bad read (%ld ?= %ld)\n", (
long)readB, (
long)dLen);
41 data = String(charBuf);
47 String emitStr((
char)_type);
48 emitStr += String(data.length());
57 for (
int i = 0; i < data.toInt(); i++)
58 add(RedisObject::parseType(client));
61 RedisArray::operator std::vector<String>()
const
63 std::vector<String> rv;
65 rv.push_back((String)*ro.get());
71 String emitStr((
char)_type);
72 emitStr += String(vec.size());
74 for (
auto rTypeInst : vec) {
75 emitStr += rTypeInst->RESP();
82 if (!cmdClient.connected())
83 return std::shared_ptr<RedisObject>(
new RedisInternalError(
"Client is not connected"));
85 auto cmdRespStr =
RESP();
86 sprint(
"----- CMD ----\n%s---- /CMD ----\n", cmdRespStr.c_str());
87 cmdClient.print(cmdRespStr);
88 auto ret = RedisObject::parseType(cmdClient);
89 if (ret && ret->type() == RedisObject::Type::InternalError)
95 int RedisCommand::issue_typed<int>(Client& cmdClient)
97 auto cmdRet =
issue(cmdClient);
99 return INT_MAX - 0x0f;
100 if (cmdRet->type() != RedisObject::Type::Integer)
101 return INT_MAX - 0xf0;
106 bool RedisCommand::issue_typed<bool>(Client& cmdClient)
108 auto cmdRet =
issue(cmdClient);
109 if (cmdRet && cmdRet->type() == RedisObject::Type::Integer)
115 String RedisCommand::issue_typed<String>(Client& cmdClient)
117 return (String)*
issue(cmdClient);
122 static TypeParseMap g_TypeParseMap {
123 { RedisObject::Type::SimpleString, [](Client& c) {
return new RedisSimpleString(c); } },
124 { RedisObject::Type::BulkString, [](Client& c) {
return new RedisBulkString(c); } },
125 { RedisObject::Type::Integer, [](Client& c) {
return new RedisInteger(c); } },
126 { RedisObject::Type::Array, [](Client& c) {
return new RedisArray(c); } },
127 { RedisObject::Type::Error, [](Client& c) {
return new RedisError(c); } }
130 std::shared_ptr<RedisObject> RedisObject::parseType(Client& client)
132 if (client.connected()) {
133 while (!client.available());
135 #if ARDUINO_REDIS_SERIAL_TRACE
141 #if ARDUINO_REDIS_SERIAL_TRACE
144 }
while (typeChar == -1 || typeChar ==
'\r' || typeChar ==
'\n');
146 #if ARDUINO_REDIS_SERIAL_TRACE
147 sprint(
"Parsed type character '%c' (after %d reads) (0x%x, %dd)\n", typeChar, readB, typeChar, (
int)typeChar);
150 if (g_TypeParseMap.find(typeChar) != g_TypeParseMap.end()) {
151 auto retVal = g_TypeParseMap[typeChar](client);
153 if (!retVal || retVal->type() == RedisObject::Type::Error) {
154 String err = retVal ? (String)*retVal :
"(nil)";
158 return std::shared_ptr<RedisObject>(retVal);
161 return std::shared_ptr<RedisObject>(
new RedisInternalError(
"Unable to find type: " + typeChar));