[Asterisk-cvs] asterisk-addons cdr_addon_mysql.c,1.2,1.3
markster at lists.digium.com
markster at lists.digium.com
Thu Jan 29 11:26:39 CST 2004
Update of /usr/cvsroot/asterisk-addons
In directory mongoose.digium.com:/tmp/cvs-serv18948
Modified Files:
cdr_addon_mysql.c
Log Message:
Add userfield stuff
Index: cdr_addon_mysql.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/cdr_addon_mysql.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cdr_addon_mysql.c 22 Jan 2004 21:37:33 -0000 1.2
+++ cdr_addon_mysql.c 29 Jan 2004 17:35:15 -0000 1.3
@@ -20,6 +20,7 @@
#include <asterisk/cdr.h>
#include <asterisk/module.h>
#include <asterisk/logger.h>
+#include <asterisk/cli.h>
#include "asterisk.h"
#include <stdio.h>
@@ -37,20 +38,70 @@
static char *desc = "MySQL CDR Backend";
static char *name = "mysql";
static char *config = "cdr_mysql.conf";
-static char *hostname = NULL, *dbname = NULL, *dbuser = NULL, *password = NULL, *dbsock = NULL, *userfielddata = NULL;
+static char *hostname = NULL, *dbname = NULL, *dbuser = NULL, *password = NULL, *dbsock = NULL;
static int hostname_alloc = 0, dbname_alloc = 0, dbuser_alloc = 0, password_alloc = 0, dbsock_alloc = 0;
static int dbport = 0;
static int connected = 0;
+static time_t connect_time = 0;
+static int records = 0;
+static int totalrecords = 0;
static int userfield = 0;
static ast_mutex_t mysql_lock = AST_MUTEX_INITIALIZER;
static MYSQL mysql;
+static char cdr_mysql_status_help[] =
+"Usage: cdr mysql status\n"
+" Shows current connection status for cdr_mysql\n";
+
+static int handle_cdr_mysql_status(int fd, int argc, char *argv[])
+{
+ if (connected) {
+ char status[256], status2[100] = "";
+ int ctime = time(NULL) - connect_time;
+ if (dbport)
+ snprintf(status, 255, "Connected to %s@%s, port %d", dbname, hostname, dbport);
+ else if (dbsock)
+ snprintf(status, 255, "Connected to %s on socket file %s", dbname, dbsock);
+ else
+ snprintf(status, 255, "Connected to %s@%s", dbname, hostname);
+
+ if (dbuser && *dbuser)
+ snprintf(status2, 99, " with username %s", dbuser);
+ if (ctime > 31536000) {
+ ast_cli(fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 31536000, (ctime % 31536000) / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60);
+ } else if (ctime > 86400) {
+ ast_cli(fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60);
+ } else if (ctime > 3600) {
+ ast_cli(fd, "%s%s for %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 3600, (ctime % 3600) / 60, ctime % 60);
+ } else if (ctime > 60) {
+ ast_cli(fd, "%s%s for %d minutes, %d seconds.\n", status, status2, ctime / 60, ctime % 60);
+ } else {
+ ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime);
+ }
+ if (records == totalrecords)
+ ast_cli(fd, " Wrote %d records since last restart.\n", totalrecords);
+ else
+ ast_cli(fd, " Wrote %d records since last restart and %d records since last reconnect.\n", totalrecords, records);
+ return RESULT_SUCCESS;
+ } else {
+ ast_cli(fd, "Not currently connected to a MySQL server.\n");
+ return RESULT_FAILURE;
+ }
+}
+
+static struct ast_cli_entry cdr_mysql_status_cli =
+ { { "cdr", "mysql", "status", NULL },
+ handle_cdr_mysql_status, "Show connection status of cdr_mysql",
+ cdr_mysql_status_help, NULL };
+
static int mysql_log(struct ast_cdr *cdr)
{
struct tm tm;
struct timeval tv;
+ struct localuser *u;
+ char *userfielddata = NULL;
char sqlcmd[2048], timestr[128];
time_t t;
@@ -68,6 +119,8 @@
mysql_init(&mysql);
if (mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) {
connected = 1;
+ connect_time = time(NULL);
+ records = 0;
} else {
ast_log(LOG_ERROR, "cdr_mysql: cannot connect to database server %s. Call will not be logged\n", hostname);
}
@@ -76,6 +129,7 @@
int error;
if ((error = mysql_ping(&mysql))) {
connected = 0;
+ records = 0;
switch (error) {
case CR_SERVER_GONE_ERROR:
ast_log(LOG_ERROR, "cdr_mysql: Server has gone away\n");
@@ -126,7 +180,7 @@
ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
- if (userfield)
+ if (userfield && userfielddata)
{
#ifdef MYSQL_LOGUNIQUEID
sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s','%s','%s')",timestr,clid,cdr->src, cdr->dst, dcontext,channel, dstchannel, lastapp, lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode, uniqueid, userfielddata);
@@ -149,6 +203,9 @@
ast_log(LOG_ERROR,"Failed to insert into database.");
ast_mutex_unlock(&mysql_lock);
return -1;
+ } else {
+ records++;
+ totalrecords++;
}
}
ast_mutex_unlock(&mysql_lock);
@@ -162,9 +219,11 @@
static int my_unload_module(void)
{
+ ast_cli_unregister(&cdr_mysql_status_cli);
if (connected) {
mysql_close(&mysql);
connected = 0;
+ records = 0;
}
if (hostname && hostname_alloc) {
free(hostname);
@@ -321,15 +380,21 @@
if (!mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) {
ast_log(LOG_ERROR, "Failed to connect to mysql database %s on %s.\n", dbname, hostname);
connected = 0;
+ records = 0;
} else {
ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
connected = 1;
+ records = 0;
+ connect_time = time(NULL);
}
res = ast_cdr_register(name, desc, mysql_log);
if (res) {
ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
+ } else {
+ res = ast_cli_register(&cdr_mysql_status_cli);
}
+
return res;
}
@@ -351,7 +416,13 @@
int usecount(void)
{
- return connected;
+ /* Simplistic use count */
+ if (ast_mutex_trylock(&mysql_lock)) {
+ return 1;
+ } else {
+ ast_mutex_unlock(&mysql_lock);
+ return 0;
+ }
}
char *key()
More information about the svn-commits
mailing list