[asterisk-commits] tilghman: branch 1.6.2 r310414 - /branches/1.6.2/funcs/func_odbc.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Mar 12 13:51:28 CST 2011


Author: tilghman
Date: Sat Mar 12 13:51:23 2011
New Revision: 310414

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=310414
Log:
Transactional handles should be used for the insertbuf, if available.

Also, fix a possible resource leak.

(closes issue #18943)
 Reported by: irroot

Modified:
    branches/1.6.2/funcs/func_odbc.c

Modified: branches/1.6.2/funcs/func_odbc.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/funcs/func_odbc.c?view=diff&rev=310414&r1=310413&r2=310414
==============================================================================
--- branches/1.6.2/funcs/func_odbc.c (original)
+++ branches/1.6.2/funcs/func_odbc.c Sat Mar 12 13:51:23 2011
@@ -302,12 +302,12 @@
 	 * transaction, or else we CANNOT enforce atomicity.
 	 */
 	for (dsn = 0; dsn < 5; dsn++) {
-		if (transactional) {
-			/* This can only happen second time through or greater. */
-			ast_log(LOG_WARNING, "Transactions do not work well with multiple DSNs for 'writehandle'\n");
-		}
-
 		if (!ast_strlen_zero(query->writehandle[dsn])) {
+			if (transactional) {
+				/* This can only happen second time through or greater. */
+				ast_log(LOG_WARNING, "Transactions do not work well with multiple DSNs for 'writehandle'\n");
+			}
+
 			if ((obj = ast_odbc_retrieve_transaction_obj(chan, query->writehandle[dsn]))) {
 				transactional = 1;
 			} else {
@@ -332,9 +332,27 @@
 	if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) {
 		SQLCloseCursor(stmt);
 		SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-		for (dsn = 0; dsn < 5; dsn++) {
+		if (obj && !transactional) {
+			ast_odbc_release_obj(obj);
+			obj = NULL;
+		}
+
+		for (transactional = 0, dsn = 0; dsn < 5; dsn++) {
 			if (!ast_strlen_zero(query->writehandle[dsn])) {
-				obj = ast_odbc_request_obj(query->writehandle[dsn], 0);
+				if (transactional) {
+					/* This can only happen second time through or greater. */
+					ast_log(LOG_WARNING, "Transactions do not work well with multiple DSNs for 'writehandle'\n");
+				} else if (obj) {
+					ast_odbc_release_obj(obj);
+					obj = NULL;
+				}
+
+				if ((obj = ast_odbc_retrieve_transaction_obj(chan, query->writehandle[dsn]))) {
+					transactional = 1;
+				} else {
+					obj = ast_odbc_request_obj(query->writehandle[dsn], 0);
+					transactional = 0;
+				}
 				if (obj) {
 					stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(insertbuf));
 				}
@@ -343,10 +361,6 @@
 				status = "FAILOVER";
 				SQLRowCount(stmt, &rows);
 				break;
-			}
-			if (obj) {
-				ast_odbc_release_obj(obj);
-				obj = NULL;
 			}
 		}
 	} else if (stmt) {
@@ -372,10 +386,12 @@
 		obj = NULL;
 	}
 
-	if (chan)
+	if (chan) {
 		ast_autoservice_stop(chan);
-	if (bogus_chan)
+	}
+	if (bogus_chan) {
 		ast_channel_free(chan);
+	}
 
 	return 0;
 }




More information about the asterisk-commits mailing list