summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2018-12-10 17:10:11 +0100
committerantirez <antirez@gmail.com>2018-12-21 11:42:52 +0100
commitd82656b2c790e5889d373ffc8264e6c3339c6317 (patch)
tree87cf54e833b86da6cbc60b8d28216efa5ad118b9
parent658c5e324dc9311ab93ea7801033df73f1b8528a (diff)
downloadredis-d82656b2c790e5889d373ffc8264e6c3339c6317.tar.gz
RESP3: hiredis: implement bool type.
-rw-r--r--deps/hiredis/hiredis.c25
-rw-r--r--deps/hiredis/read.c10
-rw-r--r--deps/hiredis/read.h1
3 files changed, 35 insertions, 1 deletions
diff --git a/deps/hiredis/hiredis.c b/deps/hiredis/hiredis.c
index 193168a0b..0947d1ed7 100644
--- a/deps/hiredis/hiredis.c
+++ b/deps/hiredis/hiredis.c
@@ -49,6 +49,7 @@ static void *createArrayObject(const redisReadTask *task, int elements);
static void *createIntegerObject(const redisReadTask *task, long long value);
static void *createDoubleObject(const redisReadTask *task, double value, char *str, size_t len);
static void *createNilObject(const redisReadTask *task);
+static void *createBoolObject(const redisReadTask *task, int bval);
/* Default set of functions to build the reply. Keep in mind that such a
* function returning NULL is interpreted as OOM. */
@@ -58,6 +59,7 @@ static redisReplyObjectFunctions defaultFunctions = {
createIntegerObject,
createDoubleObject,
createNilObject,
+ createBoolObject,
freeReplyObject
};
@@ -223,7 +225,28 @@ static void *createNilObject(const redisReadTask *task) {
if (task->parent) {
parent = task->parent->obj;
- assert(parent->type == REDIS_REPLY_ARRAY);
+ assert(parent->type == REDIS_REPLY_ARRAY ||
+ parent->type == REDIS_REPLY_MAP ||
+ parent->type == REDIS_REPLY_SET);
+ parent->element[task->idx] = r;
+ }
+ return r;
+}
+
+static void *createBoolObject(const redisReadTask *task, int bval) {
+ redisReply *r, *parent;
+
+ r = createReplyObject(REDIS_REPLY_BOOL);
+ if (r == NULL)
+ return NULL;
+
+ r->integer = bval != 0;
+
+ if (task->parent) {
+ parent = task->parent->obj;
+ assert(parent->type == REDIS_REPLY_ARRAY ||
+ parent->type == REDIS_REPLY_MAP ||
+ parent->type == REDIS_REPLY_SET);
parent->element[task->idx] = r;
}
return r;
diff --git a/deps/hiredis/read.c b/deps/hiredis/read.c
index 511503cb5..c75c3435f 100644
--- a/deps/hiredis/read.c
+++ b/deps/hiredis/read.c
@@ -313,6 +313,12 @@ static int processLineItem(redisReader *r) {
obj = r->fn->createNil(cur);
else
obj = (void*)REDIS_REPLY_NIL;
+ } else if (cur->type == REDIS_REPLY_BOOL) {
+ int bval = p[0] == 't' || p[0] == 'T';
+ if (r->fn && r->fn->createBool)
+ obj = r->fn->createBool(cur,bval);
+ else
+ obj = (void*)REDIS_REPLY_BOOL;
} else {
/* Type will be error or status. */
if (r->fn && r->fn->createString)
@@ -513,6 +519,9 @@ static int processItem(redisReader *r) {
case '~':
cur->type = REDIS_REPLY_SET;
break;
+ case '#':
+ cur->type = REDIS_REPLY_BOOL;
+ break;
default:
__redisReaderSetErrorProtocolByte(r,*p);
return REDIS_ERR;
@@ -530,6 +539,7 @@ static int processItem(redisReader *r) {
case REDIS_REPLY_INTEGER:
case REDIS_REPLY_DOUBLE:
case REDIS_REPLY_NIL:
+ case REDIS_REPLY_BOOL:
return processLineItem(r);
case REDIS_REPLY_STRING:
return processBulkItem(r);
diff --git a/deps/hiredis/read.h b/deps/hiredis/read.h
index db267f81f..f3d075843 100644
--- a/deps/hiredis/read.h
+++ b/deps/hiredis/read.h
@@ -83,6 +83,7 @@ typedef struct redisReplyObjectFunctions {
void *(*createInteger)(const redisReadTask*, long long);
void *(*createDouble)(const redisReadTask*, double, char*, size_t);
void *(*createNil)(const redisReadTask*);
+ void *(*createBool)(const redisReadTask*, int);
void (*freeObject)(void*);
} redisReplyObjectFunctions;