Index: cdr/cdr_odbc.c =================================================================== --- cdr/cdr_odbc.c (revision 7259) +++ cdr/cdr_odbc.c (working copy) @@ -65,6 +65,8 @@ static char *config = "cdr_odbc.conf"; static char *dsn = NULL, *username = NULL, *password = NULL, *table = NULL; static int loguniqueid = 0; +static int loguserfield = 0; +static int loghangupcause = 0; static int usegmtime = 0; static int dispositionstring = 0; static int connected = 0; @@ -84,8 +86,8 @@ short int ODBC_mlen; int ODBC_res; char ODBC_msg[200], ODBC_stat[10]; - char sqlcmd[2048] = "", timestr[128]; - int res = 0; + char sqlcmd[2048] = "", timestr[128], sqlsuffix[8]; + int res = 0, paramnum = 0; struct tm tm; if (usegmtime) @@ -96,17 +98,27 @@ ast_mutex_lock(&odbc_lock); strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm); memset(sqlcmd,0,2048); + memset(sqlsuffix,0,8); + + /* Create the first part of the query */ + snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " + "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata," + "duration,billsec,disposition,amaflags,accountcode", table); + if (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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table); - } else { - snprintf(sqlcmd,sizeof(sqlcmd),"INSERT INTO %s " - "(calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata," - "duration,billsec,disposition,amaflags,accountcode) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", table); + snprintf(sqlcmd + strlen(sqlcmd),sizeof(sqlcmd) - strlen(sqlcmd),",uniqueid"); + snprintf(sqlsuffix + strlen(sqlsuffix),sizeof(sqlsuffix) - strlen(sqlsuffix),",?"); } + if (loguserfield) { + snprintf(sqlcmd + strlen(sqlcmd),sizeof(sqlcmd) - strlen(sqlcmd),",userfield"); + snprintf(sqlsuffix + strlen(sqlsuffix),sizeof(sqlsuffix) - strlen(sqlsuffix),",?"); + } + if (loghangupcause) { + snprintf(sqlcmd + strlen(sqlcmd),sizeof(sqlcmd) - strlen(sqlcmd),",hangupcause"); + snprintf(sqlsuffix + strlen(sqlsuffix),sizeof(sqlsuffix) - strlen(sqlsuffix),",?"); + } + /* add the last part */ + snprintf(sqlcmd + strlen(sqlcmd),sizeof(sqlcmd) - strlen(sqlcmd),") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?%s)", sqlsuffix); if (!connected) { res = odbc_init(); @@ -145,28 +157,30 @@ return 0; } - SQLBindParameter(ODBC_stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(timestr), 0, ×tr, 0, NULL); - SQLBindParameter(ODBC_stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->clid), 0, cdr->clid, 0, NULL); - SQLBindParameter(ODBC_stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->src), 0, cdr->src, 0, NULL); - SQLBindParameter(ODBC_stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dst), 0, cdr->dst, 0, NULL); - SQLBindParameter(ODBC_stmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dcontext), 0, cdr->dcontext, 0, NULL); - SQLBindParameter(ODBC_stmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->channel), 0, cdr->channel, 0, NULL); - SQLBindParameter(ODBC_stmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dstchannel), 0, cdr->dstchannel, 0, NULL); - SQLBindParameter(ODBC_stmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->lastapp), 0, cdr->lastapp, 0, NULL); - SQLBindParameter(ODBC_stmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->lastdata), 0, cdr->lastdata, 0, NULL); - SQLBindParameter(ODBC_stmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->duration, 0, NULL); - SQLBindParameter(ODBC_stmt, 11, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->billsec, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(timestr), 0, ×tr, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->clid), 0, cdr->clid, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->src), 0, cdr->src, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dst), 0, cdr->dst, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dcontext), 0, cdr->dcontext, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->channel), 0, cdr->channel, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->dstchannel), 0, cdr->dstchannel, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->lastapp), 0, cdr->lastapp, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->lastdata), 0, cdr->lastdata, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->duration, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->billsec, 0, NULL); if (dispositionstring) - SQLBindParameter(ODBC_stmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(ast_cdr_disp2str(cdr->disposition)) + 1, 0, ast_cdr_disp2str(cdr->disposition), 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(ast_cdr_disp2str(cdr->disposition)) + 1, 0, ast_cdr_disp2str(cdr->disposition), 0, NULL); else - SQLBindParameter(ODBC_stmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->disposition, 0, NULL); - SQLBindParameter(ODBC_stmt, 13, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->amaflags, 0, NULL); - SQLBindParameter(ODBC_stmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->accountcode), 0, cdr->accountcode, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->disposition, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->amaflags, 0, NULL); + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->accountcode), 0, cdr->accountcode, 0, NULL); - if (loguniqueid) { - SQLBindParameter(ODBC_stmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->uniqueid), 0, cdr->uniqueid, 0, NULL); - SQLBindParameter(ODBC_stmt, 16, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->userfield), 0, cdr->userfield, 0, NULL); - } + if (loguniqueid) + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->uniqueid), 0, cdr->uniqueid, 0, NULL); + if (loguserfield) + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(cdr->userfield), 0, cdr->userfield, 0, NULL); + if (loghangupcause) + SQLBindParameter(ODBC_stmt, ++paramnum, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &cdr->hangupcause, 0, NULL); if (connected) { res = odbc_do_query(); @@ -315,6 +329,32 @@ loguniqueid = 0; } + tmp = ast_variable_retrieve(cfg,"global","loguserfield"); + if (tmp) { + loguserfield = ast_true(tmp); + if (loguserfield) { + ast_log(LOG_DEBUG,"cdr_odbc: Logging userfield\n"); + } else { + ast_log(LOG_DEBUG,"cdr_odbc: Not logging userfield\n"); + } + } else { + ast_log(LOG_DEBUG,"cdr_odbc: Not logging userfield\n"); + loguserfield = 0; + } + + tmp = ast_variable_retrieve(cfg,"global","loghangupcause"); + if (tmp) { + loghangupcause = ast_true(tmp); + if (loghangupcause) { + ast_log(LOG_DEBUG,"cdr_odbc: Logging hangupcause\n"); + } else { + ast_log(LOG_DEBUG,"cdr_odbc: Not logging hangupcause\n"); + } + } else { + ast_log(LOG_DEBUG,"cdr_odbc: Not logging hangupcause\n"); + loghangupcause = 0; + } + tmp = ast_variable_retrieve(cfg,"global","usegmtime"); if (tmp) { usegmtime = ast_true(tmp); Index: configs/cdr_odbc.conf.sample =================================================================== --- configs/cdr_odbc.conf.sample (revision 7258) +++ configs/cdr_odbc.conf.sample (working copy) @@ -7,6 +7,8 @@ ;username=username ;password=password ;loguniqueid=yes +;loguserfield=yes +;loghangupcause=yes ;dispositionstring=yes ;table=cdr ;"cdr" is default table name ;usegmtime=no ; set to "yes" to log in GMT