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
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@310415 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher
2011-03-12 20:05:46 +00:00
parent a1e7bf50b5
commit 782d757faf

View File

@@ -304,29 +304,30 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co
pbx_builtin_setvar_helper(chan, varname, NULL); pbx_builtin_setvar_helper(chan, varname, NULL);
} }
pbx_builtin_setvar_helper(chan, "VALUE", NULL); pbx_builtin_setvar_helper(chan, "VALUE", NULL);
}
/*!\note /*!\note
* Okay, this part is confusing. Transactions belong to a single database * Okay, this part is confusing. Transactions belong to a single database
* handle. Therefore, when working with transactions, we CANNOT failover * handle. Therefore, when working with transactions, we CANNOT failover
* to multiple DSNs. We MUST have a single handle all the way through the * to multiple DSNs. We MUST have a single handle all the way through the
* transaction, or else we CANNOT enforce atomicity. * transaction, or else we CANNOT enforce atomicity.
*/ */
for (dsn = 0; dsn < 5; dsn++) { for (dsn = 0; dsn < 5; dsn++) {
if (!ast_strlen_zero(query->writehandle[dsn])) {
if (transactional) { if (transactional) {
/* This can only happen second time through or greater. */ /* This can only happen second time through or greater. */
ast_log(LOG_WARNING, "Transactions do not work well with multiple DSNs for 'writehandle'\n"); ast_log(LOG_WARNING, "Transactions do not work well with multiple DSNs for 'writehandle'\n");
} }
if (!ast_strlen_zero(query->writehandle[dsn])) { if ((obj = ast_odbc_retrieve_transaction_obj(chan, query->writehandle[dsn]))) {
if ((obj = ast_odbc_retrieve_transaction_obj(chan, query->writehandle[dsn]))) { transactional = 1;
transactional = 1; } else {
} else { obj = ast_odbc_request_obj(query->writehandle[dsn], 0);
obj = ast_odbc_request_obj(query->writehandle[dsn], 0); transactional = 0;
transactional = 0; }
}
if (obj && (stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(buf)))) { if (obj && (stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(buf)))) {
break; break;
}
} }
if (obj && !transactional) { if (obj && !transactional) {
@@ -343,9 +344,27 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co
if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) { if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) {
SQLCloseCursor(stmt); SQLCloseCursor(stmt);
SQLFreeHandle(SQL_HANDLE_STMT, 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])) { 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) { if (obj) {
stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(insertbuf)); stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(insertbuf));
} }
@@ -355,8 +374,6 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co
SQLRowCount(stmt, &rows); SQLRowCount(stmt, &rows);
break; break;
} }
ast_odbc_release_obj(obj);
obj = NULL;
} }
} else if (stmt) { } else if (stmt) {
status = "SUCCESS"; status = "SUCCESS";