From 70b882702c0dfe00d7ac3e8125895e2bbdc56b17 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Fri, 1 Jun 2007 21:45:44 +0000 Subject: [PATCH] On some drivers, deallocating the statement handle isn't enough. We also have to clear the cursor (nice, Oracle) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@66919 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- funcs/func_odbc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c index 78d3384b56..bf6ad0ec8d 100644 --- a/funcs/func_odbc.c +++ b/funcs/func_odbc.c @@ -82,6 +82,7 @@ static SQLHSTMT generic_prepare(struct odbc_obj *obj, void *data) res = SQLPrepare(stmt, (unsigned char *)sql, SQL_NTS); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); + SQLCloseCursor(stmt); SQLFreeHandle (SQL_HANDLE_STMT, stmt); return NULL; } @@ -184,8 +185,10 @@ static int acf_odbc_write(struct ast_channel *chan, char *cmd, char *s, const ch snprintf(varname, sizeof(varname), "%d", (int)rows); pbx_builtin_setvar_helper(chan, "ODBCROWS", varname); - if (stmt) + if (stmt) { + SQLCloseCursor(stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt); + } if (obj) ast_odbc_release_obj(obj); @@ -255,6 +258,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf 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); + SQLCloseCursor(stmt); SQLFreeHandle (SQL_HANDLE_STMT, stmt); ast_odbc_release_obj(obj); return -1; @@ -273,6 +277,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf } else if (option_verbose > 3) { ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, sql); } + SQLCloseCursor(stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt); ast_odbc_release_obj(obj); return res1; @@ -291,6 +296,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); + SQLCloseCursor(stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt); ast_odbc_release_obj(obj); return -1; @@ -316,6 +322,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf /* Trim trailing comma */ buf[buflen - 1] = '\0'; + SQLCloseCursor(stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt); ast_odbc_release_obj(obj); return 0;