[Freeswitch-branches] [commit] r6829 - freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr
Freeswitch SVN
mishehu at freeswitch.org
Sun Dec 16 13:36:25 EST 2007
Author: mishehu
Date: Sun Dec 16 13:36:24 2007
New Revision: 6829
Added:
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.cpp
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.h
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.cpp
freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.h
Log:
Added in the base mysql pool files.
Added: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.cpp
==============================================================================
--- (empty file)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.cpp Sun Dec 16 13:36:24 2007
@@ -0,0 +1,107 @@
+#include "mysqlconfclass.h"
+
+Switch_Mysql_ConfClass::Switch_Mysql_ConfClass()
+{
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_ERROR,"Why did we make a Switch_Mysql_ConfClass object without a memory pool?\n");
+}
+
+Switch_Mysql_ConfClass::Switch_Mysql_ConfClass(switch_memory_pool_t *mem) : SwitchToMempool(mem)
+{
+ mysql_activated = 0;
+ mysql_threads = 1;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Switch_Mysql_ConfClass object with a memory pool initialized and ready.\n");
+}
+
+void Switch_Mysql_ConfClass::load_config()
+{
+ switch_mysql_db_config_t *tmp_dbconfig = (switch_mysql_db_config_t*) switch_core_alloc(memorypool,sizeof(switch_mysql_db_config_t));
+ tmp_dbconfig->port = 3306;
+
+ char configfile[] = "mod_cdr_mysql.conf";
+ switch_xml_t cfg, xml, settings, param;
+
+ const char *err;
+ switch_xml_t xml_root;
+
+ if (!(xml = switch_xml_open_cfg(configfile, &cfg, NULL)))
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "open of %s failed\n", configfile);
+ else
+ {
+ int count_config_params = 0; // Need to make sure all params are set before we load
+ if ((settings = switch_xml_child(cfg, "mod_cdr_mysql")))
+ {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next)
+ {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcmp(var, "db_hostname"))
+ {
+ if(val != 0)
+ {
+ strncpy(tmp_dbconfig->hostname,val,strlen(val));
+ count_config_params++;
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Hostname: %s\n",val);
+ }
+ }
+ else if (!strcmp(var, "db_username"))
+ {
+ if(val != 0)
+ {
+ strncpy(tmp_dbconfig->username,val,strlen(val));
+ count_config_params++;
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Username: %s\n",val);
+ }
+ }
+ else if (!strcmp(var,"db_password"))
+ {
+ if(val != 0)
+ {
+ strncpy(tmp_dbconfig->password,val,strlen(val));
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Password: %s\n",val);
+ }
+ }
+ else if(!strcmp(var,"db_dbname"))
+ {
+ if(val != 0)
+ {
+ strncpy(tmp_dbconfig->dbname,val,strlen(val));
+ count_config_params++;
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Database: %s\n",val);
+ }
+ }
+ else if (!strcmp(var, "db_socket"))
+ {
+ if(val != 0)
+ {
+ tmp_dbconfig->socket_length = strlen(val);
+ tmp_dbconfig->socket = new char[tmp_dbconfig->socket_length+1];
+ strncpy(tmp_dbconfig->hostname,val,tmp_dbconfig->socket_length);
+ count_config_params++;
+ }
+ }
+ else if (!strcmp(var, "db_port"))
+ {
+ if(val != 0)
+ tmp_dbconfig->port = atoi(val);
+ }
+ else if (!strcmp(var, "mysql_threads"))
+ {
+ if(val != 0)
+ {
+ mysql_threads = atoi(val);
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Number of threads: %s\n",val);
+ }
+ }
+ }
+
+ if(count_config_params>=3 && mysql_threads)
+ {
+ mysql_activated = 1;
+ dbconfig = tmp_dbconfig;
+ }
+ }
+ }
+ switch_xml_free(xml);
+}
Added: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.h
==============================================================================
--- (empty file)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlconfclass.h Sun Dec 16 13:36:24 2007
@@ -0,0 +1,46 @@
+//
+// C++ Interface: confclass
+//
+// Description: FreeSWITCH MySQL 4 or higher configuration header
+//
+//
+// Author: Yossi Neiman <freeswitch at cartissolutions.com>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include <iostream>
+#include <switch_cpp.h>
+
+#ifndef SWITCHMYSQLCONFCLASS
+#define SWITCHMYSQLCONFCLASS
+
+struct switch_mysql_db_config {
+ char hostname[255];
+ char username[255];
+ char password[255];
+ char dbname[255];
+ unsigned int port;
+ char *socket;
+ switch_size_t socket_length;
+};
+
+typedef struct switch_mysql_db_config switch_mysql_db_config_t;
+
+class Switch_Mysql_ConfClass : public SwitchToMempool {
+ public:
+ ConfClass();
+ ConfClass(switch_memory_pool_t *);
+ ~ConfClass();
+ void load_config();
+ switch_mysql_db_config_t* get_db_config() { return dbconfig; }
+ uint32_t get_num_mysql_threads() { return mysql_threads; }
+ bool get_mysql_activated() { return mysql_activated; }
+
+ private:
+ uint32_t mysql_threads;
+ switch_mysql_db_config_t *dbconfig;
+ bool mysql_activated;
+};
+
+#endif
Added: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.cpp
==============================================================================
--- (empty file)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.cpp Sun Dec 16 13:36:24 2007
@@ -0,0 +1,160 @@
+//
+// C++ Implementation: mysqlpool
+//
+// Description: This file implements the MySQL C++ routines, including the threadpool functionality.
+//
+//
+// Author: Yossi Neiman <freeswitch at cartissolutions.com>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include "mysqlpool.h"
+
+uint32_t Switch_MySQLpool::number_of_threads = 0;
+switch_mysql_db_config_t* Switch_MySQLpool::internal_db_configuration = 0;
+bool Switch_MySQLpool::activated = 0;
+
+Switch_MySQLpool::Switch_MySQLpool()
+{
+ connected = 0;
+}
+
+Switch_MySQLpool::Switch_MySQLpool( switch_memory_pool_t *mem) : SwitchToMempool::SwitchToMempool( mem )
+{
+ connected = 0;
+ conn = mysql_init(NULL);
+ switch_mutex_init(&lock,SWITCH_MUTEX_UNNESTED,memorypool);
+}
+
+Switch_MySQLpool::~ Switch_MySQLpool()
+{
+ disconnect();
+ switch_mutex_destroy(lock);
+}
+
+void Switch_MySQLpool::set_db_config(switch_mysql_db_config_t *db_config)
+{
+ switch_mutex_lock(lock);
+
+ internal_db_configuration = db_config;
+
+ if(connected)
+ mysql_close(conn);
+
+ connected = 0;
+
+ switch_mutex_unlock(lock);
+}
+
+bool Switch_MySQLpool::disconnect()
+{
+ if(conn)
+ mysql_close(conn);
+
+ return 1;
+}
+
+bool Switch_MySQLpool::connect()
+{
+ switch_mutex_lock(lock);
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Connecting to the MySQL database.\n");
+ // mysql_options(conn, MYSQL_READ_DEFAULT_FILE, "");
+ //switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Hostname:\t%s\nUsername:\t%s\nPassword:\t%s\nPort:\t%s\nDatabase:\t%s\n",internal_db_configuration->hostname,internal_db_configuration->username,internal_db_configuration->password,internal_db_configuration->port,internal_db_configuration->dbname);
+ //if(internal_db_configuration->socket)
+ // switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Socket:\t%s\n",internal_db_configuration->socket);
+
+ if(mysql_real_connect(conn,internal_db_configuration->hostname,internal_db_configuration->username,internal_db_configuration->password,internal_db_configuration->dbname,internal_db_configuration->port,internal_db_configuration->socket,CLIENT_MULTI_STATEMENTS ) == NULL)
+ {
+ const char *error1 = mysql_error(conn);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot connect to MySQL Server. The error was: %s\n", error1);
+ errorstate = 1;
+ }
+ else
+ conn->reconnect = false;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Connection to the MySQL database complete.\n");
+ //mysql_autocommit(conn,0);
+ switch_mutex_unlock(lock);
+ return 1;
+}
+
+int Switch_MySQLpool::flush_results(MYSQL_RES *tempres)
+{
+ int count = 0, next_result_result = 0;
+
+ if(!errorstate)
+ {
+ mysql_free_result(tempres);
+ for( next_result_result = mysql_next_result(conn); next_result_result != 0; count++)
+ {
+ tempres = mysql_store_result(conn);
+ mysql_free_result(tempres);
+ }
+ }
+
+ return count;
+}
+
+void Switch_MySQLpool::myerror(std::string query_name)
+{
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_ERROR,"There was an error processing %s.\n",query_name.c_str());
+ unsigned int mysql_errorno = mysql_errno(conn);
+ const char *mysql_choked = mysql_error(conn);
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_ERROR,"The error was #%d %s\n",mysql_errorno,mysql_choked);
+}
+
+MYSQL_RES* Switch_MySQLpool::process_sp_query(std::string &query, std::string query_name, bool returns_results = 0)
+{
+ MYSQL_RES *return_me = 0;
+
+ if(!errorstate)
+ {
+ ping_the_db();
+
+ if(mysql_real_query(conn,query.c_str(),query.size()))
+ myerror(query_name);
+ else
+ {
+ return_me = mysql_store_result(conn);
+ if(returns_results)
+ {
+ while(return_me != NULL && mysql_field_count(conn) < 1)
+ {
+ switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,"Cycling thru res_%s.\n",query_name.c_str());
+ mysql_free_result(return_me);
+ mysql_next_result(conn);
+ return_me = mysql_store_result(conn);
+ }
+ }
+ }
+ }
+ return return_me;
+}
+
+void Switch_MySQLpool::ping_the_db()
+{
+ for(int mysql_ping_result = -1, count = 0; mysql_ping_result != 0 && count < 5; count++)
+ {
+ mysql_ping_result = mysql_ping(conn);
+ if(mysql_ping_result)
+ {
+ switch(mysql_ping_result)
+ {
+ case CR_SERVER_GONE_ERROR:
+ case CR_SERVER_LOST:
+ {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "We lost connection to the MySQL server. Trying to reconnect.\n");
+ connect();
+ break;
+ }
+ default:
+ {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "We have encountered an unknown error when pinging the MySQL server. Attempting to reconnect anyways.\n");
+ connect();
+ }
+ }
+ }
+ }
+}
Added: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.h
==============================================================================
--- (empty file)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlpool.h Sun Dec 16 13:36:24 2007
@@ -0,0 +1,57 @@
+//
+// C++ Interface: mysqlpool
+//
+// Description: This file describes some MySQL related functions, including a threadpool of connections
+// to a MySQL database.
+//
+//
+// Author: Yossi Neiman <freeswitch at cartissolutions.com>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include <iostream>
+#include <switch.h>
+#include <errmsg.h>
+#include <my_global.h>
+#include <my_dbug.h>
+#include <my_pthread.h>
+#include <mysql.h>
+#include <switch_cpp.h>
+#include "mysqlconfclass.h"
+
+#ifndef SWITCH_MYSQL_DB_MUTEX
+#define SWITCH_MYSQL_DB_MUTEX
+
+
+class Switch_MySQLpool:public SwitchToMempool {
+ public:
+ Switch_MySQLpool();
+ Switch_MySQLpool(switch_memory_pool_t *);
+ ~Switch_MySQLpool();
+ bool connect();
+ bool disconnect();
+ int flush_results(MYSQL_RES*);
+ MYSQL_RES* process_sp_query(std::string&, std::string, bool);
+ void myerror(std::string query_name);
+ // void connect_to_database();
+ MYSQL* get_conn() { return conn; }
+ static uint32_t get_number_of_threads() { return number_of_threads; }
+ bool is_active() { return activated; }
+ void set_db_config(switch_mysql_db_config_t *db_config);
+
+ private:
+ MYSQL *conn;
+ MYSQL_STMT *stmt;
+ MYSQL_STMT *stmt_chanvars;
+ switch_mutex_t *lock;
+ static uint32_t number_of_threads;
+ static bool activated;
+ bool connected;
+ bool errorstate;
+ static switch_mysql_db_config_t *internal_db_configuration;
+ void ping_the_db();
+};
+
+#endif
More information about the Freeswitch-branches
mailing list