[Freeswitch-svn] [commit] r1720 - in freeswitch/branches/mishehu/src: . mod/endpoints/mod_portaudio mod/loggers/mod_cdr
Freeswitch SVN
mishehu at freeswitch.org
Sat Jul 1 03:08:24 EDT 2006
Author: mishehu
Date: Sat Jul 1 03:08:24 2006
New Revision: 1720
Modified:
freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c
freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp
freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h
freeswitch/branches/mishehu/src/switch.c
freeswitch/branches/mishehu/src/switch_ivr.c
Log:
Fixed up MysqlCDR to work again, at least it does with no chanvars or with only chanvars_supp. Still need to test the chanvars_fixed for logging direct to the main table in a more normalized fashion. Merged to trunk r1719.
Modified: freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c
==============================================================================
--- freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c (original)
+++ freeswitch/branches/mishehu/src/mod/endpoints/mod_portaudio/mod_portaudio.c Sat Jul 1 03:08:24 2006
@@ -163,6 +163,7 @@
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_RINGING) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_info", buf);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call_id", tech_pvt->call_id);
switch_channel_event_set_data(channel, event);
switch_event_fire(&event);
}
Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp (original)
+++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.cpp Sat Jul 1 03:08:24 2006
@@ -26,6 +26,13 @@
lastapp_length = strlen(lastapp);
lastdata_length = strlen(lastdata);
+ if(chanvars_fixed_list.size() > 0)
+ process_channel_variables(chanvars_fixed_list,newchannel->channel);
+
+ if(chanvars_supp_list.size() > 0)
+ process_channel_variables(chanvars_supp_list,chanvars_fixed_list,newchannel->channel,repeat_fixed_in_supp);
+
+
process_channel_variables(chanvars_fixed_list,newchannel->channel);
}
}
@@ -37,13 +44,14 @@
bool MysqlCDR::connectionstate = 0;
bool MysqlCDR::logchanvars = 0;
-bool MysqlCDR::repeat_fixed_in_supp_chanvars = 0;
+bool MysqlCDR::repeat_fixed_in_supp = 0;
std::list<std::string> MysqlCDR::chanvars_fixed_list;
std::list<std::string> MysqlCDR::chanvars_supp_list;
std::string MysqlCDR::chanvars_fixed_types;
bool MysqlCDR::activated = 0;
-char MysqlCDR::sql_query[1024] = "";
-char MysqlCDR::sql_query_chanvars[1024] = "";
+char* MysqlCDR::sql_query = 0;
+std::string MysqlCDR::tmp_sql_query;
+char MysqlCDR::sql_query_chanvars[100] = "";
MYSQL* MysqlCDR:: conn = 0;
MYSQL_STMT* MysqlCDR::stmt=0;
MYSQL_STMT* MysqlCDR::stmt_chanvars=0;
@@ -55,6 +63,9 @@
void MysqlCDR::connect(switch_xml_t& cfg, switch_xml_t& xml, switch_xml_t& settings, switch_xml_t& param)
{
+ if(activated)
+ disconnect();
+
activated = 0; // Set it as inactive initially
connectionstate = 0; // Initialize it to false to show that we aren't yet connected.
@@ -106,7 +117,7 @@
{
std::cout << std::endl << "Shall we parse the fixed chanvars list for MysqlCDR?" << std::endl;
parse_channel_variables_xconfig(unparsed,chanvars_fixed_list,chanvars_fixed_types);
- logchanvars=1;
+ //logchanvars=1;
}
}
else if(!strcmp(var,"chanvars_supp"))
@@ -115,6 +126,7 @@
{
std::string unparsed = val;
bool fixed = 0;
+ logchanvars = 1;
std::cout << std::endl << "Shall we parse the supplementary chanvars list for MysqlCDR?" << std::endl;
parse_channel_variables_xconfig(unparsed,chanvars_supp_list,fixed);
}
@@ -125,7 +137,7 @@
{
std::string repeat = val;
if(repeat == "Y" || repeat == "y" || repeat == "1")
- repeat_fixed_in_supp_chanvars = 1;
+ repeat_fixed_in_supp = 1;
}
}
}
@@ -137,12 +149,33 @@
if(activated)
{
- char tmpsql_query[] = "INSERT INTO freeswitchcdr (callstartdate,callanswerdate,callenddate,originated,clid,src,dst,ani,ani2,dialplan,myuuid,destuuid,srcchannel,dstchannel,lastapp,lastdata,billusec,disposition,hangupcause,amaflags) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
- memset(sql_query,0,1024);
- strncpy(sql_query,tmpsql_query,strlen(tmpsql_query));
+ tmp_sql_query = "INSERT INTO freeswitchcdr (callstartdate,callanswerdate,callenddate,originated,clid,src,dst,ani,ani2,dialplan,myuuid,destuuid,srcchannel,dstchannel,lastapp,lastdata,billusec,disposition,hangupcause,amaflags";
+ if(chanvars_fixed_list.size() > 0 )
+ {
+ std::list<std::string>::iterator iItr, iEnd;
+ for(iItr = chanvars_fixed_list.begin(), iEnd = chanvars_fixed_list.end(); iItr != iEnd; iItr++)
+ {
+ tmp_sql_query.append(",");
+ tmp_sql_query.append(*iItr);
+ }
+ }
+
+ tmp_sql_query.append(") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?");
+
+ if(chanvars_fixed_list.size() > 0 )
+ {
+ for(switch_size_t i = 0; i < chanvars_fixed_list.size(); i++)
+ tmp_sql_query.append(",?");
+ }
+
+ tmp_sql_query.append(")");
+
+ std::vector<char> tempfirstvector(tmp_sql_query.begin(), tmp_sql_query.end());
+ tempfirstvector.push_back('\0');
+ sql_query = &tempfirstvector[0];
char tempsql_query_chanvars[] = "INSERT INTO chanvars (callid,varname,varvalue) VALUES(?,?,?)";
- memset(sql_query_chanvars,0,1024);
+ memset(sql_query_chanvars,0,100);
strncpy(sql_query_chanvars,tempsql_query_chanvars,strlen(tempsql_query_chanvars));
conn = mysql_init(NULL);
@@ -254,6 +287,77 @@
add_parameter(hangupcause,MYSQL_TYPE_LONG,0);
add_parameter(amaflags,MYSQL_TYPE_TINY,0);
+ std::list<void*> temp_chanvars_holder; // This is used for any fixed chanvars, as we don't want things out of scope
+
+ if(chanvars_fixed_list.size() > 0)
+ {
+ switch_size_t i = 0; // temporary variable, i is current spot on the string of types
+ std::list<std::pair<std::string,std::string> >::iterator iItr, iEnd;
+ for(iItr = chanvars_fixed.begin(), iEnd = chanvars_fixed.end(); iItr != iEnd; iItr++)
+ {
+ if(chanvars_fixed_types[i] == 'i')
+ {
+ int x;
+ x = 0;
+ bool is_null = 0;
+ if(iItr->second.size() > 0)
+ {
+ std::istringstream istring(iItr->second);
+ istring >> x;
+ }
+ else
+ is_null = 1;
+ temp_chanvars_holder.push_back(&x);
+ add_parameter(x,MYSQL_TYPE_LONG,is_null);
+ }
+ else if(chanvars_fixed_types[i] == 'd')
+ {
+ double x;
+ x = 0;
+ bool is_null = 0;
+ if(iItr->second.size() > 0)
+ {
+ std::istringstream istring(iItr->second);
+ istring >> x;
+ }
+ else
+ is_null = 1;
+ temp_chanvars_holder.push_back(&x);
+ add_parameter(x,MYSQL_TYPE_DOUBLE,is_null);
+ }
+ else if(chanvars_fixed_types[i] == 't')
+ {
+ short x;
+ x = 0;
+ bool is_null = 0;
+ if(iItr->second.size() > 0)
+ {
+ std::istringstream istring(iItr->second);
+ istring >> x;
+ }
+ else
+ is_null = 1;
+ temp_chanvars_holder.push_back(&x);
+ add_parameter(x,MYSQL_TYPE_TINY,is_null);
+ }
+ else if(chanvars_fixed_types[i] == 's' || chanvars_fixed_types[i] == 'x')
+ {
+ long unsigned int stringlength = iItr->second.size();
+ char x[(stringlength+1)];
+ strncpy(x,iItr->second.c_str(),stringlength);
+
+ temp_chanvars_holder.push_back(&stringlength);
+ temp_chanvars_holder.push_back(&x);
+ if(chanvars_fixed_types[i] == 's')
+ add_string_parameter(x,stringlength,MYSQL_TYPE_VAR_STRING,0);
+ else
+ add_string_parameter(x,stringlength,MYSQL_TYPE_DECIMAL,0);
+ }
+
+ i++;
+ }
+ }
+
MYSQL_BIND *bindmetemp;
bindmetemp = new MYSQL_BIND[bindme.size()];
copy(bindme.begin(), bindme.end(), bindmetemp);
@@ -264,11 +368,11 @@
const char* bah2 = mysql_stmt_error(stmt);
switch_console_printf(SWITCH_CHANNEL_LOG,"MySQL encountered error: %s\n",bah2);
-
- long long insertid = mysql_stmt_insert_id(stmt);
-
+
if(logchanvars && chanvars_supp.size() > 0)
{
+ long long insertid = mysql_stmt_insert_id(stmt);
+
std::map<std::string,std::string>::iterator iItr,iBeg,iEnd;
iEnd = chanvars_supp.end();
for(iItr = chanvars_supp.begin(); iItr != iEnd; iItr++)
@@ -329,6 +433,7 @@
*/
delete [] bindmetemp;
+ temp_chanvars_holder.clear();
return 1;
}
@@ -336,8 +441,16 @@
void MysqlCDR::disconnect()
{
mysql_stmt_close(stmt);
- mysql_stmt_close(stmt_chanvars);
+ if(logchanvars)
+ mysql_stmt_close(stmt_chanvars);
mysql_close(conn);
+ activated = 0;
+ logchanvars = 0;
+ chanvars_fixed_list.clear();
+ chanvars_supp_list.clear();
+ chanvars_fixed_types.clear();
+ connectionstate = 0;
+ tmp_sql_query.clear();
}
Modified: freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h
==============================================================================
--- freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h (original)
+++ freeswitch/branches/mishehu/src/mod/loggers/mod_cdr/mysqlcdr.h Sat Jul 1 03:08:24 2006
@@ -1,5 +1,6 @@
#include "baseregistry.h"
#include <list>
+#include <sstream>
#include <mysql.h>
#ifndef MYSQLCDR
@@ -20,8 +21,9 @@
private:
static bool activated;
- static char sql_query[1024];
- static char sql_query_chanvars[1024];
+ static char *sql_query;
+ static std::string tmp_sql_query; // Object must exist to bind the statement, this used for generating the sql
+ static char sql_query_chanvars[100];
static MYSQL *conn;
static MYSQL_STMT *stmt;
static MYSQL_STMT *stmt_chanvars;
@@ -30,7 +32,7 @@
static std::list<std::string> chanvars_fixed_list;
static std::string chanvars_fixed_types;
static std::list<std::string> chanvars_supp_list; // The supplemental list
- static bool repeat_fixed_in_supp_chanvars;
+ static bool repeat_fixed_in_supp;
static char hostname[255];
static char username[255];
static char dbname[255];
Modified: freeswitch/branches/mishehu/src/switch.c
==============================================================================
--- freeswitch/branches/mishehu/src/switch.c (original)
+++ freeswitch/branches/mishehu/src/switch.c Sat Jul 1 03:08:24 2006
@@ -81,7 +81,7 @@
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
#else
int pid;
- //nice(-20);
+ nice(-20);
#endif
#ifdef HAVE_MLOCKALL
Modified: freeswitch/branches/mishehu/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/mishehu/src/switch_ivr.c (original)
+++ freeswitch/branches/mishehu/src/switch_ivr.c Sat Jul 1 03:08:24 2006
@@ -1123,6 +1123,7 @@
switch_channel_get_name(caller_channel),
switch_channel_get_name(peer_channel)
);
+ switch_channel_hangup(peer_channel, SWITCH_CAUSE_NO_ANSWER);
}
return status;
More information about the Freeswitch-svn
mailing list