diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-28 22:52:49 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-28 22:52:49 +0000 |
commit | 856edee8fd7d1e3238cc741c9437eac25e133d06 (patch) | |
tree | afc0c76fb787dc5a8bc73bb53bbc99014dba11b2 /res/res_config_odbc.c | |
parent | a133d997d849e3a1023033b726737b1785e66afc (diff) |
Merged revisions 172131 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r172131 | tilghman | 2009-01-28 16:48:01 -0600 (Wed, 28 Jan 2009) | 7 lines
Fix how we skip fields (to avoid fields which don't exist) when doing an UPDATE.
(closes issue #14205)
Reported by: maxgo
Patches:
20090128__bug14205__5.diff.txt uploaded by Corydon76 (license 14)
Tested by: blitzrage
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@172133 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_config_odbc.c')
-rw-r--r-- | res/res_config_odbc.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index d2f7f373b..4f4824d71 100644 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -70,6 +70,8 @@ static SQLHSTMT custom_prepare(struct odbc_obj *obj, void *data) return NULL; } + ast_debug(1, "Skip: %lld; SQL: %s\n", cps->skip, cps->sql); + res = SQLPrepare(stmt, (unsigned char *)cps->sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", cps->sql); @@ -79,9 +81,11 @@ static SQLHSTMT custom_prepare(struct odbc_obj *obj, void *data) while ((newparam = va_arg(ap, const char *))) { newval = va_arg(ap, const char *); - if ((1 << count) & cps->skip) { + if ((1LL << count++) & cps->skip) { + ast_debug(1, "Skipping field '%s'='%s' (%llo/%llo)\n", newparam, newval, 1LL << (count - 1), cps->skip); continue; } + ast_debug(1, "Parameter %d ('%s') = '%s'\n", x, newparam, newval); SQLBindParameter(stmt, x++, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(newval), 0, (void *)newval, 0, NULL); } va_end(ap); @@ -404,7 +408,7 @@ static int update_odbc(const char *database, const char *table, const char *keyf char sql[256]; SQLLEN rowcount=0; const char *newparam, *newval; - int res, count = 0; + int res, count = 1; va_list aq; struct custom_prepare_struct cps = { .sql = sql, .extra = lookup }; struct odbc_cache_tables *tableptr = ast_odbc_find_table(database, table); @@ -438,11 +442,11 @@ static int update_odbc(const char *database, const char *table, const char *keyf snprintf(sql, sizeof(sql), "UPDATE %s SET %s=?", table, newparam); while((newparam = va_arg(aq, const char *))) { + newval = va_arg(aq, const char *); if ((tableptr && (column = ast_odbc_find_column(tableptr, newparam))) || count > 63) { snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), ", %s=?", newparam); - newval = va_arg(aq, const char *); - } else { /* the column does not exist in the table OR we've exceeded the space in our flag field */ - cps.skip |= (((long long)1) << count); + } else { /* the column does not exist in the table */ + cps.skip |= (1LL << count); } count++; } |