mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-25 14:06:27 +00:00
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:
@@ -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";
|
||||||
|
|||||||
Reference in New Issue
Block a user