MessagePack bugfixes

master
Nicolas Favre-Felix 13 years ago
parent 78932bffd4
commit e676f59f66

@ -65,6 +65,7 @@ on_msgpack_write(void *data, const char *s, unsigned int sz) {
*/ */
void void
msg_info_reply(msgpack_packer* pk, const char *s, size_t sz) { msg_info_reply(msgpack_packer* pk, const char *s, size_t sz) {
const char *p = s; const char *p = s;
unsigned int count = 0; unsigned int count = 0;
@ -122,7 +123,9 @@ msg_info_reply(msgpack_packer* pk, const char *s, size_t sz) {
static void static void
msg_hgetall_reply(msgpack_packer* pk, const redisReply *r) { msg_hgetall_reply(msgpack_packer* pk, const redisReply *r) {
/* zip keys and values together in a msgpack object */ /* zip keys and values together in a msgpack object */
unsigned int i; unsigned int i;
if(r->elements % 2 != 0) { if(r->elements % 2 != 0) {
@ -155,25 +158,23 @@ msgpack_wrap_redis_reply(const struct cmd *cmd, struct msg_out *out, const redis
msgpack_packer* pk = msgpack_packer_new(out, on_msgpack_write); msgpack_packer* pk = msgpack_packer_new(out, on_msgpack_write);
/* copy verb, as jansson only takes a char* but not its length. */ /* copy verb, as jansson only takes a char* but not its length. */
char *verb; char *verb = "";
size_t verb_sz = 0; size_t verb_sz = 0;
if(cmd->count) { if(cmd->count) {
verb = calloc(cmd->argv_len[0]+1, 1);
verb_sz = cmd->argv_len[0]; verb_sz = cmd->argv_len[0];
memcpy(verb, cmd->argv[0], verb_sz); verb = cmd->argv[0];
} else {
verb = strdup("");
} }
/* Create map object */
msgpack_pack_map(pk, 1); msgpack_pack_map(pk, 1);
/* The single element is the verb */
msgpack_pack_raw(pk, verb_sz); msgpack_pack_raw(pk, verb_sz);
msgpack_pack_raw_body(pk, verb, verb_sz); msgpack_pack_raw_body(pk, verb, verb_sz);
switch(r->type) { switch(r->type) {
case REDIS_REPLY_STATUS: case REDIS_REPLY_STATUS:
case REDIS_REPLY_ERROR: case REDIS_REPLY_ERROR:
msgpack_pack_array(pk, 2);
if(r->type == REDIS_REPLY_ERROR) if(r->type == REDIS_REPLY_ERROR)
msgpack_pack_false(pk); msgpack_pack_false(pk);
@ -182,7 +183,7 @@ msgpack_wrap_redis_reply(const struct cmd *cmd, struct msg_out *out, const redis
break; break;
case REDIS_REPLY_STRING: case REDIS_REPLY_STRING:
if(strcasecmp(verb, "INFO") == 0) { if(verb_sz ==4 && strncasecmp(verb, "INFO", 4) == 0) {
msg_info_reply(pk, r->str, r->len); msg_info_reply(pk, r->str, r->len);
} else { } else {
msgpack_pack_raw(pk, r->len); msgpack_pack_raw(pk, r->len);
@ -191,11 +192,11 @@ msgpack_wrap_redis_reply(const struct cmd *cmd, struct msg_out *out, const redis
break; break;
case REDIS_REPLY_INTEGER: case REDIS_REPLY_INTEGER:
msgpack_pack_int64(pk, r->integer); msgpack_pack_int(pk, r->integer);
break; break;
case REDIS_REPLY_ARRAY: case REDIS_REPLY_ARRAY:
if(strcasecmp(verb, "HGETALL") == 0) { if(verb_sz == 7 && strncasecmp(verb, "HGETALL", 7) == 0) {
msg_hgetall_reply(pk, r); msg_hgetall_reply(pk, r);
break; break;
} }
@ -210,7 +211,7 @@ msgpack_wrap_redis_reply(const struct cmd *cmd, struct msg_out *out, const redis
msgpack_pack_raw_body(pk, e->str, e->len); msgpack_pack_raw_body(pk, e->str, e->len);
break; break;
case REDIS_REPLY_INTEGER: case REDIS_REPLY_INTEGER:
msgpack_pack_int64(pk, e->integer); msgpack_pack_int(pk, e->integer);
break; break;
default: default:
msgpack_pack_nil(pk); msgpack_pack_nil(pk);
@ -225,6 +226,5 @@ msgpack_wrap_redis_reply(const struct cmd *cmd, struct msg_out *out, const redis
break; break;
} }
free(verb);
msgpack_packer_free(pk); msgpack_packer_free(pk);
} }

@ -1,14 +1,10 @@
#ifndef MSGPACK_H #ifndef MSGPACK_H
#define MSGPACK_H #define MSGPACK_H
#include <jansson.h>
#include <msgpack.h> #include <msgpack.h>
#include <hiredis/hiredis.h> #include <hiredis/hiredis.h>
#include <hiredis/async.h> #include <hiredis/async.h>
struct cmd;
struct http_client;
void void
msgpack_reply(redisAsyncContext *c, void *r, void *privdata); msgpack_reply(redisAsyncContext *c, void *r, void *privdata);

Loading…
Cancel
Save