|
|
|
@ -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')
|
|
|
|
|