diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-10-31 21:31:25 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-10-31 21:31:25 +0000 |
commit | d1eb523ab82c73a1136416f6d327f2f04c5893db (patch) | |
tree | 0b787580c5ea59bce0e79e1a98935a37731fdfd0 /res | |
parent | 1427e43aa1ae56e7327b8c629cac71fda13a58ac (diff) |
don't use 'rowcount' after SELECT statements, since the ODBC API does not say it is allowed (issue #5083)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6904 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rwxr-xr-x | res/res_config_odbc.c | 85 | ||||
-rwxr-xr-x | res/res_odbc.c | 8 |
2 files changed, 36 insertions, 57 deletions
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index 73d280d0b..10b3dab9f 100755 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -64,7 +64,6 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl int res; int x; struct ast_variable *var=NULL, *prev=NULL; - SQLLEN rowcount=0; SQLULEN colsize; SQLSMALLINT colcount=0; SQLSMALLINT datatype; @@ -126,62 +125,57 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl return NULL; } - res = SQLRowCount(stmt, &rowcount); + res = SQLNumResultCols(stmt, &colcount); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Row Count error!\n[%s]\n\n", sql); + ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", sql); SQLFreeHandle (SQL_HANDLE_STMT, stmt); return NULL; } - res = SQLNumResultCols(stmt, &colcount); + res = SQLFetch(stmt); + if (res == SQL_NO_DATA) { + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + return NULL; + } if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", sql); + ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); SQLFreeHandle (SQL_HANDLE_STMT, stmt); return NULL; } - - if (rowcount) { - res = SQLFetch(stmt); + for (x=0;x<colcount;x++) { + rowdata[0] = '\0'; + collen = sizeof(coltitle); + res = SQLDescribeCol(stmt, x + 1, coltitle, sizeof(coltitle), &collen, + &datatype, &colsize, &decimaldigits, &nullable); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); - SQLFreeHandle (SQL_HANDLE_STMT, stmt); + ast_log(LOG_WARNING, "SQL Describe Column error!\n[%s]\n\n", sql); + if (var) + ast_variables_destroy(var); return NULL; } - for (x=0;x<colcount;x++) { - rowdata[0] = '\0'; - collen = sizeof(coltitle); - res = SQLDescribeCol(stmt, x + 1, coltitle, sizeof(coltitle), &collen, - &datatype, &colsize, &decimaldigits, &nullable); - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Describe Column error!\n[%s]\n\n", sql); - if (var) - ast_variables_destroy(var); - return NULL; - } - indicator = 0; - res = SQLGetData(stmt, x + 1, SQL_CHAR, rowdata, sizeof(rowdata), &indicator); - if (indicator == SQL_NULL_DATA) - continue; + indicator = 0; + res = SQLGetData(stmt, x + 1, SQL_CHAR, rowdata, sizeof(rowdata), &indicator); + if (indicator == SQL_NULL_DATA) + continue; - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); - if (var) - ast_variables_destroy(var); - return NULL; - } - stringp = rowdata; - while(stringp) { - chunk = strsep(&stringp, ";"); - if (chunk && !ast_strlen_zero(ast_strip(chunk))) { - if (prev) { - prev->next = ast_variable_new(coltitle, chunk); - if (prev->next) - prev = prev->next; + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); + if (var) + ast_variables_destroy(var); + return NULL; + } + stringp = rowdata; + while(stringp) { + chunk = strsep(&stringp, ";"); + if (chunk && !ast_strlen_zero(ast_strip(chunk))) { + if (prev) { + prev->next = ast_variable_new(coltitle, chunk); + if (prev->next) + prev = prev->next; } else prev = var = ast_variable_new(coltitle, chunk); - } } } } @@ -210,7 +204,6 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * struct ast_config *cfg=NULL; struct ast_category *cat=NULL; struct ast_realloca ra; - SQLLEN rowcount=0; SQLULEN colsize; SQLSMALLINT colcount=0; SQLSMALLINT datatype; @@ -278,13 +271,6 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * return NULL; } - res = SQLRowCount(stmt, &rowcount); - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "SQL Row Count error!\n[%s]\n\n", sql); - SQLFreeHandle (SQL_HANDLE_STMT, stmt); - return NULL; - } - res = SQLNumResultCols(stmt, &colcount); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", sql); @@ -299,9 +285,8 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * return NULL; } - while (rowcount--) { + while ((res=SQLFetch(stmt)) != SQL_NO_DATA) { var = NULL; - res = SQLFetch(stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); continue; diff --git a/res/res_odbc.c b/res/res_odbc.c index 8fcec4ffe..2b99572cd 100755 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -110,7 +110,7 @@ int odbc_smart_execute(odbc_obj *obj, SQLHSTMT stmt) { int res = 0; res = SQLExecute(stmt); - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO) && (res != SQL_NO_DATA)) { ast_log(LOG_WARNING, "SQL Execute error! Attempting a reconnect...\n"); ast_mutex_lock(&obj->lock); obj->up = 0; @@ -147,7 +147,6 @@ int odbc_sanity_check(odbc_obj *obj) char *test_sql = "select 1"; SQLHSTMT stmt; int res = 0; - SQLLEN rowcount = 0; ast_mutex_lock(&obj->lock); if(obj->up) { /* so you say... let's make sure */ @@ -162,11 +161,6 @@ int odbc_sanity_check(odbc_obj *obj) res = SQLExecute(stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { obj->up = 0; /* Liar!*/ - } else { - res = SQLRowCount(stmt, &rowcount); - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - obj->up = 0; /* Liar!*/ - } } } } |