Trigger callbacks when a command is issued or the context is free'd

This commit is contained in:
Pieter Noordhuis 2010-09-25 22:31:07 +02:00
parent 8345467b2e
commit 1c245845ed
2 changed files with 38 additions and 5 deletions

View File

@ -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;
}

View File

@ -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);