[Freeswitch-svn] [commit] r3436 - freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr

Freeswitch SVN mishehu at freeswitch.org
Wed Nov 22 00:43:06 EST 2006


Author: mishehu
Date: Wed Nov 22 00:43:05 2006
New Revision: 3436

Modified:
   freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp
   freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h
   freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp
   freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlcdr.cpp
   freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/pddcdr.cpp

Log:
Made a reload capability for mod_cdr (depends on changes yet unpublished to apr-util's apr_queue), but have not yet tested it.  Also fixed lingering ani2's in mysqlcdr.cpp that somehow stuck around in this branch.

Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp	(original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.cpp	Wed Nov 22 00:43:05 2006
@@ -45,8 +45,7 @@
 	// Create the APR threadsafe queue, though I don't know if this is the current memory pool.
 	switch_queue_create(&cdrqueue,5224288, module_pool);
 	
-	char *configfile = "mod_cdr.conf";
-	switch_xml_t cfg, xml, settings, param;
+	strcpy(configfile,"mod_cdr.conf");
 	
 	switch_mod_cdr_newchannel_t *newchannel; // = new switch_mod_cdr_newchannel_t;
 	newchannel = 0;
@@ -89,6 +88,45 @@
 	}
 		
 	switch_console_printf(SWITCH_CHANNEL_LOG,"mod_cdr shutdown gracefully.");
+}
+
+void CDRContainer::reload()
+{
+	// Something tells me I still need to figure out what to do if there are items still in queue after reload that are no longer active in the configuration.
+	switch_queue_isempty(cdrqueue); // Waits for the queue to be empty
+	
+	switch_mod_cdr_newchannel_t *newchannel; // = new switch_mod_cdr_newchannel_t;
+	newchannel = 0;
+	
+	if (!(xml = switch_xml_open_cfg(configfile, &cfg, NULL))) 
+		switch_console_printf(SWITCH_CHANNEL_LOG,"open of %s failed\n", configfile);
+	else
+	{
+		BaseRegistry& registry(BaseRegistry::get());
+		registry.reset_active();
+		for(BaseRegistry::iterator it = registry.active_begin(); it != registry.active_end(); ++it)
+		{
+			basecdr_creator func = *it;
+			BaseCDR* _ptr = func(newchannel);
+			std::auto_ptr<BaseCDR> ptr(_ptr);
+			ptr->disconnect();
+		}
+		
+		for(BaseRegistry::iterator it = registry.begin(); it != registry.end(); ++it)
+		{
+			basecdr_creator func = *it;
+			BaseCDR* _ptr = func(newchannel);
+			std::auto_ptr<BaseCDR> ptr(_ptr);
+			ptr->connect(cfg,xml,settings,param);
+			
+			if(ptr->is_activated())
+				registry.add_active(it);
+		}
+	}
+	
+	switch_xml_free(xml);
+	switch_queue_unblockpop(cdrqueue);
+	switch_console_printf(SWITCH_CHANNEL_LOG,"mod_cdr configuration reloaded.");
 }
 
 void CDRContainer::add_cdr(switch_core_session_t *session)

Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h	(original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/cdrcontainer.h	Wed Nov 22 00:43:05 2006
@@ -58,10 +58,13 @@
 		~CDRContainer();
 		void add_cdr(switch_core_session_t *session);
 		void process_records();
+		void reload();
 	protected:
 	private:
+		switch_xml_t cfg, xml, settings, param;
 		switch_queue_t *cdrqueue;
 		std::string tempfilepath;
+		char configfile[13];
 };
 
 #ifdef __cplusplus

Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp	(original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mod_cdr.cpp	Wed Nov 22 00:43:05 2006
@@ -44,6 +44,8 @@
 static CDRContainer *newcdrcontainer;
 static switch_memory_pool_t *module_pool;
 static switch_status_t my_on_hangup(switch_core_session_t *session);
+static switch_status_t modcdr_reload(char *dest, switch_core_session_t *isession, switch_stream_handle_t *stream);
+static switch_thread_rwlock_t *cdr_rwlock;
 
 /* Now begins the glue that will tie this into the system.
 */
@@ -57,18 +59,29 @@
 	/*.on_transmit */ NULL
 };
 
