Hi.
here is a brand new cdr_mysql .

Is based on the previous one, but with lots of changes, so I include
here the whole file, not a patch.
What I've changed:
added new fields, in order to reflect cdr csv  :
* call start time
* call answer time
* call end time
* call unique id

Changed the table structure to reflect cdr.h lengths.

Added some (a lot?) sanity checks, to be sure to insert
records that fits into mysql, and not to exit with "Failed insert" 
errors. Also now on load/reload cdr mysql checks the table structure
to adjust the fields length values (and issue warnings if some
fields are too small).

Feel free to blame me (I'm not a C guru). I can fix any error, of
course. Mark feel free to add it to asterisk, if u think that's
a good work. I'll disclaim, if needed.

Positive and/or negative comments are welcome.

Matteo.

-- 
Matteo Brancaleoni
Powered by RedHat Linux 8.0
Linux User #153521
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GS d? s:- a- C+++ UL++++ P+ L+++ E- W+++ N++ o K- w--
O- M-- V-- PS PE- Y PGP++ t 5 X+ R tv- b++ DI D+
G e h! r++ y
------END GEEK CODE BLOCK------
# phpMyAdmin MySQL-Dump
# version 2.5.0
# http://www.phpmyadmin.net/ (download page)
#
# Host: localhost
# Generato il: 07 Giu, 2003 at 03:23 
# Versione MySQL: 3.23.56
# Versione PHP: 4.2.2
# Database : `asterisk`
# --------------------------------------------------------

#
# Struttura della tabella `cdr`
#
# Creazione: 07 Giu, 2003 at 02:57 
# Ultimo cambiamento: 07 Giu, 2003 at 03:07 
#

CREATE TABLE `cdr` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL default '',
  `src` varchar(80) NOT NULL default '',
  `dst` varchar(80) NOT NULL default '',
  `dcontext` varchar(80) NOT NULL default '',
  `channel` varchar(80) NOT NULL default '',
  `dstchannel` varchar(80) NOT NULL default '',
  `lastapp` varchar(80) NOT NULL default '',
  `lastdata` varchar(80) NOT NULL default '',
  `start` datetime NOT NULL default '0000-00-00 00:00:00',
  `answer` datetime NOT NULL default '0000-00-00 00:00:00',
  `end` datetime NOT NULL default '0000-00-00 00:00:00',
  `duration` int(11) NOT NULL default '0',
  `billsec` int(11) NOT NULL default '0',
  `disposition` int(11) NOT NULL default '0',
  `amaflags` int(11) NOT NULL default '0',
  `accountcode` varchar(20) NOT NULL default '',
  `uniqueid` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;

/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * MySQL CDR logger 
 * 
 * Matteo Brancaleoni <[EMAIL PROTECTED]>
 * based on the first version by
 * James Sharp <[EMAIL PROTECTED]>
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License.
 *
 *
 * Table Structure for `cdr`
 *
 * Created on: 07 Giu, 2003 at 02:57 
 * Last changed on: 07 Giu, 2003 at 03:07 

CREATE TABLE `cdr` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL default '',
  `src` varchar(80) NOT NULL default '',
  `dst` varchar(80) NOT NULL default '',
  `dcontext` varchar(80) NOT NULL default '',
  `channel` varchar(80) NOT NULL default '',
  `dstchannel` varchar(80) NOT NULL default '',
  `lastapp` varchar(80) NOT NULL default '',
  `lastdata` varchar(80) NOT NULL default '',
  `start` datetime NOT NULL default '0000-00-00 00:00:00',
  `answer` datetime NOT NULL default '0000-00-00 00:00:00',
  `end` datetime NOT NULL default '0000-00-00 00:00:00',
  `duration` int(11) NOT NULL default '0',
  `billsec` int(11) NOT NULL default '0',
  `disposition` int(11) NOT NULL default '0',
  `amaflags` int(11) NOT NULL default '0',
  `accountcode` varchar(20) NOT NULL default '',
  `uniqueid` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;

*/

#include <sys/types.h>
#include <asterisk/config.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/cdr.h>
#include <asterisk/module.h>
#include <asterisk/logger.h>
#include "../asterisk.h"

#include <stdio.h>
#include <string.h>

#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <math.h>

#include <mysql.h>

#define DATE_FORMAT "%Y-%m-%d %T"

static char *desc = "MySQL CDR Backend";
static char *name = "mysql";
static char *config = "cdr_mysql.conf";

static MYSQL *mysql;
static MYSQL_RES *mysql2;

/* some defaults, based on cdr.h */
static	int calldate=19;
static	int start=19;
static	int end=19;
static	int answer=19;
static	int clid=80;
static	int src=80;
static	int dst=80;
static	int dcontext=80;
static	int channel=80;
static	int dstchannel=80;
static	int lastapp=80;
static	int lastdata=80;
static	int accountcode=20;
static	int uniqueid=32;
static	int duration=11;
static	int billsec=11;
static	int disposition=11;
static	int amaflags=11;
        
static int mysql_log(struct ast_cdr *cdr)
{
  struct tm tm;
  struct timeval tv;
  struct timezone tz;
  char *sqlcmd, timestr[128], startstr[80], answerstr[80], endstr[80];
  time_t t;

  sqlcmd = (char *)malloc(2048);
  if (sqlcmd == NULL) {
      ast_log(LOG_ERROR,"Failed to malloc for the query string.");
      return -1;
  }
  memset(sqlcmd,0,2048);

  /* Does we really need calldate ??? */
  gettimeofday(&tv,&tz);
  t = tv.tv_sec;
  localtime_r(&t,&tm);
  strftime(timestr,sizeof(timestr),DATE_FORMAT,&tm);

  /* set start */
  t = cdr->start.tv_sec;
  localtime_r(&t,&tm);
  strftime(startstr,sizeof(startstr),DATE_FORMAT,&tm);

  /* set answer */
  t = cdr->answer.tv_sec;
  localtime_r(&t,&tm);
  strftime(answerstr,sizeof(answerstr),DATE_FORMAT,&tm);

  /* set end */
  t = cdr->end.tv_sec;
  localtime_r(&t,&tm);
  strftime(endstr,sizeof(endstr),DATE_FORMAT,&tm);

  /* Start strings len checks, to make mysql happy & generate warnings */ 
  if (strlen(timestr) > calldate) {
	ast_log(LOG_WARNING,"Data Loss! Cutting calldate\n");
	 timestr[calldate]='\0';
	}
  if (strlen(cdr->clid) > clid) {
        ast_log(LOG_WARNING,"Data Loss! Cutting clid\n");
         cdr->clid[clid]='\0';
        }
  if (strlen(cdr->src) > src) {
        ast_log(LOG_WARNING,"Data Loss! Cutting src\n");
         cdr->src[src]='\0';
        }
  if (strlen(cdr->dst) > dst) {
        ast_log(LOG_WARNING,"Data Loss! Cutting dst\n");
         cdr->dst[dst]='\0';
        }
  if (strlen(cdr->dcontext) > dcontext) {
        ast_log(LOG_WARNING,"Data Loss! Cutting dcontext\n");
         cdr->dcontext[dcontext]='\0';
        }
  if (strlen(cdr->channel) > channel) {
        ast_log(LOG_WARNING,"Data Loss! Cutting channel\n");
         cdr->channel[channel]='\0';
        }
  if (strlen(cdr->dstchannel) > dstchannel) {
        ast_log(LOG_WARNING,"Data Loss! Cutting dstchannel\n");
         cdr->dstchannel[dstchannel]='\0';
        }
  if (strlen(cdr->lastapp) > lastapp) {
        ast_log(LOG_WARNING,"Data Loss! Cutting lastapp\n");
         cdr->lastapp[lastapp]='\0';
        }
  if (strlen(cdr->lastdata) > lastdata) {
        ast_log(LOG_WARNING,"Data Loss! Cutting lastdata\n");
         cdr->lastdata[lastdata]='\0';
        }
  if (strlen(startstr) > start) {
        ast_log(LOG_WARNING,"Data Loss! Cutting start\n");
         startstr[start]='\0';
        }
  if (strlen(answerstr) > answer) {
        ast_log(LOG_WARNING,"Data Loss! Cutting answer\n");
         answerstr[answer]='\0';
        }
  if (strlen(endstr) > end) {
        ast_log(LOG_WARNING,"Data Loss! Cutting end\n");
         endstr[end]='\0';
        }
  if (cdr->duration > (pow(10,duration)-1)) {
        ast_log(LOG_WARNING,"Data Loss! Cutting duration\n");
         cdr->duration=-1;
        }
  if (cdr->billsec > (pow(10,billsec)-1)) {
        ast_log(LOG_WARNING,"Data Loss! Cutting billsec\n");
         cdr->billsec=-1;
        }
  if (cdr->disposition > (pow(10,disposition)-1)) {
        ast_log(LOG_WARNING,"Data Loss! Cutting disposition\n");
         cdr->disposition=-1;
        }
  if (cdr->amaflags > (pow(10,amaflags)-1)) {
        ast_log(LOG_WARNING,"Data Loss! Cutting amaflags\n");
         cdr->amaflags=-1;
        }
  if (strlen(cdr->accountcode) > accountcode) {
        ast_log(LOG_WARNING,"Data Loss! Cutting accountcode\n");
         cdr->accountcode[accountcode]='\0';
        }
  if (strlen(cdr->uniqueid) > uniqueid) {
        ast_log(LOG_WARNING,"Data Loss! Cutting uniqueid\n");
         cdr->uniqueid[uniqueid]='\0';
        }
  /* Start the query .... */
  ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
  sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,start,answer,end,duration,billsec,disposition,amaflags,accountcode,uniqueid) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s','%s','%s','%s',%i,%i,%i,%i,'%s','%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata, startstr, answerstr, endstr,cdr->duration,cdr->billsec,cdr->disposition,cdr->amaflags, cdr->accountcode, cdr->uniqueid);
  
  ast_log(LOG_DEBUG,"cdr_mysql: SQL command as follows:  %s\n",sqlcmd);
  
  if (mysql_real_query(mysql,sqlcmd,strlen(sqlcmd)))
  {
      ast_log(LOG_ERROR,"Failed to insert into database.");
      free(sqlcmd);
      return -1;
  }
  free(sqlcmd);
  return 0;
}



