ndb_redis: redis_cmd changed into a variadic function.
authorVicente Hernando <vhernando@systemonenoc.com>
Tue, 10 Jul 2012 09:48:45 +0000 (05:48 -0400)
committerVicente Hernando <vhernando@systemonenoc.com>
Tue, 10 Jul 2012 10:03:06 +0000 (12:03 +0200)
- command string can be split into several strings.

modules/ndb_redis/ndb_redis_mod.c
modules/ndb_redis/redis_client.c
modules/ndb_redis/redis_client.h

index c1f2b13..ecce4e9 100644 (file)
@@ -161,7 +161,7 @@ static int w_redis_cmd3(struct sip_msg* msg, char* ssrv, char* scmd, char* sres)
                return -1;
        }
 
-       if(redisc_exec(&s[0], &s[1], NULL, NULL, NULL, &s[2])<0)
+       if(redisc_exec(&s[0], &s[2], &s[1])<0)
                return -1;
        return 1;
 }
@@ -172,7 +172,9 @@ static int w_redis_cmd3(struct sip_msg* msg, char* ssrv, char* scmd, char* sres)
 static int w_redis_cmd4(struct sip_msg* msg, char* ssrv, char* scmd,
                char *sargv1, char* sres)
 {
-       str s[4];
+       str s[3];
+       str arg1;
+       char c1;
 
        if(fixup_get_svalue(msg, (gparam_t*)ssrv, &s[0])!=0)
        {
@@ -184,19 +186,24 @@ static int w_redis_cmd4(struct sip_msg* msg, char* ssrv, char* scmd,
                LM_ERR("no redis command\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &s[2])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &arg1)!=0)
        {
                LM_ERR("no argument 1\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[3])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[2])!=0)
        {
                LM_ERR("no redis reply name\n");
                return -1;
        }
 
-       if(redisc_exec(&s[0], &s[1], &s[2], NULL, NULL, &s[3])<0)
+       c1 = arg1.s[arg1.len];
+       arg1.s[arg1.len] = '\0';
+       if(redisc_exec(&s[0], &s[2], &s[1], arg1.s)<0) {
+               arg1.s[arg1.len] = c1;
                return -1;
+       }
+       arg1.s[arg1.len] = c1;
        return 1;
 }
 
@@ -206,7 +213,9 @@ static int w_redis_cmd4(struct sip_msg* msg, char* ssrv, char* scmd,
 static int w_redis_cmd5(struct sip_msg* msg, char* ssrv, char* scmd,
                char *sargv1, char *sargv2, char* sres)
 {
-       str s[5];
+       str s[3];
+       str arg1, arg2;
+       char c1, c2;
 
        if(fixup_get_svalue(msg, (gparam_t*)ssrv, &s[0])!=0)
        {
@@ -218,24 +227,33 @@ static int w_redis_cmd5(struct sip_msg* msg, char* ssrv, char* scmd,
                LM_ERR("no redis command\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &s[2])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &arg1)!=0)
        {
                LM_ERR("no argument 1\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv2, &s[3])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv2, &arg2)!=0)
        {
                LM_ERR("no argument 2\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[4])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[2])!=0)
        {
                LM_ERR("no redis reply name\n");
                return -1;
        }
 
-       if(redisc_exec(&s[0], &s[1], &s[2], &s[3], NULL, &s[4])<0)
+       c1 = arg1.s[arg1.len];
+       c2 = arg2.s[arg2.len];
+       arg1.s[arg1.len] = '\0';
+       arg2.s[arg2.len] = '\0';
+       if(redisc_exec(&s[0], &s[2], &s[1], arg1.s, arg2.s)<0) {
+               c1 = arg1.s[arg1.len];
+               c2 = arg2.s[arg2.len];
                return -1;
+       }
+       c1 = arg1.s[arg1.len];
+       c2 = arg2.s[arg2.len];
        return 1;
 }
 
@@ -245,7 +263,9 @@ static int w_redis_cmd5(struct sip_msg* msg, char* ssrv, char* scmd,
 static int w_redis_cmd6(struct sip_msg* msg, char* ssrv, char* scmd,
                char *sargv1, char *sargv2, char *sargv3, char* sres)
 {
-       str s[6];
+       str s[3];
+       str arg1, arg2, arg3;
+       char c1, c2, c3;
 
        if(fixup_get_svalue(msg, (gparam_t*)ssrv, &s[0])!=0)
        {
@@ -257,29 +277,42 @@ static int w_redis_cmd6(struct sip_msg* msg, char* ssrv, char* scmd,
                LM_ERR("no redis command\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &s[2])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv1, &arg1)!=0)
        {
                LM_ERR("no argument 1\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv2, &s[3])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv2, &arg2)!=0)
        {
                LM_ERR("no argument 2\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sargv3, &s[4])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sargv3, &arg3)!=0)
        {
                LM_ERR("no argument 3\n");
                return -1;
        }
-       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[5])!=0)
+       if(fixup_get_svalue(msg, (gparam_t*)sres, &s[2])!=0)
        {
                LM_ERR("no redis reply name\n");
                return -1;
        }
 
-       if(redisc_exec(&s[0], &s[1], &s[2], &s[3], &s[4], &s[5])<0)
+       c1 = arg1.s[arg1.len];
+       c2 = arg2.s[arg2.len];
+       c3 = arg3.s[arg3.len];
+       arg1.s[arg1.len] = '\0';
+       arg2.s[arg2.len] = '\0';
+       arg3.s[arg3.len] = '\0';
+       if(redisc_exec(&s[0], &s[2], &s[1], arg1.s, arg2.s, arg3.s)<0) {
+               c1 = arg1.s[arg1.len];
+               c2 = arg2.s[arg2.len];
+               c3 = arg3.s[arg3.len];
                return -1;
+       }
+       c1 = arg1.s[arg1.len];
+       c2 = arg2.s[arg2.len];
+       c3 = arg3.s[arg3.len];
        return 1;
 }
 
index 267c8f5..84e9e9e 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/time.h>
+#include <stdarg.h>
 
 #include "../../mem/mem.h"
 #include "../../dprint.h"
@@ -310,23 +311,25 @@ err:
 /**
  *
  */
-int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
-               str *res)
+int redisc_exec(str *srv, str *res, str *cmd, ...)
 {
        redisc_server_t *rsrv=NULL;
        redisc_reply_t *rpl;
        char c;
+       va_list ap;
+
+       va_start(ap, cmd);
 
        rsrv = redisc_get_server(srv);
        if(srv==NULL || cmd==NULL || res==NULL)
        {
                LM_ERR("invalid parameters");
-               return -1;
+               goto error_exec;
        }
        if(rsrv==NULL)
        {
                LM_ERR("no redis server found: %.*s\n", srv->len, srv->s);
-               return -1;
+               goto error_exec;
        }
        if(rsrv->ctxRedis==NULL)
        {
@@ -337,7 +340,7 @@ int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
        if(rpl==NULL)
        {
                LM_ERR("no redis reply id found: %.*s\n", res->len, res->s);
-               return -1;
+               goto error_exec;
        }
        if(rpl->rplRedis!=NULL)
        {
@@ -347,19 +350,24 @@ int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
        }
        c = cmd->s[cmd->len];
        cmd->s[cmd->len] = '\0';
-       rpl->rplRedis = redisCommand(rsrv->ctxRedis, cmd->s);
+       rpl->rplRedis = redisvCommand(rsrv->ctxRedis, cmd->s, ap );
        if(rpl->rplRedis == NULL)
        {
                /* null reply, reconnect and try again */
                if(redisc_reconnect_server(rsrv)==0)
                {
-                       rpl->rplRedis = redisCommand(rsrv->ctxRedis, cmd->s);
+                       rpl->rplRedis = redisvCommand(rsrv->ctxRedis, cmd->s, ap);
                }
        }
        cmd->s[cmd->len] = c;
+       va_end(ap);
        return 0;
-}
 
+error_exec:
+       va_end(ap);
+       return -1;
+
+}
 
 /**
  *
index f4d29f4..8aebe77 100644 (file)
@@ -33,8 +33,7 @@
 int redisc_init(void);
 int redisc_destroy(void);
 int redisc_add_server(char *spec);
-int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
-               str *res);
+int redisc_exec(str *srv, str *res, str *cmd, ...);
 
 typedef struct redisc_server {
        str *sname;