Module: sip-router
Branch: master
Commit: e8f6a95d43b6a4340cf7e97213af5c71fa2a69e9
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e8f6a95d43b6a4340cf7e97213af5c71fa2a69e9

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date:   Tue Oct 12 14:52:07 2010 +0200

acc(k): table name for db acc can be dynamic

- you can include variables in table name and will be evaluated at
  runtime:
    modparam("acc", "db_table_acc", "acc_$time(year)_$time(mon)")
  will write now to table acc_2010_10
- same can be done for missed_calls table name
- second parameter of acc_db_request() supports as well config variables

---

 modules_k/acc/acc_logic.c |   52 +++++++++++++++++++++++++++++++++++++++-----
 modules_k/acc/acc_mod.c   |   24 ++++++++++++++++++++
 modules_k/acc/acc_mod.h   |    2 +
 3 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/modules_k/acc/acc_logic.c b/modules_k/acc/acc_logic.c
index e460404..38666a1 100644
--- a/modules_k/acc/acc_logic.c
+++ b/modules_k/acc/acc_logic.c
@@ -39,6 +39,7 @@
 #include <string.h>
 
 #include "../../dprint.h"
+#include "../../sr_module.h"
 #include "../../parser/parse_from.h"
 #include "../../parser/parse_content.h"
 #include "../../modules/tm/tm_load.h"
@@ -101,8 +102,6 @@ struct acc_enviroment acc_env;
        (((_rq)->REQ_METHOD==METHOD_CANCEL) && report_cancels==0)
 
 
-
-
 static void tmcb_func( struct cell* t, int type, struct tmcb_params *ps );
 
 
@@ -180,6 +179,35 @@ int w_acc_log_request(struct sip_msg *rq, char *comment, 
char *foo)
 
 
 #ifdef SQL_ACC
+int acc_db_set_table_name(struct sip_msg *msg, void *param, str *table)
+{
+#define DB_TABLE_NAME_SIZE     64
+       static char db_table_name_buf[DB_TABLE_NAME_SIZE];
+       str dbtable;
+
+       if(param!=NULL) {
+               if(get_str_fparam(&dbtable, msg, (fparam_t*)param)<0) {
+                       LM_ERR("cannot get acc db table name\n");
+                       return -1;
+               }
+               if(dbtable.len>=DB_TABLE_NAME_SIZE) {
+                       LM_ERR("acc db table name too big [%.*s] max %d\n",
+                                       dbtable.len, dbtable.s, 
DB_TABLE_NAME_SIZE);
+                       return -1;
+               }
+               strncpy(db_table_name_buf, dbtable.s, dbtable.len);
+               env_set_text(db_table_name_buf, dbtable.len);
+       } else {
+               if(table==NULL) {
+                       LM_ERR("no acc table name\n");
+                       return -1;
+               }
+               env_set_text(table->s, table->len);
+       }
+       return 0;
+}
+
+
 int w_acc_db_request(struct sip_msg *rq, char *comment, char *table)
 {
        if (!table) {
@@ -188,9 +216,12 @@ int w_acc_db_request(struct sip_msg *rq, char *comment, 
char *table)
        }
        if (acc_preparse_req(rq)<0)
                return -1;
+       if(acc_db_set_table_name(rq, (void*)table, NULL)<0) {
+               LM_ERR("cannot set table name\n");
+               return -1;
+    }
        env_set_to( rq->to );
        env_set_comment((struct acc_param*)comment);
-       env_set_text(table, strlen(table));
        return acc_db_request(rq);
 }
 #endif
@@ -318,7 +349,10 @@ static inline void on_missed(struct cell *t, struct 
sip_msg *req,
        }
 #ifdef SQL_ACC
        if (is_db_mc_on(req)) {
-               env_set_text(db_table_mc.s, db_table_mc.len);
+               if(acc_db_set_table_name(req, db_table_mc_data, 
&db_table_mc)<0) {
+                       LM_ERR("cannot set missed call db table name\n");
+                       return;
+               }
                acc_db_request( req );
                flags_to_reset |= db_missed_flag;
        }