char *description(void)
{
  return desc;
}

int unload_module(void)
{ 

  mysql_close(mysql);
  ast_cdr_unregister(name);
  return 0;
}

int load_module(void)
{
  int res;
  struct ast_config *cfg;
  struct ast_variable *var;
  int cnt;

  char *hostname, *dbname, *dbuser, *password;

  cfg = ast_load(config);
  if (!cfg) {
    ast_log(LOG_WARNING, "Unable to load config for mysql CDR's: %s\n", config);
    return 0;
  }
  
  var = ast_variable_browse(cfg, "global");
  if (!var) {
    /* nothing configured */
    return 0;
  }

  hostname = ast_variable_retrieve(cfg,"global","hostname");
  dbname = ast_variable_retrieve(cfg,"global","dbname");
  dbuser = ast_variable_retrieve(cfg,"global","user");
  password = ast_variable_retrieve(cfg,"global","password");
  ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
  ast_log(LOG_DEBUG,"cdr_mysql: got user of %s\n",dbuser);
  ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
  ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);

  if (hostname == NULL)
    {
      ast_log(LOG_ERROR,"Database server hostname not specified.\n");
      return -1;
    }
  if (dbuser == NULL)
    {
      ast_log(LOG_ERROR,"Database dbuser not specified.\n");
      return -1;
    }
  if (dbname == NULL)
    {
      ast_log(LOG_ERROR,"Database dbname not specified.\n");
      return -1;
    }
  if (password == NULL)
    {
      ast_log(LOG_ERROR,"Database password not specified.\n");
      return -1;
    }


  mysql = mysql_init(NULL);

  mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);

  if (mysql == NULL) {
    ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
    return -1;
  } else {
    ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
  }
 
