From 9d294cd93478b97bcc8add05285b016421ab5e6c Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Mon, 11 Aug 2008 00:20:38 +0000 Subject: [PATCH] Deallocate database connection handle on disconnect, as we allocate another one on connect. (closes issue #13271) Reported by: dveiga git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@137138 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_odbc.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/res/res_odbc.c b/res/res_odbc.c index 29e3023305..f87b9e2bd4 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -482,16 +482,27 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) static odbc_status odbc_obj_disconnect(struct odbc_obj *obj) { int res; + SQLINTEGER err; + short int mlen; + unsigned char msg[200], stat[10]; + ast_mutex_lock(&obj->lock); res = SQLDisconnect(obj->con); if (res == ODBC_SUCCESS) { - ast_log(LOG_WARNING, "res_odbc: disconnected %d from %s [%s]\n", res, obj->parent->name, obj->parent->dsn); + ast_log(LOG_DEBUG, "Disconnected %d from %s [%s]\n", res, obj->parent->name, obj->parent->dsn); } else { - ast_log(LOG_WARNING, "res_odbc: %s [%s] already disconnected\n", - obj->parent->name, obj->parent->dsn); + ast_log(LOG_DEBUG, "res_odbc: %s [%s] already disconnected\n", obj->parent->name, obj->parent->dsn); } + + if ((res = SQLFreeHandle(SQL_HANDLE_DBC, obj->con) == ODBC_SUCCESS)) { + ast_log(LOG_DEBUG, "Database handle deallocated\n"); + } else { + SQLGetDiagRec(SQL_HANDLE_DBC, obj->con, 1, stat, &err, msg, 100, &mlen); + ast_log(LOG_WARNING, "Unable to deallocate database handle? %d errno=%d %s\n", res, (int)err, msg); + } + obj->up = 0; ast_mutex_unlock(&obj->lock); return ODBC_SUCCESS;