txt array support

master
Karoly Negyesi 13 years ago
parent 05bcc6098a
commit 4732d4f3b0

@ -114,3 +114,18 @@ format_send_reply(struct cmd *cmd, const char *p, size_t sz, const char *content
}
}
int
integer_length(long long int i) {
int sz = 0;
int ci = abs(i);
while (ci > 0) {
ci = (ci/10);
sz += 1;
}
if(i == 0) { /* log 0 doesn't make sense. */
sz = 1;
} else if(i < 0) { /* allow for neg sign as well. */
sz++;
}
return sz;
}

@ -12,5 +12,7 @@ format_send_reply(struct cmd *cmd,
void
format_send_error(struct cmd *cmd, short code, const char *msg);
int
integer_length(long long int i);
#endif

@ -7,6 +7,9 @@
#include <hiredis/hiredis.h>
#include <hiredis/async.h>
static char *
custom_array(const redisReply *r, size_t *sz);
void
custom_type_reply(redisAsyncContext *c, void *r, void *privdata) {
@ -17,6 +20,9 @@ custom_type_reply(redisAsyncContext *c, void *r, void *privdata) {
char *status_buf;
int int_len;
struct http_response *resp;
size_t sz;
char *array_out;
if (reply == NULL) { /* broken Redis link */
format_send_error(cmd, 503, "Service Unavailable");
@ -47,6 +53,11 @@ custom_type_reply(redisAsyncContext *c, void *r, void *privdata) {
int_len = sprintf(int_buffer, "%lld", reply->integer);
format_send_reply(cmd, int_buffer, int_len, cmd->mime);
return;
case REDIS_REPLY_ARRAY:
array_out = custom_array(r, &sz);
format_send_reply(cmd, array_out, sz, cmd->mime);
free(array_out);
return;
}
}
@ -61,3 +72,46 @@ custom_type_reply(redisAsyncContext *c, void *r, void *privdata) {
}
}
static char *
custom_array(const redisReply *r, size_t *sz) {
unsigned int i;
char *ret, *p;
/* compute size */
*sz = 0;
for(i = 0; i < r->elements; ++i) {
redisReply *e = r->element[i];
switch(e->type) {
case REDIS_REPLY_STRING:
*sz += (i ? 1 : 0) + e->len;
break;
case REDIS_REPLY_INTEGER:
*sz += 1 + integer_length(e->integer);
break;
}
}
/* allocate */
p = ret = malloc(*sz);
/* copy */
for(i = 0; i < r->elements; ++i) {
redisReply *e = r->element[i];
switch(e->type) {
case REDIS_REPLY_STRING:
if (i) {
p += sprintf(p, ",");
}
memcpy(p, e->str, e->len);
p += e->len;
break;
case REDIS_REPLY_INTEGER:
p += sprintf(p, i ? ",%lld" : "%lld", e->integer);
break;
}
}
return ret;
}

@ -34,22 +34,6 @@ raw_reply(redisAsyncContext *c, void *r, void *privdata) {
free(raw_out);
}
static int
integer_length(long long int i) {
int sz = 0;
int ci = abs(i);
while (ci > 0) {
ci = (ci/10);
sz += 1;
}
if(i == 0) { /* log 0 doesn't make sense. */
sz = 1;
} else if(i < 0) { /* allow for neg sign as well. */
sz++;
}
return sz;
}
/* extract Redis protocol string from WebSocket frame and fill struct cmd. */
struct cmd *
raw_ws_extract(struct http_client *c, const char *p, size_t sz) {

Loading…
Cancel
Save