Cool. please don't forget to copy the description to the wiki too.

thanks
Klaus

On 18.08.2011 18:44, Alex Hermann wrote:
Module: sip-router
Branch: master
Commit: 486c7e1871eae56c356baef98e4ac0e399914681
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=486c7e1871eae56c356baef98e4ac0e399914681

Author: Alex Hermann<[email protected]>
Committer: Alex Hermann<[email protected]>
Date:   Thu Aug 18 18:17:59 2011 +0200

modules_k/sqlops: Move s.sql transformation to sqlops as sql.val and add 
sql.val.int, sql.val.str

s.sql was not really a string transformation as it handled null and integers
too. Move it to sqlops as sql.val (it was not yet in a released version) and
add 2 new transformations.

Summarizing:

sql.val: returns a valid SQL value. $null as NULL, int as number, string as
          quoted and escaped string
sql.val.int: returns a non-null integer ($null becomes 0)
sql.val.str: returns a non-null quoted and escaped string. ($null becomes '')

---

  modules_k/pv/pv_trans.c      |   31 +--------
  modules_k/pv/pv_trans.h      |    2 +-
  modules_k/sqlops/sql_trans.c |  159 ++++++++++++++++++++++++++++++++++++++++++
  modules_k/sqlops/sql_trans.h |   34 +++++++++
  modules_k/sqlops/sqlops.c    |   11 +++
  5 files changed, 206 insertions(+), 31 deletions(-)

diff --git a/modules_k/pv/pv_trans.c b/modules_k/pv/pv_trans.c
index 43ff05d..a3175f6 100644
--- a/modules_k/pv/pv_trans.c
+++ b/modules_k/pv/pv_trans.c
@@ -54,7 +54,6 @@

  /*! transformation buffer */
  static char _tr_buffer[TR_BUFFER_SIZE];
