static int cr_sendfandreceive(NDPI_REDIS rhnd, char recvtype, const char *format, ...) { int rc; va_list ap; cr_buffer *buf = &(rhnd->buf); va_start(ap, format); rc = vsnprintf(buf->data, buf->size, format, ap); va_end(ap); if (rc < 0) return -1; if (rc >= buf->size) { DEBUG_PRINT("truncated, get more memory and try again"); if (cr_moremem(buf, rc - buf->size + 1)) return NDPI_CREDIS_ERR_NOMEM; va_start(ap, format); rc = vsnprintf(buf->data, buf->size, format, ap); va_end(ap); } buf->len = rc; return cr_sendandreceive(rhnd, recvtype); }
static int cr_multikeystorecommand(NDPI_REDIS rhnd, const char *cmd, const char *destkey, int keyc, const char **keyv) { cr_buffer *buf = &(rhnd->buf); int rc; buf->len = 0; if ((rc = cr_appendstr(buf, cmd, 0)) != 0) return rc; if ((rc = cr_appendstr(buf, destkey, 1)) != 0) return rc; if ((rc = cr_appendstrarray(buf, keyc, keyv, 1)) != 0) return rc; return cr_sendandreceive(rhnd, CR_INLINE); }
static int cr_multikeybulkcommand(NDPI_REDIS rhnd, const char *cmd, int keyc, const char **keyv, char ***valv) { cr_buffer *buf = &(rhnd->buf); int rc; buf->len = 0; if ((rc = cr_appendstr(buf, cmd, 0)) != 0) return rc; if ((rc = cr_appendstrarray(buf, keyc, keyv, 1)) != 0) return rc; if ((rc = cr_sendandreceive(rhnd, CR_MULTIBULK)) == 0) { *valv = rhnd->reply.multibulk.bulks; rc = rhnd->reply.multibulk.len; } return rc; }
/* TODO add writev() support instead and push strings to send onto a vector of * strings to send instead... */ static int cr_zstore(NDPI_REDIS rhnd, int inter, const char *destkey, int keyc, const char **keyv, const int *weightv, NDPI_REDIS_AGGREGATE aggregate) { cr_buffer *buf = &(rhnd->buf); int rc, i; buf->len = 0; if ((rc = cr_appendstrf(buf, "%s %s %d ", inter?"ZINTERSTORE":"ZUNIONSTORE", destkey, keyc)) != 0) return rc; if ((rc = cr_appendstrarray(buf, keyc, keyv, 0)) != 0) return rc; if (weightv != NULL) for (i = 0; i < keyc; i++) if ((rc = cr_appendstrf(buf, " %d", weightv[i])) != 0) return rc; switch (aggregate) { case NDPI_SUM: rc = cr_appendstr(buf, "AGGREGATE SUM", 0); break; case NDPI_MIN: rc = cr_appendstr(buf, "AGGREGATE MIN", 0); break; case NDPI_MAX: rc = cr_appendstr(buf, "AGGREGATE MAX", 0); break; case NDPI_NONE: ; /* avoiding compiler warning */ } if (rc != 0) return rc; if ((rc = cr_appendstr(buf, "\r\n", 0)) != 0) return rc; if ((rc = cr_sendandreceive(rhnd, CR_INT)) == 0) rc = rhnd->reply.integer; return rc; }
//__attribute__ ((format(printf,3,4))) static int cr_sendfandreceive(REDIS rhnd, char recvtype, const char *format, ...) { int rc; va_list ap; cr_buffer *buf = &(rhnd->buf); #ifdef WIN32 ap = NULL; #endif va_start(ap, format); #ifdef WIN32 memset(buf->data, 0, buf->size); rc = _vsnprintf(buf->data, buf->size, format, ap); #else rc = vsnprintf(buf->data, buf->size, format, ap); #endif va_end(ap); if (rc < 0) return -1; if (rc >= buf->size) { DEBUG("truncated, get more memory and try again"); if (cr_moremem(buf, rc - buf->size + 1)) return CREDIS_ERR_NOMEM; va_start(ap, format); rc = vsnprintf(buf->data, buf->size, format, ap); va_end(ap); } buf->len = rc; return cr_sendandreceive(rhnd, recvtype); }