[svn-commits] tilghman: branch 1.8 r310415 - in /branches/1.8: ./ funcs/func_odbc.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Mar 12 14:05:51 CST 2011


Author: tilghman
Date: Sat Mar 12 14:05:46 2011
New Revision: 310415

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=310415
Log:
Merged revisions 310414 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.6.2

........
  r310414 | tilghman | 2011-03-12 13:51:23 -0600 (Sat, 12 Mar 2011) | 7 lines
  
  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.8/   (props changed)
    branches/1.8/funcs/func_odbc.c

Propchange: branches/1.8/
------------------------------------------------------------------------------
Binary property 'branch-1.6.2-merged' - no diff available.

Modified: branches/1.8/funcs/func_odbc.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/funcs/func_odbc.c?view=diff&rev=310415&r1=310414&r2=310415
==============================================================================
--- branches/1.8/funcs/func_odbc.c (original)
+++ branches/1.8/funcs/func_odbc.c Sat Mar 12 14:05:46 2011
@@ -304,48 +304,67 @@
 			pbx_builtin_setvar_helper(chan, varname, NULL);
 		}
 		pbx_builtin_setvar_helper(chan, "VALUE", NULL);
-
-		/*!\note
-		 * Okay, this part is confusing.  Transactions belong to a single database
-		 * handle.  Therefore, when working with transactions, we CANNOT failover
-		 * to multiple DSNs.  We MUST have a single handle all the way through the
-		 * transaction, or else we CANNOT enforce atomicity.
-		 */
-		for (dsn = 0; dsn < 5; dsn++) {
+	}
+
+	/*!\note
+	 * Okay, this part is confusing.  Transactions belong to a single database
+	 * handle.  Therefore, when working with transactions, we CANNOT failover
+	 * to multiple DSNs.  We MUST have a single handle all the way through the
+	 * transaction, or else we CANNOT enforce atomicity.
+	 */
+	for (dsn = 0; dsn < 5; dsn++) {
+		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 {
+				obj = ast_odbc_request_obj(query->writehandle[dsn], 0);
+				transactional = 0;
+			}
+
+			if (obj && (stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(buf)))) {
+				break;
+			}
+
+			if (obj && !transactional) {
+				ast_odbc_release_obj(obj);
+				obj = NULL;
+			}
+		}
+	}
+
+	if (stmt) {
+		SQLRowCount(stmt, &rows);
+	}
+
+	if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) {
+		SQLCloseCursor(stmt);
+		SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+		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])) {
+				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(buf)))) {
-					break;
-				}
-			}
-
-			if (obj && !transactional) {
-				ast_odbc_release_obj(obj);
-				obj = NULL;
-			}
-		}
-	}
-
-	if (stmt) {
-		SQLRowCount(stmt, &rows);
-	}
-
-	if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) {
-		SQLCloseCursor(stmt);
-		SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-		for (dsn = 0; dsn < 5; dsn++) {
-			if (!ast_strlen_zero(query->writehandle[dsn])) {
-				obj = ast_odbc_request_obj(query->writehandle[dsn], 0);
 				if (obj) {
 					stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(insertbuf));
 				}
@@ -355,8 +374,6 @@
 				SQLRowCount(stmt, &rows);
 				break;
 			}
-			ast_odbc_release_obj(obj);
-			obj = NULL;
 		}
 	} else if (stmt) {
 		status = "SUCCESS";




More information about the svn-commits mailing list