Escaping commas within fields isn't always desireable.
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 22 May 2006 03:40:31 +0000 (03:40 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 22 May 2006 03:40:31 +0000 (03:40 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29364 65c4cc65-6c06-0410-ace0-fbb531ad65f3

configs/func_odbc.conf.sample
funcs/func_odbc.c

index 3d02e0f..c9f9d5d 100644 (file)
@@ -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].
 
index 4f17e02..1dfc778 100644 (file)
@@ -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);