Index: cdr/cdr_mysql.c
===================================================================
RCS file: /usr/cvsroot/asterisk/cdr/cdr_mysql.c,v
retrieving revision 1.7
diff -r1.7 cdr_mysql.c
29a30
> #include <mysql/errmsg.h>
35a37,38
> static char *hostname = NULL, *dbname = NULL, *dbuser = NULL, *password = NULL;
> static int connected = 0;
37c40,42
< static MYSQL *mysql;
---
> static pthread_mutex_t mysql_lock = AST_MUTEX_INITIALIZER;
> 
> static MYSQL mysql;
41,50c46,81
<   struct tm tm;
<   struct timeval tv;
<   struct timezone tz;
<   char *sqlcmd, timestr[128];
<   time_t t;
< 
< 
<   sqlcmd = (char *)malloc(2048);
<   memset(sqlcmd,0,2048);
< 
---
> 	struct tm tm;
> 	struct timeval tv;
> 	char sqlcmd[2048], timestr[128];
> 	time_t t;
> 
> 	ast_pthread_mutex_lock(&mysql_lock);
> 
> 	memset(sqlcmd,0,2048);
> 
> 	gettimeofday(&tv,NULL);
> 	t = tv.tv_sec;
> 	localtime_r(&t,&tm);
> 	strftime(timestr,128,DATE_FORMAT,&tm);
> 
> 	if ((!connected) && hostname && dbuser && password && dbname) {
> 		/* Attempt to connect */
> 		mysql_init(&mysql);
> 		if (mysql_real_connect(&mysql, hostname, dbuser, password, dbname, 0, NULL, 0)) {
> 			connected = 1;
> 		} else {
> 			ast_log(LOG_ERROR, "cdr_mysql: cannot connect to database %s.  Call will not be logged\n", hostname);
> 		}
> 	} else {
> 		/* Long connection - ping the server */
> 		int error;
> 		if ((error = mysql_ping(&mysql))) {
> 			connected = 0;
> 			switch (error) {
> 				case CR_SERVER_GONE_ERROR:
> 					ast_log(LOG_ERROR, "cdr_mysql: Server has gone away\n");
> 					break;
> 				default:
> 					ast_log(LOG_ERROR, "cdr_mysql: Unknown connection error\n");
> 			}
> 		}
> 	}
52,58c83,84
<   gettimeofday(&tv,&tz);
<   t = tv.tv_sec;
<   localtime_r(&t,&tm);
<   strftime(timestr,128,DATE_FORMAT,&tm);
<   
< 
<   ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
---
> 	if (connected) {
> 		ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
60c86
<   sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s','%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode, cdr->uniqueid);
---
> 		sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s','%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode, cdr->uniqueid);
62c88
<   sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode);
---
> 		sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode);
64,73c90,99
<   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;
---
> 		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.");
> 			ast_pthread_mutex_unlock(&mysql_lock);
> 			return -1;
> 		}
> 	}
> 	ast_pthread_mutex_unlock(&mysql_lock);
> 	return 0;
76,77d101
< 
< 
80c104
<   return desc;
---
> 	return desc;
85,88c109,130
< 
<   mysql_close(mysql);
<   ast_cdr_unregister(name);
<   return 0;
---
> 	if (connected) {
> 		mysql_close(&mysql);
> 		connected = 0;
> 	}
> 	if (hostname) {
> 		free(hostname);
> 		hostname = NULL;
> 	}
> 	if (dbname) {
> 		free(dbname);
> 		dbname = NULL;
> 	}
> 	if (dbuser) {
> 		free(dbuser);
> 		dbuser = NULL;
> 	}
> 	if (password) {
> 		free(password);
> 		password = NULL;
> 	}
> 	ast_cdr_unregister(name);
> 	return 0;
93,158c135,221
<   int res;
<   struct ast_config *cfg;
<   struct ast_variable *var;
< 
<   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");
<   }
<   
< 
<   res = ast_cdr_register(name, desc, mysql_log);
<   if (res) {
<     ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
<   }
<   return res;
---
> 	int res;
> 	struct ast_config *cfg;
> 	struct ast_variable *var;
> 	char *tmp;
> 
> 	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;
> 	}
> 
> 	tmp = ast_variable_retrieve(cfg,"global","hostname");
> 	hostname = malloc(strlen(tmp) + 1);
> 	if ((tmp != NULL) && (hostname != NULL)) {
> 		strcpy(hostname,tmp);
> 	} else if (tmp == NULL) {
> 		ast_log(LOG_ERROR,"Database server hostname not specified.\n");
> 		return -1;
> 	} else {
> 		ast_log(LOG_ERROR,"Out of memory error.\n");
> 		return -1;
> 	}
> 
> 	tmp = ast_variable_retrieve(cfg,"global","dbname");
> 	dbname = malloc(strlen(tmp) + 1);
> 	if ((tmp != NULL) && (dbname != NULL)) {
> 		strcpy(dbname,tmp);
> 	} else if (tmp == NULL) {
> 		ast_log(LOG_ERROR,"Database dbname not specified.\n");
> 		return -1;
> 	} else {
> 		ast_log(LOG_ERROR,"Out of memory error.\n");
> 		return -1;
> 	}
> 
> 	tmp = ast_variable_retrieve(cfg,"global","user");
> 	dbuser = malloc(strlen(tmp) + 1);
> 	if ((tmp != NULL) && (dbuser != NULL)) {
> 		strcpy(dbuser,tmp);
> 	} else if (tmp == NULL) {
> 		ast_log(LOG_ERROR,"Database dbuser not specified.\n");
> 		return -1;
> 	} else {
> 		ast_log(LOG_ERROR,"Out of memory error.\n");
> 		return -1;
> 	}
> 
> 	tmp = ast_variable_retrieve(cfg,"global","password");
> 	password = malloc(strlen(tmp) + 1);
> 	if ((tmp != NULL) && (password != NULL)) {
> 		strcpy(password,tmp);
> 	} else if (tmp == NULL) {
> 		ast_log(LOG_ERROR,"Database password not specified.\n");
> 		return -1;
> 	} else {
> 		ast_log(LOG_ERROR,"Out of memory error.\n");
> 		return -1;
> 	}
> 
> 	ast_destroy(cfg);
> 
> 	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);
> 
> 	mysql_init(&mysql);
> 
> 	if (!mysql_real_connect(&mysql, hostname, dbuser, password, dbname, 0, NULL, 0)) {
> 		ast_log(LOG_ERROR, "Failed to connect to mysql database %s on %s.\n", dbname, hostname);
> 		connected = 0;
> 	} else {
> 		ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
> 		connected = 1;
> 	}
> 
> 	res = ast_cdr_register(name, desc, mysql_log);
> 	if (res) {
> 		ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
> 	}
> 	return res;
163,229c226,227
< 
<   struct ast_config *cfg;
<   struct ast_variable *var;
< 
<   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");
<  }
<  
< 
< 
< 
<   return 0;
---
> 	unload_module();
> 	return load_module();
234c232
<   return 0;
---
> 	return connected;
239c237
<   return ASTERISK_GPL_KEY;
---
> 	return ASTERISK_GPL_KEY;