/* mysql fields sanity checks ... */
  mysql2 = mysql_list_fields(mysql,"cdr","%"); 
  if (mysql2 == NULL) {
    ast_log(LOG_ERROR, "Failed to list cdr records.\n");
    return -1;
  } else {
    ast_log(LOG_DEBUG,"Database fields listed!.\n");
    cnt=1;
    while(cnt <= mysql2->field_count) {

    if(!strcmp(mysql2->fields->name,"accountcode")) {
	if (mysql2->fields->length < accountcode) {
		ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,accountcode,mysql2->fields->length);
		accountcode=mysql2->fields->length;
	}
	else if (mysql2->fields->length > accountcode) {
		ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,accountcode,mysql2->fields->length);
		accountcode=mysql2->fields->length;
	}
    }
    if(!strcmp(mysql2->fields->name,"src")) {
        if (mysql2->fields->length < src) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,src,mysql2->fields->length);
                src=mysql2->fields->length;
        }
        else if (mysql2->fields->length > src) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,src,mysql2->fields->length);
                src=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dst")) {
        if (mysql2->fields->length < dst) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dst,mysql2->fields->length);
                dst=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dst) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dst,mysql2->fields->length);
                dst=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dcontext")) {
        if (mysql2->fields->length < dcontext) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dcontext,mysql2->fields->length);
                dcontext=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dcontext) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dcontext,mysql2->fields->length);
                dcontext=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"clid")) {
        if (mysql2->fields->length < clid) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,clid,mysql2->fields->length);
                clid=mysql2->fields->length;
        }
        else if (mysql2->fields->length > clid) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,clid,mysql2->fields->length);
                clid=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"channel")) {
        if (mysql2->fields->length < channel) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,channel,mysql2->fields->length);
                channel=mysql2->fields->length;
        }
        else if (mysql2->fields->length > channel) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,channel,mysql2->fields->length);
                channel=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dstchannel")) {
        if (mysql2->fields->length < dstchannel) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dstchannel,mysql2->fields->length);
                dstchannel=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dstchannel) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dstchannel,mysql2->fields->length);
                dstchannel=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"lastapp")) {
        if (mysql2->fields->length < lastapp) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,lastapp,mysql2->fields->length);
                lastapp=mysql2->fields->length;
        }
        else if (mysql2->fields->length > lastapp) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,lastapp,mysql2->fields->length);
                lastapp=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"lastdata")) {
        if (mysql2->fields->length < lastdata) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,lastdata,mysql2->fields->length);
                lastdata=mysql2->fields->length;
        }
        else if (mysql2->fields->length > lastdata) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,lastdata,mysql2->fields->length);
                lastdata=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"start")) {
        if (mysql2->fields->length < start) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,start,mysql2->fields->length);
                start=mysql2->fields->length;
        }
        else if (mysql2->fields->length > start) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,start,mysql2->fields->length);
                start=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"answer")) {
        if (mysql2->fields->length < answer) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,answer,mysql2->fields->length);
                answer=mysql2->fields->length;
        }
        else if (mysql2->fields->length > answer ) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,answer,mysql2->fields->length);
                answer=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"end")) {
        if (mysql2->fields->length < end) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,end,mysql2->fields->length);
                end=mysql2->fields->length;
        }
        else if (mysql2->fields->length > end) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,end,mysql2->fields->length);
                end=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"duration")) {
        if (mysql2->fields->length < duration) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,duration,mysql2->fields->length);
                duration=mysql2->fields->length;
        }
        else if (mysql2->fields->length > duration) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,duration,mysql2->fields->length);
                duration=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"billsec")) {
        if (mysql2->fields->length < billsec) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,billsec,mysql2->fields->length);
                billsec=mysql2->fields->length;
        }
        else if (mysql2->fields->length > billsec) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,billsec,mysql2->fields->length);
                billsec=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"disposition")) {
        if (mysql2->fields->length < disposition) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,disposition,mysql2->fields->length);
                disposition=mysql2->fields->length;
        }
        else if (mysql2->fields->length > disposition) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,disposition,mysql2->fields->length);
                disposition=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"amaflags")) {
        if (mysql2->fields->length < amaflags) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,amaflags,mysql2->fields->length);
                amaflags=mysql2->fields->length;
        }
        else if (mysql2->fields->length > amaflags) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,amaflags,mysql2->fields->length);
                amaflags=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"uniqueid")) {
        if (mysql2->fields->length < uniqueid) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,uniqueid,mysql2->fields->length);
                uniqueid=mysql2->fields->length;
        }
        else if (mysql2->fields->length > uniqueid) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,uniqueid,mysql2->fields->length);
                uniqueid=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"calldate")) {
        if (mysql2->fields->length < calldate) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,calldate,mysql2->fields->length);
                calldate=mysql2->fields->length;
        }
        else if (mysql2->fields->length > calldate) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,calldate,mysql2->fields->length);
                calldate=mysql2->fields->length;
        }
    }
    	mysql2->fields++;
	cnt++;
    }
  }
  mysql_free_result(mysql2);
