diff -up asterisk-addons-1.6.0/cdr/cdr_addon_mysql.c-pre asterisk-addons-1.6.0/cdr/cdr_addon_mysql.c --- asterisk-addons-1.6.0/cdr/cdr_addon_mysql.c-pre 2008-08-28 17:40:29.000000000 +0100 +++ asterisk-addons-1.6.0/cdr/cdr_addon_mysql.c 2008-12-02 20:17:06.000000000 +0000 @@ -18,6 +18,12 @@ * Martin Portmann * Added mysql ssl support * + * Modified December 2, 2008 + * Mark Wilkinson + * Added support for static values for db columns + * This idea is to allow several *'s log to a central db, + * but have a column set to specific value for each server + * * This program is free software, distributed under the terms of * the GNU General Public License. * @@ -89,6 +95,7 @@ struct column { /* Protected with mysql_lock */ static AST_RWLIST_HEAD_STATIC(columns, column); +static AST_RWLIST_HEAD_STATIC(staticvals, column); static MYSQL mysql = { { NULL }, }; @@ -222,6 +229,44 @@ db_reconnect: snprintf(sql1, sql1size, "INSERT INTO %s (", dbtable ? dbtable->str : "cdr"); strcpy(sql2, ") VALUES ('"); + AST_RWLIST_RDLOCK(&staticvals); + AST_RWLIST_TRAVERSE(&staticvals, entry, list) { + /* Construct SQL */ + if (column_count++) { + strcat(sql1, ","); + strcat(sql2, "','"); + } + + if (strlen(sql1) + 2 + strlen(entry->name) > sql1size) { + char *tmp = ast_realloc(sql1, sql1size * 2); + if (!tmp) + goto log_exit; + sql1size *= 2; + sql1 = tmp; + } + strcat(sql1, entry->name); + + if (strlen(sql2) + (entry->cdrname ? strlen(entry->cdrname) * 2 : 0) + 4 > sql2size) { + char *tmp = ast_realloc(sql2, sql2size * 2); + if (!tmp) + goto log_exit; + sql2size *= 2; + sql2 = tmp; + } + + sql2len = strlen(sql2); + for (ptr = entry->cdrname; *ptr; ptr++) { + if (*ptr == '\\' || *ptr == '\'') + sql2[sql2len++] = '\\'; + sql2[sql2len++] = *ptr; + } + sql2[sql2len] = '\0'; + + + + } + AST_RWLIST_UNLOCK(&staticvals); + AST_RWLIST_RDLOCK(&columns); AST_RWLIST_TRAVERSE(&columns, entry, list) { if (!strcmp(entry->name, "calldate")) { @@ -358,6 +403,12 @@ static int my_unload_module(void) } AST_RWLIST_UNLOCK(&columns); + AST_RWLIST_WRLOCK(&staticvals); + while ((entry = AST_RWLIST_REMOVE_HEAD(&staticvals, list))) { + ast_free(entry); + } + AST_RWLIST_UNLOCK(&staticvals); + dbport = 0; ast_cdr_unregister(name); @@ -549,7 +600,29 @@ static int my_load_module(int reload) foundalias = 1; break; } - + if (!foundalias) { + for (var = ast_variable_browse(cfg, "static"); var; var = var->next) { + if (strcasecmp(var->name, row[0])) { + continue; + } + + if (!(entry = ast_calloc(1, sizeof(*entry) + strlen(var->name) + 1 + strlen(var->value) + 1 + strlen(row[1]) + 1))) { + continue; + } + + entry->cdrname = (char *)entry + sizeof(*entry); + entry->name = (char *)entry + sizeof(*entry) + strlen(var->value) + 1; + entry->type = (char *)entry + sizeof(*entry) + strlen(var->value) + 1 + strlen(var->name) + 1; + strcpy(entry->cdrname, var->value); + strcpy(entry->name, var->name); + strcpy(entry->type, row[1]); + + AST_LIST_INSERT_TAIL(&staticvals, entry, list); + ast_log(LOG_NOTICE, "Found a static value for DB column %s, type %s\n", entry->name, entry->type); + foundalias = 1; + break; + } + } if (!foundalias && (entry = ast_calloc(1, sizeof(*entry) + strlen(row[0]) + 1 + strlen(row[1]) + 1))) { entry->cdrname = (char *)entry + sizeof(*entry); entry->name = (char *)entry + sizeof(*entry);