Trigger callbacks when a command is issued or the context is free'd
This commit is contained in:
parent
8345467b2e
commit
1c245845ed
21
hiredis.c
21
hiredis.c
|
@ -575,7 +575,7 @@ static int redisContextConnect(redisContext *c, const char *ip, int port) {
|
|||
}
|
||||
|
||||
static redisContext *redisContextInit(redisReplyFunctions *fn) {
|
||||
redisContext *c = malloc(sizeof(*c));
|
||||
redisContext *c = calloc(sizeof(redisContext),1);
|
||||
c->error = NULL;
|
||||
c->obuf = sdsempty();
|
||||
c->fn = fn == NULL ? &defaultFunctions : fn;
|
||||
|
@ -587,6 +587,8 @@ static redisContext *redisContextInit(redisReplyFunctions *fn) {
|
|||
}
|
||||
|
||||
void redisFree(redisContext *c) {
|
||||
if (c->cbFree != NULL)
|
||||
c->cbFree(c,c->privdataFree);
|
||||
if (c->error != NULL)
|
||||
sdsfree(c->error);
|
||||
if (c->obuf != NULL)
|
||||
|
@ -614,6 +616,19 @@ redisContext *redisConnectNonBlock(const char *ip, int port, redisReplyFunctions
|
|||
return c;
|
||||
}
|
||||
|
||||
/* Register callback that is triggered when a command is put in the output
|
||||
* buffer when the context is non-blocking. */
|
||||
void redisSetCommandCallback(redisContext *c, redisContextCallback *fn, void *privdata) {
|
||||
c->cbCommand = fn;
|
||||
c->privdataCommand = privdata;
|
||||
}
|
||||
|
||||
/* Register callback that is triggered when the context is free'd. */
|
||||
void redisSetFreeCallback(redisContext *c, redisContextCallback *fn, void *privdata) {
|
||||
c->cbFree = fn;
|
||||
c->privdataFree = privdata;
|
||||
}
|
||||
|
||||
/* Use this function to handle a read event on the descriptor. It will try
|
||||
* and read some bytes from the socket and feed them to the reply parser.
|
||||
*
|
||||
|
@ -749,6 +764,10 @@ static int redisCommandWriteNonBlock(redisContext *c, redisCallback *cb, char *s
|
|||
}
|
||||
c->cpos++;
|
||||
|
||||
/* Fire write callback */
|
||||
if (c->cbCommand != NULL)
|
||||
c->cbCommand(c,c->privdataCommand);
|
||||
|
||||
return REDIS_OK;
|
||||
}
|
||||
|
||||
|
|
22
hiredis.h
22
hiredis.h
|
@ -70,11 +70,13 @@ typedef struct redisReplyObjectFunctions {
|
|||
void (*freeObject)(void*);
|
||||
} redisReplyFunctions;
|
||||
|
||||
/* Callback prototype */
|
||||
struct redisContext; /* needs forward declaration of redisContext */
|
||||
typedef void redisCallbackFn(struct redisContext*, redisReply*, void*);
|
||||
struct redisContext; /* need forward declaration of redisContext */
|
||||
|
||||
/* Callback container */
|
||||
/* Callbacks triggered on non-reply events. */
|
||||
typedef void (redisContextCallback)(struct redisContext*, void*);
|
||||
|
||||
/* Reply callback prototype and container */
|
||||
typedef void redisCallbackFn(struct redisContext*, redisReply*, void*);
|
||||
typedef struct redisCallback {
|
||||
redisCallbackFn *fn;
|
||||
void *privdata;
|
||||
|
@ -86,8 +88,18 @@ typedef struct redisContext {
|
|||
int flags;
|
||||
sds error; /* Error object is set when in erronous state */
|
||||
sds obuf; /* Write buffer */
|
||||
|
||||
/* Function set for reply buildup and reply reader */
|
||||
redisReplyFunctions *fn;
|
||||
void *reader;
|
||||
|
||||
/* Non-reply callbacks */
|
||||
redisContextCallback *cbCommand;
|
||||
void *privdataCommand;
|
||||
redisContextCallback *cbFree;
|
||||
void *privdataFree;
|
||||
|
||||
/* Reply callbacks */
|
||||
redisCallback *callbacks;
|
||||
int cpos;
|
||||
int clen;
|
||||
|
@ -103,6 +115,8 @@ int redisReplyReaderGetReply(void *reader, void **reply);
|
|||
|
||||
redisContext *redisConnect(const char *ip, int port, redisReplyFunctions *fn);
|
||||
redisContext *redisConnectNonBlock(const char *ip, int port, redisReplyFunctions *fn);
|
||||
void redisSetCommandCallback(redisContext *c, redisContextCallback *fn, void *privdata);
|
||||
void redisSetFreeCallback(redisContext *c, redisContextCallback *fn, void *privdata);
|
||||
void redisFree(redisContext *c);
|
||||
int redisBufferRead(redisContext *c);
|
||||
int redisBufferWrite(redisContext *c, int *done);
|
||||
|
|
Loading…
Reference in New Issue