summaryrefslogtreecommitdiff
path: root/cdr
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-05-14 05:28:16 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-05-14 05:28:16 -0500
commit2bbfcfc647dc69089236cde0003ba88c3161d1ec (patch)
tree7d0df5e2e0ba7604647521e1db4538a5a868d5fe /cdr
parent35ff01823be247c69a6f129955cbdbdc17e5fa7f (diff)
parenta24ce38e5eea9335c17c920e480eb51dfb1d90c7 (diff)
Merge "cdr_adaptive_odbc: Add ability to set character for quoted identifiers."
Diffstat (limited to 'cdr')
-rw-r--r--cdr/cdr_adaptive_odbc.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c
index 83877cbf1..e6b60dc10 100644
--- a/cdr/cdr_adaptive_odbc.c
+++ b/cdr/cdr_adaptive_odbc.c
@@ -82,6 +82,7 @@ struct tables {
char *connection;
char *table;
char *schema;
+ char quoted_identifiers;
unsigned int usegmtime:1;
AST_LIST_HEAD_NOLOCK(odbc_columns, columns) columns;
AST_RWLIST_ENTRY(tables) list;
@@ -101,6 +102,7 @@ static int load_config(void)
char connection[40];
char table[40];
char schema[40];
+ char quoted_identifiers;
int lenconnection, lentable, lenschema, usegmtime = 0;
SQLLEN sqlptr;
int res = 0;
@@ -149,6 +151,16 @@ static int load_config(void)
ast_copy_string(schema, tmp, sizeof(schema));
lenschema = strlen(schema);
+ if (ast_strlen_zero(tmp = ast_variable_retrieve(cfg, catg, "quoted_identifiers"))) {
+ tmp = "";
+ }
+ quoted_identifiers = tmp[0];
+ if (strlen(tmp) > 1) {
+ ast_log(LOG_ERROR, "The quoted_identifiers setting only accepts a single character,"
+ " while a value of '%s' was provided. This option has been disabled as a result.\n", tmp);
+ quoted_identifiers = '\0';
+ }
+
res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt);
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
ast_log(LOG_WARNING, "SQL Alloc Handle failed on connection '%s'!\n", connection);
@@ -164,7 +176,7 @@ static int load_config(void)
continue;
}
- tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1 + lenschema + 1);
+ tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1 + lenschema + 1 + 1);
if (!tableptr) {
ast_log(LOG_ERROR, "Out of memory creating entry for table '%s' on connection '%s'%s%s%s\n", table, connection,
lenschema ? " (schema '" : "", lenschema ? schema : "", lenschema ? "')" : "");
@@ -181,6 +193,7 @@ static int load_config(void)
ast_copy_string(tableptr->connection, connection, lenconnection + 1);
ast_copy_string(tableptr->table, table, lentable + 1);
ast_copy_string(tableptr->schema, schema, lenschema + 1);
+ tableptr->quoted_identifiers = quoted_identifiers;
ast_verb(3, "Found adaptive CDR table %s@%s.\n", tableptr->table, tableptr->connection);
@@ -400,10 +413,27 @@ static int odbc_log(struct ast_cdr *cdr)
AST_LIST_TRAVERSE(&odbc_tables, tableptr, list) {
int first = 1;
+ int quoted = 0;
+
+ if (tableptr->quoted_identifiers != '\0'){
+ quoted = 1;
+ }
+
if (ast_strlen_zero(tableptr->schema)) {
- ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+ if (quoted) {
+ ast_str_set(&sql, 0, "INSERT INTO %c%s%c (",
+ tableptr->quoted_identifiers, tableptr->table, tableptr->quoted_identifiers );
+ }else{
+ ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+ }
} else {
- ast_str_set(&sql, 0, "INSERT INTO %s.%s (", tableptr->schema, tableptr->table);
+ if (quoted) {
+ ast_str_set(&sql, 0, "INSERT INTO %c%s%c.%c%s%c (",
+ tableptr->quoted_identifiers, tableptr->schema, tableptr->quoted_identifiers,
+ tableptr->quoted_identifiers, tableptr->table, tableptr->quoted_identifiers);
+ }else{
+ ast_str_set(&sql, 0, "INSERT INTO %s.%s (", tableptr->schema, tableptr->table);
+ }
}
ast_str_set(&sql2, 0, " VALUES (");
@@ -708,7 +738,11 @@ static int odbc_log(struct ast_cdr *cdr)
ast_log(LOG_WARNING, "Column type %d (field '%s:%s:%s') is unsupported at this time.\n", entry->type, tableptr->connection, tableptr->table, entry->name);
continue;
}
- ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name);
+ if (quoted) {
+ ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name);
+ } else {
+ ast_str_append(&sql, 0, "%s%c%s%c", first ? "" : ",", tableptr->quoted_identifiers, entry->name, tableptr->quoted_identifiers);
+ }
first = 0;
} else if (entry->filtervalue
&& ((!entry->negatefiltervalue && entry->filtervalue[0] != '\0')