Module: sip-router Branch: master Commit: 486c7e1871eae56c356baef98e4ac0e399914681 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=486c7e18...
Author: Alex Hermann alex@speakup.nl Committer: Alex Hermann alex@speakup.nl 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. (alex@speakup.nl) + * + * 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. (alex@speakup.nl) + * + * 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)