Merged revisions 145751 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 2 Oct 2008 15:17:16 +0000 (15:17 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 2 Oct 2008 15:17:16 +0000 (15:17 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r145751 | tilghman | 2008-10-02 10:13:21 -0500 (Thu, 02 Oct 2008) | 3 lines

  Some sanity checks that may have led to prior crashes, found by codefreeze-lap
  (murf) on IRC.  Also some cleanup of incorrectly-used constants.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@145752 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_odbc.c

index 384696d..e7b50d6 100644 (file)
@@ -758,17 +758,23 @@ static odbc_status odbc_obj_disconnect(struct odbc_obj *obj)
        short int mlen;
        unsigned char msg[200], stat[10];
 
+       /* Nothing to disconnect */
+       if (!obj->con) {
+               return ODBC_SUCCESS;
+       }
+
        ast_mutex_lock(&obj->lock);
 
        res = SQLDisconnect(obj->con);
 
-       if (res == ODBC_SUCCESS) {
+       if (res == SQL_SUCCESS || res == SQL_SUCCESS_WITH_INFO) {
                ast_log(LOG_DEBUG, "Disconnected %d from %s [%s]\n", res, obj->parent->name, obj->parent->dsn);
        } else {
                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)) {
+       if ((res = SQLFreeHandle(SQL_HANDLE_DBC, obj->con) == SQL_SUCCESS)) {
+               obj->con = NULL;
                ast_log(LOG_DEBUG, "Database handle deallocated\n");
        } else {
                SQLGetDiagRec(SQL_HANDLE_DBC, obj->con, 1, stat, &err, msg, 100, &mlen);
@@ -792,6 +798,13 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
 #endif
        ast_mutex_lock(&obj->lock);
 
+       if (obj->up) {
+               odbc_obj_disconnect(obj);
+               ast_log(LOG_NOTICE, "Re-connecting %s\n", obj->parent->name);
+       } else {
+               ast_log(LOG_NOTICE, "Connecting %s\n", obj->parent->name);
+       }
+
        res = SQLAllocHandle(SQL_HANDLE_DBC, obj->parent->env, &obj->con);
 
        if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
@@ -806,13 +819,6 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
        SQLSetConnectAttr(obj->con, SQL_ATTR_TRACEFILE, tracefile, strlen(tracefile));
 #endif
 
-       if (obj->up) {
-               odbc_obj_disconnect(obj);
-               ast_log(LOG_NOTICE, "Re-connecting %s\n", obj->parent->name);
-       } else {
-               ast_log(LOG_NOTICE, "Connecting %s\n", obj->parent->name);
-       }
-
        res = SQLConnect(obj->con,
                   (SQLCHAR *) obj->parent->dsn, SQL_NTS,
                   (SQLCHAR *) obj->parent->username, SQL_NTS,