summaryrefslogtreecommitdiff
path: root/deps/hiredis
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2018-12-06 11:43:11 +0100
committerantirez <antirez@gmail.com>2019-01-09 17:00:30 +0100
commit045b1f633977926e37a8c77ccd311734abb56749 (patch)
tree8cb07a6bb30f5cc29ecba5befd9c9849ea98c7f2 /deps/hiredis
parentee4c355a3e5f46ed9ce5749228f9c15e2b1be427 (diff)
downloadredis-045b1f633977926e37a8c77ccd311734abb56749.tar.gz
RESP3: hiredis: save the original double string.
Diffstat (limited to 'deps/hiredis')
-rw-r--r--deps/hiredis/hiredis.c18
-rw-r--r--deps/hiredis/hiredis.h3
-rw-r--r--deps/hiredis/read.c2
-rw-r--r--deps/hiredis/read.h2
4 files changed, 20 insertions, 5 deletions
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;