From 507fd79b110f00a9433b04375b6996a82ae227df Mon Sep 17 00:00:00 2001 From: tilghman Date: Thu, 17 Jan 2008 00:13:32 +0000 Subject: Change the way the new filter feature works, by allowing it to be a column NOT logged into the database. This will allow more granularity of a decision evaluated in the dialplan, then takes effect when posting the CDR. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@98987 f38db490-d61c-443f-a65b-d21fe96a405b --- cdr/cdr_adaptive_odbc.c | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'cdr/cdr_adaptive_odbc.c') diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c index b270582af..9daca2cf8 100644 --- a/cdr/cdr_adaptive_odbc.c +++ b/cdr/cdr_adaptive_odbc.c @@ -153,8 +153,33 @@ static int load_config(void) ast_verb(3, "Found adaptive CDR table %s@%s.\n", tableptr->table, tableptr->connection); + /* Check for filters first */ + for (var = ast_variable_browse(cfg, catg); var; var = var->next) { + if (strncmp(var->name, "filter", 6) == 0) { + char *cdrvar = ast_strdupa(var->name + 6); + cdrvar = ast_strip(cdrvar); + ast_verb(3, "Found filter %s for cdr variable %s in %s@%s\n", var->value, cdrvar, tableptr->table, tableptr->connection); + + entry = ast_calloc(sizeof(char), sizeof(*entry) + strlen(cdrvar) + 1 + strlen(var->value) + 1); + if (!entry) { + ast_log(LOG_ERROR, "Out of memory creating filter entry for CDR variable '%s' in table '%s' on connection '%s'\n", cdrvar, table, connection); + res = -1; + break; + } + + /* NULL column entry means this isn't a column in the database */ + entry->name = NULL; + entry->cdrname = (char *)entry + sizeof(*entry); + entry->filtervalue = (char *)entry + sizeof(*entry) + strlen(cdrvar) + 1; + strcpy(entry->cdrname, cdrvar); + strcpy(entry->filtervalue, var->value); + + AST_LIST_INSERT_TAIL(&(tableptr->columns), entry, list); + } + } + while ((res = SQLFetch(stmt)) != SQL_NO_DATA && res != SQL_ERROR) { - char *cdrvar = "", *filter = ""; + char *cdrvar = ""; SQLGetData(stmt, 4, SQL_C_CHAR, columnname, sizeof(columnname), &sqlptr); @@ -172,17 +197,8 @@ static int load_config(void) break; } } - /* Two loops, because alias and filter could be in reverse order */ - for (var = ast_variable_browse(cfg, catg); var; var = var->next) { - if (strncmp(var->name, "filter", 6) == 0 && strcasecmp(var->name + 6, S_OR(cdrvar, columnname))) { - char *tmp = ast_strdupa(var->name + 6); - filter = ast_strip(tmp); - ast_verb(3, "Found filter %s for cdr variable %s in %s@%s\n", filter, S_OR(cdrvar, columnname), tableptr->table, tableptr->connection); - break; - } - } - entry = ast_calloc(sizeof(char), sizeof(*entry) + strlen(columnname) + 1 + strlen(cdrvar) + 1 + strlen(filter) + 1); + entry = ast_calloc(sizeof(char), sizeof(*entry) + strlen(columnname) + 1 + strlen(cdrvar) + 1); if (!entry) { ast_log(LOG_ERROR, "Out of memory creating entry for column '%s' in table '%s' on connection '%s'\n", columnname, table, connection); res = -1; @@ -197,11 +213,6 @@ static int load_config(void) } else /* Point to same place as the column name */ entry->cdrname = (char *)entry + sizeof(*entry); - if (!ast_strlen_zero(filter)) { - entry->filtervalue = entry->cdrname + strlen(entry->cdrname) + 1; - strcpy(entry->filtervalue, filter); - } - SQLGetData(stmt, 5, SQL_C_SHORT, &entry->type, sizeof(entry->type), NULL); SQLGetData(stmt, 7, SQL_C_LONG, &entry->size, sizeof(entry->size), NULL); SQLGetData(stmt, 9, SQL_C_SHORT, &entry->decimals, sizeof(entry->decimals), NULL); @@ -368,6 +379,10 @@ static int odbc_log(struct ast_cdr *cdr) goto early_release; } + /* Only a filter? */ + if (ast_strlen_zero(entry->name)) + continue; + LENGTHEN_BUF1(strlen(entry->name)); switch (entry->type) { -- cgit v1.2.3