-static str _tr_null = { "NULL", 4 };


  /*!
@@ -74,7 +73,7 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, int 
subtype,
        pv_value_t v, w;
        time_t t;

-       if(val==NULL || (val->flags&PV_VAL_NULL&&  subtype != TR_S_SQL))
+       if(val==NULL || val->flags&PV_VAL_NULL)
                return -1;

        switch(subtype)
@@ -594,31 +593,6 @@ int tr_eval_string(struct sip_msg *msg, tr_param_t *tp, 
int subtype,
                        val->rs.s = _tr_buffer;
                        break;

-               case TR_S_SQL:
-                       if (val->flags&PV_VAL_NULL) {
-                               val->flags = PV_VAL_STR;
-                               val->rs = _tr_null;
-                               break;
-                       }
-                       if(val->flags&PV_TYPE_INT || !(val->flags&PV_VAL_STR)) {
-                               val->rs.s = int2str(val->ri,&val->rs.len);
-                               val->flags = PV_VAL_STR;
-                               break;
-                       }
-                       if(val->rs.len>TR_BUFFER_SIZE/2-1) {
-                               LM_ERR("escape buffer to short");
-                               return -1;
-                       }
-                       _tr_buffer[0] = '\'';
-                       i = escape_common(_tr_buffer+1, val->rs.s, val->rs.len);
-                       _tr_buffer[++i] = '\'';
-                       _tr_buffer[++i] = '\0';
-                       memset(val, 0, sizeof(pv_value_t));
-                       val->flags = PV_VAL_STR;
-                       val->rs.s = _tr_buffer;
-                       val->rs.len = i;
-                       break;
-
                default:
                        LM_ERR("unknown subtype %d\n",
                                        subtype);
@@ -1379,9 +1353,6 @@ char* tr_parse_string(str* in, trans_t *t)
        } else if(name.len==3&&  strncasecmp(name.s, "md5", 3)==0) {
                t->subtype = TR_S_MD5;
                goto done;
-       } else if(name.len==3&&  strncasecmp(name.s, "sql", 3)==0) {
-               t->subtype = TR_S_SQL;
-               goto done;
        } else if(name.len==7&&  strncasecmp(name.s, "tolower", 7)==0) {
                t->subtype = TR_S_TOLOWER;
                goto done;
diff --git a/modules_k/pv/pv_trans.h b/modules_k/pv/pv_trans.h
index 2cd2fd0..0938ddc 100644
--- a/modules_k/pv/pv_trans.h
+++ b/modules_k/pv/pv_trans.h
@@ -40,7 +40,7 @@ enum _tr_s_subtype {
        TR_S_ESCAPECOMMON, TR_S_UNESCAPECOMMON, TR_S_ESCAPEUSER, 
TR_S_UNESCAPEUSER,
        TR_S_ESCAPEPARAM, TR_S_UNESCAPEPARAM, TR_S_TOLOWER, TR_S_TOUPPER,
        TR_S_STRIP, TR_S_STRIPTAIL, TR_S_PREFIXES, TR_S_PREFIXES_QUOT, 
TR_S_REPLACE,
-       TR_S_TIMEFORMAT, TR_S_SQL
+       TR_S_TIMEFORMAT
  };
  enum _tr_uri_subtype {
        TR_URI_NONE=0, TR_URI_USER, TR_URI_HOST, TR_URI_PASSWD, TR_URI_PORT,
diff --git a/modules_k/sqlops/sql_trans.c b/modules_k/sqlops/sql_trans.c
new file mode 100644
index 0000000..50ecc06
--- /dev/null
+++ b/modules_k/sqlops/sql_trans.c
@@ -0,0 +1,159 @@
+/**
+ * $Id$
+ *
+ * Copyright (C) 2011 SpeakUp B.V. ([email protected])
+ *
+ * This file is part of kamailio, a free SIP server.
+ *
+ * openser is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * openser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include<stdio.h>
+#include<string.h>
+#include<sys/types.h>
+#include<unistd.h>
+
+#include "../../mem/mem.h"
+#include "../../dprint.h"
+#include "../../trim.h"
+#include "../../lib/kcore/strcommon.h"
+
+#include "sql_trans.h"
+
+#define is_in_str(p, in) (p<in->s+in->len&&  *p)
+
+#define TR_BUFFER_SIZE 2048
+
+
+static int _tr_eval_sql_val(pv_value_t *val)
+{
+       int i;
+       static char _tr_buffer[TR_BUFFER_SIZE];
+
+       if(val->flags&PV_TYPE_INT || !(val->flags&PV_VAL_STR)) {
+               val->rs.s = int2str(val->ri,&val->rs.len);
+               val->flags = PV_VAL_STR;
+               return 0;
+       }
+       if(val->rs.len>TR_BUFFER_SIZE/2-1) {
+               LM_ERR("escape buffer to short");
+               return -1;
+       }
+       _tr_buffer[0] = '\'';
+       i = escape_common(_tr_buffer+1, val->rs.s, val->rs.len);
+       _tr_buffer[++i] = '\'';
+       _tr_buffer[++i] = '\0';
+       memset(val, 0, sizeof(pv_value_t));
+       val->flags = PV_VAL_STR;
+       val->rs.s = _tr_buffer;
+       val->rs.len = i;
+       return 0;
+}
+
+
+int tr_eval_sql(struct sip_msg *msg, tr_param_t *tp, int subtype,
+               pv_value_t *val)
+{
+       static str _sql_null = { "NULL", 4 };
+       static str _sql_zero = { "0", 1 };
+       static str _sql_empty = { "''", 2 };
+
+       if(val==NULL)
+               return -1;
+       
+       switch(subtype) {
+               case TR_SQL_VAL:
+                       if (val->flags&PV_VAL_NULL) {
+                               val->flags = PV_VAL_STR;
+                               val->rs = _sql_null;
+                               return 0;
+                       } else {
+                               return _tr_eval_sql_val(val);
+                       }
+                       break;
+
+               case TR_SQL_VAL_INT:
+                       if (val->flags&PV_VAL_NULL) {
+                               val->flags = PV_VAL_STR;
+                               val->rs = _sql_zero;
+                               return 0;
+                       } else {
+                               return _tr_eval_sql_val(val);
+                       }
+                       break;
+
+               case TR_SQL_VAL_STR:
+                       if (val->flags&PV_VAL_NULL) {
+                               val->flags = PV_VAL_STR;
+                               val->rs = _sql_empty;
+                               return 0;
+                       } else {
+                               return _tr_eval_sql_val(val);
+                       }
+                       break;
+
+               default:
+                       LM_ERR("unknown subtype %d\n",
+                                       subtype);
+                       return -1;
+       }
+       return 0;
+}
+
+
+char* tr_parse_sql(str *in, trans_t *t)
+{
+       char *p;
+       str name;
+
+
+       if(in==NULL || t==NULL)
+               return NULL;
+
+       p = in->s;
+       name.s = in->s;
+       t->type = TR_SQL;
+       t->trf = tr_eval_sql;
+
+       /* find next token */
+       while(is_in_str(p, in)&&  *p!=TR_PARAM_MARKER&&  *p!=TR_RBRACKET) p++;
+       if(*p=='\0') {
+               LM_ERR("unable to find transformation start: %.*s\n", in->len, 
in->s);
+               return NULL;
+       }
+       name.len = p - name.s;
+       trim(&name);
+
+       if(name.len==3&&  strncasecmp(name.s, "val", 3)==0) {
+               t->subtype = TR_SQL_VAL;
+               goto done;
+       }
+       if(name.len==7&&  strncasecmp(name.s, "val.int", 7)==0) {
+               t->subtype = TR_SQL_VAL_INT;
+               goto done;
+       }
+       if(name.len==7&&  strncasecmp(name.s, "val.str", 7)==0) {
+               t->subtype = TR_SQL_VAL_STR;
+               goto done;
+       }
+
+       LM_ERR("unknown transformation: %.*s/%.*s/%d!\n", in->len, in->s,
+                       name.len, name.s, name.len);
+       return NULL;
+done:
+       t->name = name;
+       return p;
+}
+
diff --git a/modules_k/sqlops/sql_trans.h b/modules_k/sqlops/sql_trans.h
new file mode 100644
index 0000000..ec96ded
--- /dev/null
+++ b/modules_k/sqlops/sql_trans.h
@@ -0,0 +1,34 @@
+/**
+ * $Id$
+ *
+ * Copyright (C) 2011 SpeakUp B.V. ([email protected])
+ *
+ * This file is part of kamailio, a free SIP server.
+ *
+ * openser is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * openser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef _SQL_TRANS_H_
+#define _SQL_TRANS_H_
+
+#include "../../pvar.h"
+
+enum _tr_sql_type { TR_SQL_NONE=0, TR_SQL };
+enum _tr_sql_subtype {
+       TR_SQL_ST_NONE=0, TR_SQL_VAL, TR_SQL_VAL_INT, TR_SQL_VAL_STR };
+
+char* tr_parse_sql(str *in, trans_t *tr);
+
+#endif
diff --git a/modules_k/sqlops/sqlops.c b/modules_k/sqlops/sqlops.c
index 5bb4b2f..0a4526c 100644
--- a/modules_k/sqlops/sqlops.c
+++ b/modules_k/sqlops/sqlops.c
@@ -52,6 +52,7 @@
  #include "../../pvar.h"
  #include "sql_api.h"
  #include "sql_var.h"
+#include "sql_trans.h"


  MODULE_VERSION
@@ -110,6 +111,11 @@ static param_export_t params[]={
        {0,0,0}
  };

+static tr_export_t mod_trans[] = {
+       { {"sql", sizeof("sql")-1}, tr_parse_sql },
+       { { 0, 0 }, 0 }
+};
+

  /** module exports */
  struct module_exports exports= {
@@ -127,6 +133,11 @@ struct module_exports exports= {
        child_init  /* per-child init function */
  };

+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+       return register_trans_mod(path, mod_trans);
+}
+
  static int child_init(int rank)
  {
        if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to