/* end mysql fields sanity checks */

  res = ast_cdr_register(name, desc, mysql_log);
  if (res) {
    ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
  }
  return res;
}

int reload(void)
{

  struct ast_config *cfg;
  struct ast_variable *var;
  int cnt;

  char *hostname, *dbname, *password, *dbuser;
  
  mysql_close(mysql);


  cfg = ast_load(config);
  if (!cfg) {
    ast_log(LOG_WARNING, "Unable to load MySQL CDR config %s\n", config);
    return 0;
  }
  
  var = ast_variable_browse(cfg, "global");
  if (!var) {
    /* nothing configured */
    return 0;
  }

  hostname = ast_variable_retrieve(cfg,"global","hostname");
  dbname = ast_variable_retrieve(cfg,"global","dbname");
  dbuser = ast_variable_retrieve(cfg,"global","user");
  password = ast_variable_retrieve(cfg,"global","password");
  ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
  ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
  ast_log(LOG_DEBUG,"cdr_mysql: got dbuser of %s\n",dbuser);
  ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);

  if (hostname == NULL)
    {
      ast_log(LOG_ERROR,"Database server hostname not specified.\n");
      return -1;
    }
  if (dbname == NULL)
    {
      ast_log(LOG_ERROR,"Database dbname not specified.\n");
      return -1;
    }
  if (dbuser == NULL)
    {
      ast_log(LOG_ERROR,"Database dbuser not specified.\n");
      return -1;
    }
  
  if (password == NULL)
    {
      ast_log(LOG_ERROR,"Database password not specified.\n");
      return -1;
    }
  
 mysql = mysql_init(NULL);
 
 mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);
 
 if (mysql == NULL) {
   ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
   return -1;
 } else {
   ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
 }
