From d5dd43856e88a80ef9a0ed050c88ff1316929761 Mon Sep 17 00:00:00 2001 From: Rodrigo Ramírez Norambuena Date: Wed, 15 Apr 2015 20:55:33 -0300 Subject: cdr/cdr_odbc.c: Added to record new columns add on CDR 1.8 Asterisk Version Add new column to INSERT new columns added in cdr 1.8 version. The columns are: * peeraccount * linkedid * sequence This feature is configurable in cdr_odbc.conf using a new configuration option, 'newcdrcolumns'. ASTERISK-24976 #close Change-Id: Ibe0c7540a88305c6012786f438a0813ad8b19127 --- UPGRADE.txt | 5 +++++ cdr/cdr_odbc.c | 32 +++++++++++++++++++++++++++----- configs/samples/cdr_odbc.conf.sample | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/UPGRADE.txt b/UPGRADE.txt index 1a056b891..d0db4dbca 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -50,6 +50,11 @@ res_pjsip_dlg_options: should have no adverse effects for those upgrading; this note merely serves as an indication that a new module exists. +cdr_odbc: + - Added support for post-1.8 CDR columns 'peeraccount', 'linkedid', and + 'sequence'. Support for the new columns can be enabled via the newcdrcolumns + option in cdr_odbc.conf. + From 13.2.0 to 13.3.0: chan_dahdi: diff --git a/cdr/cdr_odbc.c b/cdr/cdr_odbc.c index b8640f6bc..1524efd17 100644 --- a/cdr/cdr_odbc.c +++ b/cdr/cdr_odbc.c @@ -64,6 +64,7 @@ enum { CONFIG_DISPOSITIONSTRING = 1 << 2, CONFIG_HRTIME = 1 << 3, CONFIG_REGISTERED = 1 << 4, + CONFIG_NEWCDRCOLUMNS = 1 << 5, }; static struct ast_flags config = { 0 }; @@ -72,23 +73,29 @@ static SQLHSTMT execute_cb(struct odbc_obj *obj, void *data) { struct ast_cdr *cdr = data; SQLRETURN ODBC_res; - char sqlcmd[2048] = "", timestr[128]; + char sqlcmd[2048] = "", timestr[128], new_columns[120] = "", new_values[7] = ""; struct ast_tm tm; SQLHSTMT stmt; + int i = 0; ast_localtime(&cdr->start, &tm, ast_test_flag(&config, CONFIG_USEGMTIME) ? "GMT" : NULL); ast_strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); + if (ast_test_flag(&config, CONFIG_NEWCDRCOLUMNS)) { + snprintf(new_columns, sizeof(new_columns), "%s", ",peeraccount,linkedid,sequence"); + snprintf(new_values, sizeof(new_values), "%s", ",?,?,?"); + } + if (ast_test_flag(&config, CONFIG_LOGUNIQUEID)) { snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp," - "lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield) " - "VALUES ({ts '%s'},?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table, timestr); + "lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield%s) " + "VALUES ({ts '%s'},?,?,?,?,?,?,?,?,?,?,?,?,?,?,? %s)", table, new_columns, timestr, new_values); } else { snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata," - "duration,billsec,disposition,amaflags,accountcode) " - "VALUES ({ts '%s'},?,?,?,?,?,?,?,?,?,?,?,?,?)", table, timestr); + "duration,billsec,disposition,amaflags,accountcode%s) " + "VALUES ({ts '%s'},?,?,?,?,?,?,?,?,?,?,?,?,?%s)", table, new_columns, timestr, new_values); } ODBC_res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt); @@ -134,9 +141,17 @@ static SQLHSTMT execute_cb(struct odbc_obj *obj, void *data) SQLBindParameter(stmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->amaflags, 0, NULL); SQLBindParameter(stmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->accountcode), 0, cdr->accountcode, 0, NULL); + i = 14; if (ast_test_flag(&config, CONFIG_LOGUNIQUEID)) { SQLBindParameter(stmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->uniqueid), 0, cdr->uniqueid, 0, NULL); SQLBindParameter(stmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->userfield), 0, cdr->userfield, 0, NULL); + i = 16; + } + + if (ast_test_flag(&config, CONFIG_NEWCDRCOLUMNS)) { + SQLBindParameter(stmt, i, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->peeraccount), 0, cdr->peeraccount, 0, NULL); + SQLBindParameter(stmt, i + 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->linkedid), 0, cdr->linkedid, 0, NULL); + SQLBindParameter(stmt, i + 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->sequence, 0, NULL); } ODBC_res = SQLExecDirect(stmt, (unsigned char *)sqlcmd, SQL_NTS); @@ -260,6 +275,13 @@ static int odbc_load_module(int reload) ast_set_flag(&config, CONFIG_REGISTERED); } } + if (((tmp = ast_variable_retrieve(cfg, "global", "newcdrcolumns"))) && ast_true(tmp)) { + ast_set_flag(&config, CONFIG_NEWCDRCOLUMNS); + ast_debug(1, "cdr_odbc: Add new cdr fields\n"); + } else { + ast_clear_flag(&config, CONFIG_NEWCDRCOLUMNS); + ast_debug(1, "cdr_odbc: Not add new cdr fields\n"); + } } while (0); if (ast_test_flag(&config, CONFIG_REGISTERED) && (!cfg || dsn == NULL || table == NULL)) { diff --git a/configs/samples/cdr_odbc.conf.sample b/configs/samples/cdr_odbc.conf.sample index 93bd6fff8..663ce0956 100644 --- a/configs/samples/cdr_odbc.conf.sample +++ b/configs/samples/cdr_odbc.conf.sample @@ -9,3 +9,4 @@ ;table=cdr ;"cdr" is default table name ;usegmtime=no ; set to "yes" to log in GMT ;hrtime=yes ;Enables microsecond accuracy with the billsec and duration fields +;newcdrcolumns=yes ; Enable logging of post-1.8 CDR columns (peeraccount, linkedid, sequence) -- cgit v1.2.3