[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