From 5d23b05a921e3f6665c702e5bed76faa6fba3266 Mon Sep 17 00:00:00 2001
From: Tilghman Lesher <tilghman@meg.abyt.es>
Date: Thu, 13 Dec 2007 17:46:04 +0000
Subject: [PATCH] Don't use backslash as an escape character, unless it really
 is an escape character.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@92779 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 cdr/cdr_adaptive_odbc.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c
index f6086468ae..98706076dd 100644
--- a/cdr/cdr_adaptive_odbc.c
+++ b/cdr/cdr_adaptive_odbc.c
@@ -327,6 +327,12 @@ static int odbc_log(struct ast_cdr *cdr)
 		lensql = snprintf(sql, sizesql, "INSERT INTO %s (", tableptr->table);
 		lensql2 = snprintf(sql2, sizesql2, " VALUES (");
 
+		/* No need to check the connection now; we'll handle any failure in prepare_and_execute */
+		if (!(obj = ast_odbc_request_obj(tableptr->connection, 0))) {
+			ast_log(LOG_WARNING, "cdr_adaptive_odbc: Unable to retrieve database handle for '%s:%s'.  CDR failed: %s\n", tableptr->connection, tableptr->table, sql);
+			continue;
+		}
+
 		AST_LIST_TRAVERSE(&(tableptr->columns), entry, list) {
 			/* Check if we have a similarly named variable */
 			ast_cdr_getvar(cdr, entry->cdrname, &colptr, colbuf, sizeof(colbuf), 0,
@@ -369,7 +375,7 @@ static int odbc_log(struct ast_cdr *cdr)
 						if (*tmp == '\'') {
 							strcpy(sql2 + lensql2, "''");
 							lensql2 += 2;
-						} else if (*tmp == '\\') {
+						} else if (*tmp == '\\' && ast_odbc_backslash_is_escape(obj)) {
 							strcpy(sql2 + lensql2, "\\\\");
 							lensql2 += 2;
 						} else {
@@ -552,21 +558,16 @@ static int odbc_log(struct ast_cdr *cdr)
 		strcat(sql + lensql, sql2);
 
 		ast_verb(11, "[%s]\n", sql);
-		/* No need to check the connection now; we'll handle any failure in prepare_and_execute */
-		obj = ast_odbc_request_obj(tableptr->connection, 0);
-		if (obj) {
-			stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, sql);
-			if (stmt) {
-				SQLRowCount(stmt, &rows);
-				SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-			}
-			if (rows == 0) {
-				ast_log(LOG_WARNING, "cdr_adaptive_odbc: Insert failed on '%s:%s'.  CDR failed: %s\n", tableptr->connection, tableptr->table, sql);
-			}
-			ast_odbc_release_obj(obj);
-		} else {
-			ast_log(LOG_WARNING, "cdr_adaptive_odbc: Unable to retrieve database handle for '%s:%s'.  CDR failed: %s\n", tableptr->connection, tableptr->table, sql);
+
+		stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, sql);
+		if (stmt) {
+			SQLRowCount(stmt, &rows);
+			SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+		}
+		if (rows == 0) {
+			ast_log(LOG_WARNING, "cdr_adaptive_odbc: Insert failed on '%s:%s'.  CDR failed: %s\n", tableptr->connection, tableptr->table, sql);
 		}
+		ast_odbc_release_obj(obj);
 	}
 	AST_RWLIST_UNLOCK(&odbc_tables);
 
-- 
GitLab