Commit 1927c643 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

Add privdata field to reply reader

This field is set in the read tasks that are passed to the reply object
functions. This allows to curry arbitrary data to these functions.
parent fb49cd19
...@@ -48,6 +48,7 @@ typedef struct redisReader { ...@@ -48,6 +48,7 @@ typedef struct redisReader {
redisReadTask rstack[3]; /* stack of read tasks */ redisReadTask rstack[3]; /* stack of read tasks */
int ridx; /* index of stack */ int ridx; /* index of stack */
void *privdata; /* user-settable arbitrary field */
} redisReader; } redisReader;
static redisReply *createReplyObject(int type); static redisReply *createReplyObject(int type);
...@@ -307,6 +308,7 @@ static int processMultiBulkItem(redisReader *r) { ...@@ -307,6 +308,7 @@ static int processMultiBulkItem(redisReader *r) {
r->rstack[r->ridx].elements = -1; r->rstack[r->ridx].elements = -1;
r->rstack[r->ridx].parent = obj; r->rstack[r->ridx].parent = obj;
r->rstack[r->ridx].idx = 0; r->rstack[r->ridx].idx = 0;
r->rstack[r->ridx].privdata = r->privdata;
} else { } else {
moveToNextTask(r); moveToNextTask(r);
} }
...@@ -393,6 +395,17 @@ int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFuncti ...@@ -393,6 +395,17 @@ int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFuncti
return REDIS_ERR; return REDIS_ERR;
} }
/* Set the private data field that is used in the read tasks. This argument can
* be used to curry arbitrary data to the custom reply object functions. */
int redisReplyReaderSetPrivdata(void *reader, void *privdata) {
redisReader *r = reader;
if (r->reply == NULL) {
r->privdata = privdata;
return REDIS_OK;
}
return REDIS_ERR;
}
/* External libraries wrapping hiredis might need access to the temporary /* External libraries wrapping hiredis might need access to the temporary
* variable while the reply is built up. When the reader contains an * variable while the reply is built up. When the reader contains an
* object in between receiving some bytes to parse, this object might * object in between receiving some bytes to parse, this object might
...@@ -426,6 +439,7 @@ static void redisSetReplyReaderError(redisReader *r, sds err) { ...@@ -426,6 +439,7 @@ static void redisSetReplyReaderError(redisReader *r, sds err) {
r->ridx = -1; r->ridx = -1;
r->error = err; r->error = err;
} }
int redisReplyReaderSetPrivdata(void *reader, void *privdata);
char *redisReplyReaderGetError(void *reader) { char *redisReplyReaderGetError(void *reader) {
redisReader *r = reader; redisReader *r = reader;
...@@ -454,6 +468,7 @@ int redisReplyReaderGetReply(void *reader, void **reply) { ...@@ -454,6 +468,7 @@ int redisReplyReaderGetReply(void *reader, void **reply) {
r->rstack[0].elements = -1; r->rstack[0].elements = -1;
r->rstack[0].parent = NULL; r->rstack[0].parent = NULL;
r->rstack[0].idx = -1; r->rstack[0].idx = -1;
r->rstack[0].privdata = r->privdata;
r->ridx = 0; r->ridx = 0;
} }
......
...@@ -88,6 +88,7 @@ typedef struct redisReadTask { ...@@ -88,6 +88,7 @@ typedef struct redisReadTask {
int elements; /* number of elements in multibulk container */ int elements; /* number of elements in multibulk container */
void *parent; /* optional pointer to parent object */ void *parent; /* optional pointer to parent object */
int idx; /* index in parent (array) object */ int idx; /* index in parent (array) object */
void *privdata; /* user-settable arbitrary field */
} redisReadTask; } redisReadTask;
typedef struct redisReplyObjectFunctions { typedef struct redisReplyObjectFunctions {
...@@ -116,6 +117,7 @@ typedef struct redisContext { ...@@ -116,6 +117,7 @@ typedef struct redisContext {
void freeReplyObject(void *reply); void freeReplyObject(void *reply);
void *redisReplyReaderCreate(); void *redisReplyReaderCreate();
int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFunctions *fn); int redisReplyReaderSetReplyObjectFunctions(void *reader, redisReplyObjectFunctions *fn);
int redisReplyReaderSetPrivdata(void *reader, void *privdata);
void *redisReplyReaderGetObject(void *reader); void *redisReplyReaderGetObject(void *reader);
char *redisReplyReaderGetError(void *reader); char *redisReplyReaderGetError(void *reader);
void redisReplyReaderFree(void *ptr); void redisReplyReaderFree(void *ptr);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment