Rename functions to be more consistent, split feed from get reply
This commit is contained in:
parent
b1bedf5c6d
commit
af8ba74cbf
34
hiredis.c
34
hiredis.c
@ -374,7 +374,7 @@ static int processItem(redisReader *r) {
|
|||||||
|
|
||||||
#define READ_BUFFER_SIZE 2048
|
#define READ_BUFFER_SIZE 2048
|
||||||
static redisReply *redisReadReply(int fd) {
|
static redisReply *redisReadReply(int fd) {
|
||||||
void *reader = redisCreateReplyReader(&defaultFunctions);
|
void *reader = redisReplyReaderCreate(&defaultFunctions);
|
||||||
redisReply *reply;
|
redisReply *reply;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int nread;
|
int nread;
|
||||||
@ -384,15 +384,16 @@ static redisReply *redisReadReply(int fd) {
|
|||||||
reply = createErrorObject(reader,"I/O error");
|
reply = createErrorObject(reader,"I/O error");
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
reply = redisFeedReplyReader(reader,buf,nread);
|
redisReplyReaderFeed(reader,buf,nread);
|
||||||
|
reply = redisReplyReaderGetReply(reader);
|
||||||
}
|
}
|
||||||
} while (reply == NULL);
|
} while (reply == NULL);
|
||||||
|
|
||||||
redisFreeReplyReader(reader);
|
redisReplyReaderFree(reader);
|
||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *redisCreateReplyReader(redisReplyFunctions *fn) {
|
void *redisReplyReaderCreate(redisReplyFunctions *fn) {
|
||||||
redisReader *r = calloc(sizeof(redisReader),1);
|
redisReader *r = calloc(sizeof(redisReader),1);
|
||||||
r->fn = fn == NULL ? &defaultFunctions : fn;
|
r->fn = fn == NULL ? &defaultFunctions : fn;
|
||||||
r->buf = sdsempty();
|
r->buf = sdsempty();
|
||||||
@ -404,12 +405,12 @@ void *redisCreateReplyReader(redisReplyFunctions *fn) {
|
|||||||
* 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
|
||||||
* otherwise be free'd by garbage collection. */
|
* otherwise be free'd by garbage collection. */
|
||||||
void *redisGetReplyObjectFromReplyReader(void *reader) {
|
void *redisReplyReaderGetObject(void *reader) {
|
||||||
redisReader *r = reader;
|
redisReader *r = reader;
|
||||||
return r->reply;
|
return r->reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void redisFreeReplyReader(void *reader) {
|
void redisReplyReaderFree(void *reader) {
|
||||||
redisReader *r = reader;
|
redisReader *r = reader;
|
||||||
if (r->reply != NULL)
|
if (r->reply != NULL)
|
||||||
r->fn->freeObject(r->reply);
|
r->fn->freeObject(r->reply);
|
||||||
@ -420,13 +421,6 @@ void redisFreeReplyReader(void *reader) {
|
|||||||
free(r);
|
free(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
int redisIsReplyReaderEmpty(void *reader) {
|
|
||||||
redisReader *r = reader;
|
|
||||||
if ((r->buf != NULL && sdslen(r->buf) > 0) ||
|
|
||||||
(r->rpos < r->rlen)) return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void redisSetReplyReaderError(redisReader *r, void *obj) {
|
static void redisSetReplyReaderError(redisReader *r, void *obj) {
|
||||||
if (r->reply != NULL)
|
if (r->reply != NULL)
|
||||||
r->fn->freeObject(r->reply);
|
r->fn->freeObject(r->reply);
|
||||||
@ -441,16 +435,20 @@ static void redisSetReplyReaderError(redisReader *r, void *obj) {
|
|||||||
r->reply = obj;
|
r->reply = obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *redisFeedReplyReader(void *reader, char *buf, int len) {
|
void redisReplyReaderFeed(void *reader, char *buf, int len) {
|
||||||
redisReader *r = reader;
|
redisReader *r = reader;
|
||||||
|
|
||||||
/* Check if we are able to do *something*. */
|
|
||||||
if (sdslen(r->buf) == 0 && (buf == NULL || len <= 0))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Copy the provided buffer. */
|
/* Copy the provided buffer. */
|
||||||
if (buf != NULL && len >= 1)
|
if (buf != NULL && len >= 1)
|
||||||
r->buf = sdscatlen(r->buf,buf,len);
|
r->buf = sdscatlen(r->buf,buf,len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *redisReplyReaderGetReply(void *reader) {
|
||||||
|
redisReader *r = reader;
|
||||||
|
|
||||||
|
/* When the buffer is empty, there will never be a reply. */
|
||||||
|
if (sdslen(r->buf) == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Create first item to process when the item list is empty. */
|
/* Create first item to process when the item list is empty. */
|
||||||
if (r->rlen == 0) {
|
if (r->rlen == 0) {
|
||||||
|
10
hiredis.h
10
hiredis.h
@ -66,10 +66,10 @@ typedef struct redisReplyObjectFunctions {
|
|||||||
redisReply *redisConnect(int *fd, const char *ip, int port);
|
redisReply *redisConnect(int *fd, const char *ip, int port);
|
||||||
void freeReplyObject(void *reply);
|
void freeReplyObject(void *reply);
|
||||||
redisReply *redisCommand(int fd, const char *format, ...);
|
redisReply *redisCommand(int fd, const char *format, ...);
|
||||||
void *redisCreateReplyReader(redisReplyFunctions *fn);
|
void *redisReplyReaderCreate(redisReplyFunctions *fn);
|
||||||
void *redisGetReplyObjectFromReplyReader(void *reader);
|
void *redisReplyReaderGetObject(void *reader);
|
||||||
void redisFreeReplyReader(void *ptr);
|
void redisReplyReaderFree(void *ptr);
|
||||||
int redisIsReplyReaderEmpty(void *ptr);
|
void redisReplyReaderFeed(void *reader, char *buf, int len);
|
||||||
void *redisFeedReplyReader(void *reader, char *buf, int len);
|
void *redisReplyReaderGetReply(void *reader);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
18
test.c
18
test.c
@ -124,24 +124,26 @@ int main(void) {
|
|||||||
freeReplyObject(reply);
|
freeReplyObject(reply);
|
||||||
|
|
||||||
test("Error handling in reply parser: ");
|
test("Error handling in reply parser: ");
|
||||||
reader = redisCreateReplyReader(NULL);
|
reader = redisReplyReaderCreate(NULL);
|
||||||
reply = redisFeedReplyReader(reader,(char*)"@foo\r\n",6);
|
redisReplyReaderFeed(reader,(char*)"@foo\r\n",6);
|
||||||
|
reply = redisReplyReaderGetReply(reader);
|
||||||
test_cond(reply->type == REDIS_PROTOCOL_ERROR &&
|
test_cond(reply->type == REDIS_PROTOCOL_ERROR &&
|
||||||
strcasecmp(reply->reply,"protocol error, got \"@\" as reply type byte") == 0);
|
strcasecmp(reply->reply,"protocol error, got \"@\" as reply type byte") == 0);
|
||||||
freeReplyObject(reply);
|
freeReplyObject(reply);
|
||||||
redisFreeReplyReader(reader);
|
redisReplyReaderFree(reader);
|
||||||
|
|
||||||
/* when the reply already contains multiple items, they must be free'd
|
/* when the reply already contains multiple items, they must be free'd
|
||||||
* on an error. valgrind will bark when this doesn't happen. */
|
* on an error. valgrind will bark when this doesn't happen. */
|
||||||
test("Memory cleanup in reply parser: ");
|
test("Memory cleanup in reply parser: ");
|
||||||
reader = redisCreateReplyReader(NULL);
|
reader = redisReplyReaderCreate(NULL);
|
||||||
redisFeedReplyReader(reader,(char*)"*2\r\n",4);
|
redisReplyReaderFeed(reader,(char*)"*2\r\n",4);
|
||||||
redisFeedReplyReader(reader,(char*)"$5\r\nhello\r\n",11);
|
redisReplyReaderFeed(reader,(char*)"$5\r\nhello\r\n",11);
|
||||||
reply = redisFeedReplyReader(reader,(char*)"@foo\r\n",6);
|
redisReplyReaderFeed(reader,(char*)"@foo\r\n",6);
|
||||||
|
reply = redisReplyReaderGetReply(reader);
|
||||||
test_cond(reply->type == REDIS_PROTOCOL_ERROR &&
|
test_cond(reply->type == REDIS_PROTOCOL_ERROR &&
|
||||||
strcasecmp(reply->reply,"protocol error, got \"@\" as reply type byte") == 0);
|
strcasecmp(reply->reply,"protocol error, got \"@\" as reply type byte") == 0);
|
||||||
freeReplyObject(reply);
|
freeReplyObject(reply);
|
||||||
redisFreeReplyReader(reader);
|
redisReplyReaderFree(reader);
|
||||||
|
|
||||||
test("Throughput:\n");
|
test("Throughput:\n");
|
||||||
for (i = 0; i < 500; i++)
|
for (i = 0; i < 500; i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user