Escaping commas within fields isn't always desireable.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29364 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher
2006-05-22 03:40:31 +00:00
parent 76c47813fe
commit 9e81cc3e0c
2 changed files with 20 additions and 2 deletions

View File

@@ -35,4 +35,7 @@ dsn=mysql1
read=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}' read=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}'
write=UPDATE presence SET location='${SQL_ESC(${VAL1})}' 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 ;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].

View File

@@ -53,11 +53,16 @@ static char *tdesc = "ODBC lookups";
static char *config = "func_odbc.conf"; static char *config = "func_odbc.conf";
enum {
OPT_ESCAPECOMMAS = (1 << 0),
} odbc_option_flags;
struct acf_odbc_query { struct acf_odbc_query {
AST_LIST_ENTRY(acf_odbc_query) list; AST_LIST_ENTRY(acf_odbc_query) list;
char dsn[30]; char dsn[30];
char sql_read[2048]; char sql_read[2048];
char sql_write[2048]; char sql_write[2048];
unsigned int flags;
struct ast_custom_function *acf; 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 odbc_obj *obj;
struct acf_odbc_query *query; struct acf_odbc_query *query;
char sql[2048] = "", varname[15]; char sql[2048] = "", varname[15];
int res, x, buflen = 0; int res, x, buflen = 0, escapecommas;
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(field)[100]; 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); 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); AST_LIST_UNLOCK(&queries);
res = SQLAllocHandle (SQL_HANDLE_STMT, obj->con, &stmt); 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 */ /* Copy data, encoding '\' and ',' for the argument parser */
for (i = 0; i < sizeof(coldata); i++) { for (i = 0; i < sizeof(coldata); i++) {
if (coldata[i] == '\\' || coldata[i] == ',') { if (escapecommas && (coldata[i] == '\\' || coldata[i] == ',')) {
buf[buflen++] = '\\'; buf[buflen++] = '\\';
} }
buf[buflen++] = coldata[i]; 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)); 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)); (*query)->acf = ast_calloc(1, sizeof(struct ast_custom_function));
if (! (*query)->acf) { if (! (*query)->acf) {
free(*query); free(*query);