+static switch_api_interface_t modcdr_reload_interface = {
+	/*.interface_name */ "modcdr_reload",
+	/*.desc */ "Reload mod_cdr's configuration",
+	/*.function */ modcdr_reload,
+	/*.syntax */ "modcdr_reload",
+	/*.next */ 0
+};
+
 static const switch_loadable_module_interface_t cdr_module_interface = {
 	/*.module_name */ modname,
 	/*.endpoint_interface */ NULL,
 	/*.timer_interface */ NULL,
 	/*.dialplan_interface */ NULL,
 	/*.codec_interface */ NULL,
-	/*.application_interface */ NULL
+	/*.application_interface */ NULL,
+	/* api_interface */ &modcdr_reload_interface
 };
 
 static switch_status_t my_on_hangup(switch_core_session_t *session)
 {
+	switch_thread_rwlock_rdlock(cdr_rwlock);
 	newcdrcontainer->add_cdr(session);
+	switch_thread_rwlock_unlock(cdr_rwlock);
 	return SWITCH_STATUS_SUCCESS;
 }
 
@@ -85,6 +98,7 @@
 		return SWITCH_STATUS_TERM;
 	}
 
+	switch_thread_rwlock_create(&cdr_rwlock,module_pool);
 	newcdrcontainer = new CDRContainer(module_pool);  // Instantiates the new object, automatically loads config
 	
 	/* indicate that the module should continue to be loaded */
@@ -100,8 +114,17 @@
 	return RUNNING ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_TERM;
 }
 
+static switch_status_t modcdr_reload(char *dest=0, switch_core_session_t *isession=0, switch_stream_handle_t *stream=0)
+{
+	switch_thread_rwlock_wrlock(cdr_rwlock);
+	newcdrcontainer->reload();
+	switch_thread_rwlock_unlock(cdr_rwlock);
+	return SWITCH_STATUS_SUCCESS;
+}
+
 SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
 {
 	delete newcdrcontainer;
+	switch_thread_rwlock_destroy(cdr_rwlock);
 	return SWITCH_STATUS_SUCCESS;
 }

Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlcdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlcdr.cpp	(original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/mysqlcdr.cpp	Wed Nov 22 00:43:05 2006
@@ -54,7 +54,7 @@
 		src_length = (long unsigned int)strlen(src);
 		dst_length = (long unsigned int)strlen(dst);
 		ani_length = (long unsigned int)strlen(ani);
-		ani2_length = (long unsigned int)strlen(ani2);
+		aniii_length = (long unsigned int)strlen(aniii);
 		dialplan_length = (long unsigned int)strlen(dialplan);
 		myuuid_length = (long unsigned int)strlen(myuuid);
 		destuuid_length = (long unsigned int)strlen(destuuid);
@@ -181,7 +181,7 @@
 		
 		if(activated)
 		{
-			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";
+			tmp_sql_query = "INSERT INTO freeswitchcdr  (callstartdate,callanswerdate,callenddate,originated,clid,src,dst,ani,aniii,dialplan,myuuid,destuuid,srcchannel,dstchannel,lastapp,lastdata,billusec,disposition,hangupcause,amaflags";
 			
 			int items_appended = 0;
 			
@@ -324,7 +324,7 @@
 	add_string_parameter(src,src_length,MYSQL_TYPE_VAR_STRING,0);
 	add_string_parameter(dst,dst_length,MYSQL_TYPE_VAR_STRING,0);
 	add_string_parameter(ani,ani_length,MYSQL_TYPE_VAR_STRING,0);
-	add_string_parameter(ani2,ani2_length,MYSQL_TYPE_VAR_STRING,0);
+	add_string_parameter(aniii,aniii_length,MYSQL_TYPE_VAR_STRING,0);
 	add_string_parameter(dialplan,dialplan_length,MYSQL_TYPE_VAR_STRING,0);
 	add_string_parameter(myuuid,myuuid_length,MYSQL_TYPE_VAR_STRING,0);
 	add_string_parameter(destuuid,destuuid_length,MYSQL_TYPE_VAR_STRING,0);

Modified: freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/pddcdr.cpp
==============================================================================
--- freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/pddcdr.cpp	(original)
+++ freeswitch/branches/mishehu/src/mod/event_handlers/mod_cdr/pddcdr.cpp	Wed Nov 22 00:43:05 2006
@@ -210,6 +210,11 @@
 
 void PddCDR::disconnect()
 {
+	activated = 0;
+	connectionstate = 0;
+	logchanvars = 0;
+	outputfile_path.clear();
+	chanvars_supp_list.clear();
 	switch_console_printf(SWITCH_CHANNEL_LOG,"Shutting down PddCDR...  Done!");	
 }
 



More information about the Freeswitch-svn mailing list