From 9e81cc3e0c65a18b6b8d9ffb3bf4e3096286c600 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Mon, 22 May 2006 03:40:31 +0000 Subject: Escaping commas within fields isn't always desireable. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29364 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- configs/func_odbc.conf.sample | 3 +++ funcs/func_odbc.c | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/configs/func_odbc.conf.sample b/configs/func_odbc.conf.sample index 3d02e0f92..c9f9d5d7f 100644 --- a/configs/func_odbc.conf.sample +++ b/configs/func_odbc.conf.sample @@ -35,4 +35,7 @@ dsn=mysql1 read=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}' write=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})}' ;prefix=OFFICE ; Changes this function from ODBC_PRESENCE to OFFICE_PRESENCE +;escapecommas=no ; Normally, commas within a field are escaped such that each + ; field may be separated into individual variables with ARRAY. + ; This option turns that behavior off [default=yes]. diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c index 4f17e02e2..1dfc778e1 100644 --- a/funcs/func_odbc.c +++ b/funcs/func_odbc.c @@ -53,11 +53,16 @@ static char *tdesc = "ODBC lookups"; static char *config = "func_odbc.conf"; +enum { + OPT_ESCAPECOMMAS = (1 << 0), +} odbc_option_flags; + struct acf_odbc_query { AST_LIST_ENTRY(acf_odbc_query) list; char dsn[30]; char sql_read[2048]; char sql_write[2048]; + unsigned int flags; struct ast_custom_function *acf; }; @@ -230,7 +235,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf struct odbc_obj *obj; struct acf_odbc_query *query; char sql[2048] = "", varname[15]; - int res, x, buflen = 0; + int res, x, buflen = 0, escapecommas; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(field)[100]; ); @@ -282,6 +287,9 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf pbx_builtin_setvar_helper(chan, varname, NULL); } + /* Save this flag, so we can release the lock */ + escapecommas = ast_test_flag(query, OPT_ESCAPECOMMAS); + AST_LIST_UNLOCK(&queries); res = SQLAllocHandle (SQL_HANDLE_STMT, obj->con, &stmt); @@ -345,7 +353,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf /* Copy data, encoding '\' and ',' for the argument parser */ for (i = 0; i < sizeof(coldata); i++) { - if (coldata[i] == '\\' || coldata[i] == ',') { + if (escapecommas && (coldata[i] == '\\' || coldata[i] == ',')) { buf[buflen++] = '\\'; } buf[buflen++] = coldata[i]; @@ -420,6 +428,13 @@ static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_qu ast_copy_string((*query)->sql_write, tmp, sizeof((*query)->sql_write)); } + /* Allow escaping of embedded commas in fields to be turned off */ + ast_set_flag((*query), OPT_ESCAPECOMMAS); + if ((tmp = ast_variable_retrieve(cfg, catg, "escapecommas"))) { + if (ast_false(tmp)) + ast_clear_flag((*query), OPT_ESCAPECOMMAS); + } + (*query)->acf = ast_calloc(1, sizeof(struct ast_custom_function)); if (! (*query)->acf) { free(*query); -- cgit v1.2.3