From 045b1f633977926e37a8c77ccd311734abb56749 Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 6 Dec 2018 11:43:11 +0100 Subject: RESP3: hiredis: save the original double string. --- deps/hiredis/hiredis.c | 18 ++++++++++++++++-- deps/hiredis/hiredis.h | 3 ++- deps/hiredis/read.c | 2 +- deps/hiredis/read.h | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) (limited to 'deps/hiredis') diff --git a/deps/hiredis/hiredis.c b/deps/hiredis/hiredis.c index 13b961871..193168a0b 100644 --- a/deps/hiredis/hiredis.c +++ b/deps/hiredis/hiredis.c @@ -47,7 +47,7 @@ static redisReply *createReplyObject(int type); static void *createStringObject(const redisReadTask *task, char *str, size_t len); 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); +static void *createDoubleObject(const redisReadTask *task, double value, char *str, size_t len); static void *createNilObject(const redisReadTask *task); /* Default set of functions to build the reply. Keep in mind that such a @@ -95,6 +95,7 @@ void freeReplyObject(void *reply) { case REDIS_REPLY_ERROR: case REDIS_REPLY_STATUS: case REDIS_REPLY_STRING: + case REDIS_REPLY_DOUBLE: free(r->str); break; } @@ -181,7 +182,7 @@ static void *createIntegerObject(const redisReadTask *task, long long value) { return r; } -static void *createDoubleObject(const redisReadTask *task, double value) { +static void *createDoubleObject(const redisReadTask *task, double value, char *str, size_t len) { redisReply *r, *parent; r = createReplyObject(REDIS_REPLY_DOUBLE); @@ -189,6 +190,19 @@ static void *createDoubleObject(const redisReadTask *task, double value) { return NULL; r->dval = value; + r->str = malloc(len+1); + if (r->str == NULL) { + freeReplyObject(r); + return NULL; + } + + /* The double reply also has the original protocol string representing a + * double as a null terminated string. This way the caller does not need + * to format back for string conversion, especially since Redis does efforts + * to make the string more human readable avoiding the calssical double + * decimal string conversion artifacts. */ + memcpy(r->str, str, len); + r->str[len] = '\0'; if (task->parent) { parent = task->parent->obj; diff --git a/deps/hiredis/hiredis.h b/deps/hiredis/hiredis.h index 40719fe2d..47d7982e9 100644 --- a/deps/hiredis/hiredis.h +++ b/deps/hiredis/hiredis.h @@ -90,7 +90,8 @@ typedef struct redisReply { long long integer; /* The integer when type is REDIS_REPLY_INTEGER */ double dval; /* The double when type is REDIS_REPLY_DOUBLE */ size_t len; /* Length of string */ - char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */ + char *str; /* Used for REDIS_REPLY_ERROR, REDIS_REPLY_STRING + and REDIS_REPLY_DOUBLE (in additionl to dval). */ size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */ struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */ } redisReply; diff --git a/deps/hiredis/read.c b/deps/hiredis/read.c index 32f1c9220..511503cb5 100644 --- a/deps/hiredis/read.c +++ b/deps/hiredis/read.c @@ -304,7 +304,7 @@ static int processLineItem(redisReader *r) { return REDIS_ERR; } } - obj = r->fn->createDouble(cur,d); + obj = r->fn->createDouble(cur,d,buf,len); } else { obj = (void*)REDIS_REPLY_DOUBLE; } diff --git a/deps/hiredis/read.h b/deps/hiredis/read.h index e7c4bd308..db267f81f 100644 --- a/deps/hiredis/read.h +++ b/deps/hiredis/read.h @@ -81,7 +81,7 @@ typedef struct redisReplyObjectFunctions { void *(*createString)(const redisReadTask*, char*, size_t); void *(*createArray)(const redisReadTask*, int); void *(*createInteger)(const redisReadTask*, long long); - void *(*createDouble)(const redisReadTask*, double); + void *(*createDouble)(const redisReadTask*, double, char*, size_t); void *(*createNil)(const redisReadTask*); void (*freeObject)(void*); } redisReplyObjectFunctions; -- cgit v1.2.1