/* mysql fields sanity checks ... */
  mysql2 = mysql_list_fields(mysql,"cdr","%"); 
  if (mysql2 == NULL) {
    ast_log(LOG_ERROR, "Failed to list cdr records.\n");
    return -1;
  } else {
    ast_log(LOG_DEBUG,"Database fields listed!.\n");
    cnt=1;
    while(cnt <= mysql2->field_count) {

    if(!strcmp(mysql2->fields->name,"accountcode")) {
	if (mysql2->fields->length < accountcode) {
		ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,accountcode,mysql2->fields->length);
		accountcode=mysql2->fields->length;
	}
	else if (mysql2->fields->length > accountcode) {
		ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,accountcode,mysql2->fields->length);
		accountcode=mysql2->fields->length;
	}
    }
    if(!strcmp(mysql2->fields->name,"src")) {
        if (mysql2->fields->length < src) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,src,mysql2->fields->length);
                src=mysql2->fields->length;
        }
        else if (mysql2->fields->length > src) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,src,mysql2->fields->length);
                src=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dst")) {
        if (mysql2->fields->length < dst) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dst,mysql2->fields->length);
                dst=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dst) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dst,mysql2->fields->length);
                dst=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dcontext")) {
        if (mysql2->fields->length < dcontext) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dcontext,mysql2->fields->length);
                dcontext=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dcontext) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dcontext,mysql2->fields->length);
                dcontext=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"clid")) {
        if (mysql2->fields->length < clid) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,clid,mysql2->fields->length);
                clid=mysql2->fields->length;
        }
        else if (mysql2->fields->length > clid) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,clid,mysql2->fields->length);
                clid=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"channel")) {
        if (mysql2->fields->length < channel) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,channel,mysql2->fields->length);
                channel=mysql2->fields->length;
        }
        else if (mysql2->fields->length > channel) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,channel,mysql2->fields->length);
                channel=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"dstchannel")) {
        if (mysql2->fields->length < dstchannel) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,dstchannel,mysql2->fields->length);
                dstchannel=mysql2->fields->length;
        }
        else if (mysql2->fields->length > dstchannel) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,dstchannel,mysql2->fields->length);
                dstchannel=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"lastapp")) {
        if (mysql2->fields->length < lastapp) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,lastapp,mysql2->fields->length);
                lastapp=mysql2->fields->length;
        }
        else if (mysql2->fields->length > lastapp) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,lastapp,mysql2->fields->length);
                lastapp=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"lastdata")) {
        if (mysql2->fields->length < lastdata) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,lastdata,mysql2->fields->length);
                lastdata=mysql2->fields->length;
        }
        else if (mysql2->fields->length > lastdata) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,lastdata,mysql2->fields->length);
                lastdata=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"start")) {
        if (mysql2->fields->length < start) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,start,mysql2->fields->length);
                start=mysql2->fields->length;
        }
        else if (mysql2->fields->length > start) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,start,mysql2->fields->length);
                start=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"answer")) {
        if (mysql2->fields->length < answer) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,answer,mysql2->fields->length);
                answer=mysql2->fields->length;
        }
        else if (mysql2->fields->length > answer ) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,answer,mysql2->fields->length);
                answer=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"end")) {
        if (mysql2->fields->length < end) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,end,mysql2->fields->length);
                end=mysql2->fields->length;
        }
        else if (mysql2->fields->length > end) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,end,mysql2->fields->length);
                end=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"duration")) {
        if (mysql2->fields->length < duration) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,duration,mysql2->fields->length);
                duration=mysql2->fields->length;
        }
        else if (mysql2->fields->length > duration) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,duration,mysql2->fields->length);
                duration=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"billsec")) {
        if (mysql2->fields->length < billsec) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,billsec,mysql2->fields->length);
                billsec=mysql2->fields->length;
        }
        else if (mysql2->fields->length > billsec) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,billsec,mysql2->fields->length);
                billsec=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"disposition")) {
        if (mysql2->fields->length < disposition) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,disposition,mysql2->fields->length);
                disposition=mysql2->fields->length;
        }
        else if (mysql2->fields->length > disposition) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,disposition,mysql2->fields->length);
                disposition=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"amaflags")) {
        if (mysql2->fields->length < amaflags) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,amaflags,mysql2->fields->length);
                amaflags=mysql2->fields->length;
        }
        else if (mysql2->fields->length > amaflags) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,amaflags,mysql2->fields->length);
                amaflags=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"uniqueid")) {
        if (mysql2->fields->length < uniqueid) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,uniqueid,mysql2->fields->length);
                uniqueid=mysql2->fields->length;
        }
        else if (mysql2->fields->length > uniqueid) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,uniqueid,mysql2->fields->length);
                uniqueid=mysql2->fields->length;
        }
    }
    if(!strcmp(mysql2->fields->name,"calldate")) {
        if (mysql2->fields->length < calldate) {
                ast_log(LOG_WARNING,"Field %s is smaller than default %d. Data loss possibility! Lowering to %d\n",mysql2->fields->name,calldate,mysql2->fields->length);
                calldate=mysql2->fields->length;
        }
        else if (mysql2->fields->length > calldate) {
                ast_log(LOG_DEBUG,"Field %s is bigger than default %d. Raising to %d\n",mysql2->fields->name,calldate,mysql2->fields->length);
                calldate=mysql2->fields->length;
        }
    }
    	mysql2->fields++;
	cnt++;
    }
  }
  mysql_free_result(mysql2);
/* end mysql fields sanity checks */
  return 0;
}

int usecount(void)
{
  return 0;
}

char *key()
{
  return ASTERISK_GPL_KEY;
}

Reply via email to