summaryrefslogtreecommitdiff
path: root/cdr
diff options
context:
space:
mode:
authorRodrigo Ramírez Norambuena <decipher.hk@gmail.com>2015-04-21 19:27:16 -0300
committerRodrigo Ramírez Norambuena <decipher.hk@gmail.com>2015-05-05 04:38:33 -0400
commita24ce38e5eea9335c17c920e480eb51dfb1d90c7 (patch)
tree695a3052a6cd2b0f1f0b8c7544ded3eb9ccd0c1c /cdr
parent46950d6901ec69436483360796aae5e48e1094df (diff)
cdr_adaptive_odbc: Add ability to set character for quoted identifiers.
Added the ability to set the character to quote identifiers. This allows adding the character at the start and end of table and column names. This setting is configurable for cdr_adaptive_odbc via the quoted_identifiers in configuration file cdr_adaptive_odbc.conf. ASTERISK-25006 Change-Id: I0b9a56b79ca13a727a803d88ed3b8643e37632b8
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')