@@ -386,7 +420,10 @@ static inline void acc_onreply( struct cell* t, struct 
sip_msg *req,
        }
 #ifdef SQL_ACC
        if (is_db_acc_on(req)) {
-               env_set_text( db_table_acc.s, db_table_acc.len);
+               if(acc_db_set_table_name(req, db_table_acc_data, 
&db_table_acc)<0) {
+                       LM_ERR("cannot set acc db table name\n");
+                       return;
+               }
                acc_db_request(req);
        }
 #endif
@@ -427,7 +464,10 @@ static inline void acc_onack( struct cell* t, struct 
sip_msg *req,
        }
 #ifdef SQL_ACC
        if (is_db_acc_on(req)) {
-               env_set_text( db_table_acc.s, db_table_acc.len);
+               if(acc_db_set_table_name(ack, db_table_acc_data, 
&db_table_acc)<0) {
+                       LM_ERR("cannot set acc db table name\n");
+                       return;
+               }
                acc_db_request( ack );
        }
 #endif
diff --git a/modules_k/acc/acc_mod.c b/modules_k/acc/acc_mod.c
index 5ded9a4..6cfef81 100644
--- a/modules_k/acc/acc_mod.c
+++ b/modules_k/acc/acc_mod.c
@@ -164,7 +164,9 @@ static char *db_extra_str = 0;              /*!< db extra 
variables */
 struct acc_extra *db_extra = 0;
 static str db_url = {NULL, 0};         /*!< Database url */
 str db_table_acc = str_init("acc");    /*!< name of database tables */
+void *db_table_acc_data = NULL;
 str db_table_mc = str_init("missed_calls");
+void *db_table_mc_data = NULL;
 /* names of columns in tables acc/missed calls*/
 str acc_method_col     = str_init("method");
 str acc_fromtag_col    = str_init("from_tag");
@@ -318,6 +320,8 @@ static int acc_fixup(void** param, int param_no)
                if (db_url.s==0) {
                        pkg_free(p);
                        *param = 0;
+               } else {
+                       return fixup_var_pve_str_12(param, 2);
                }
 #endif
        }
@@ -363,7 +367,27 @@ static int mod_init( void )
        if (db_url.s)
                db_url.len = strlen(db_url.s);
        db_table_acc.len = strlen(db_table_acc.s);
+       if(db_table_acc.len!=3 || strncmp(db_table_acc.s, "acc", 3)!=0)
+       {
+               db_table_acc_data = db_table_acc.s;
+               if(fixup_var_pve_str_12(&db_table_acc_data, 1)<0)
+               {
+                       LM_ERR("unable to parse acc table name [%.*s]\n",
+                                       db_table_acc.len, db_table_acc.s);
+                       return -1;
+               }
+       }
        db_table_mc.len = strlen(db_table_mc.s);
+       if(db_table_mc.len!=12 || strncmp(db_table_mc.s, "missed_calls", 12)!=0)
+       {
+               db_table_mc_data = db_table_mc.s;
+               if(fixup_var_pve_str_12(&db_table_mc_data, 1)<0)
+               {
+                       LM_ERR("unable to parse mc table name [%.*s]\n",
+                                       db_table_mc.len, db_table_mc.s);
+                       return -1;
+               }
+       }
        acc_method_col.len = strlen(acc_method_col.s);
        acc_fromtag_col.len = strlen(acc_fromtag_col.s);
        acc_totag_col.len = strlen(acc_totag_col.s);
diff --git a/modules_k/acc/acc_mod.h b/modules_k/acc/acc_mod.h
index d565773..5a6c104 100644
--- a/modules_k/acc/acc_mod.h
+++ b/modules_k/acc/acc_mod.h
@@ -73,7 +73,9 @@ extern int db_flag;
 extern int db_missed_flag;
 
 extern str db_table_acc;
+extern void *db_table_acc_data;
 extern str db_table_mc;
+extern void *db_table_mc_data;
 
 extern str acc_method_col;
 extern str acc_fromuri_col;


_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to