diff -urb --exclude=CVS asterisk-CVS-v1-0/cdr/cdr_odbc.c asterisk-CVS-v1-0_MERGE/cdr/cdr_odbc.c --- asterisk-CVS-v1-0/cdr/cdr_odbc.c 2004-11-25 14:42:45 +0200 +++ asterisk-CVS-v1-0_MERGE/cdr/cdr_odbc.c 2004-11-25 14:49:04 +0200 @@ -37,8 +37,8 @@ static char *desc = "ODBC CDR Backend"; static char *name = "ODBC"; static char *config = "cdr_odbc.conf"; -static char *dsn = NULL, *username = NULL, *password = NULL, *loguniqueid = NULL; -static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, loguniqueid_alloc = 0; +static char *dsn = NULL, *username = NULL, *password = NULL, *loguniqueid = NULL, *table = NULL; +static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, loguniqueid_alloc = 0, table_alloc = 0; static int connected = 0; AST_MUTEX_DEFINE_STATIC(odbc_lock); @@ -66,15 +66,15 @@ strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); memset(sqlcmd,0,2048); if ((loguniqueid != NULL) && (ast_true(loguniqueid))) { - snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO cdr " + snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp," "lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table); } else { - snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO cdr " + snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata," "duration,billsec,disposition,amaflags,accountcode) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table); } if (!connected) { @@ -211,6 +211,13 @@ loguniqueid = NULL; loguniqueid_alloc = 0; } + if (table && table_alloc) { + if (option_verbose > 10) + ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free table\n"); + free(table); + table = NULL; + table_alloc = 0; + } ast_cdr_unregister(name); ast_mutex_unlock(&odbc_lock); return 0; @@ -302,11 +309,28 @@ loguniqueid = NULL; } + tmp = ast_variable_retrieve(cfg,"global","table"); + if (tmp) { + table = malloc(strlen(tmp) + 1); + if (table != NULL) { + memset(table, 0, strlen(tmp) + 1); + table_alloc = 1; + strncpy(table, tmp, strlen(tmp)); + } else { + ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n"); + return -1; + } + } else { + ast_log(LOG_WARNING,"cdr_odbc: table not specified. Assuming cdr\n"); + table = "cdr"; + } + ast_destroy(cfg); if (option_verbose > 3) { ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: dsn is %s\n",dsn); ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: username is %s\n",username); ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: password is [secret]\n"); + ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: table is %s\n",table); } res = odbc_init(); @@ -420,7 +444,13 @@ int usecount(void) { - return connected; + /* Simplistic use count */ + if (ast_mutex_trylock(&odbc_lock)) { + return 1; + } else { + ast_mutex_unlock(&odbc_lock); + return 0; + } } char *key() diff -urb --exclude=CVS asterisk-CVS-v1-0/configs/cdr_odbc.conf.sample asterisk-CVS-v1-0_MERGE/configs/cdr_odbc.conf.sample --- asterisk-CVS-v1-0/configs/cdr_odbc.conf.sample 2004-01-12 00:00:00 +0200 +++ asterisk-CVS-v1-0_MERGE/configs/cdr_odbc.conf.sample 2004-11-15 17:53:00 +0200 @@ -1,5 +1,5 @@ ; -; cdr_unixodbc.conf +; cdr_odbc.conf ; ;[global] @@ -7,3 +7,4 @@ ;username=username ;password=password ;loguniqueid=yes +;table=cdr ;"cdr" is default table name