[Freeswitch-svn] [commit] r14023 - freeswitch/trunk/contrib/ledr/mod_xml_odbc

FreeSWITCH SVN ledr at freeswitch.org
Sun Jun 28 12:19:08 PDT 2009


Author: ledr
Date: Sun Jun 28 14:19:08 2009
New Revision: 14023

Log:
cleaned up a bit, added comments, moved odbc-dsn to settings tag instead of per binding - perhaps re-add this later when memory leaks are fixed


Modified:
   freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
   freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml

Modified: freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
==============================================================================
--- freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c	(original)
+++ freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c	Sun Jun 28 14:19:08 2009
@@ -35,10 +35,10 @@
 #include <switch.h>
 
 typedef enum {
-	XML_ODBC_CONFIG = 0,
+	XML_ODBC_CONFIGURATION = 0,
 	XML_ODBC_DIRECTORY = 0,
 	XML_ODBC_DIALPLAN = 0,
-	XML_ODBC_PHRASE = 0
+	XML_ODBC_PHRASES = 0
 } xml_odbc_query_type_t;
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load);
@@ -52,16 +52,12 @@
 
 #define XML_ODBC_SYNTAX "[debug_on|debug_off|render_template]"
 
-static int logi = 0;
-static void logger(char *str)
-{
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG[%i] [%s]\n", ++logi, str);
-}
-
 static struct {
-	char *dbname;
 	char *odbc_dsn;
-	char *template;
+	char *configuration_template_name;
+	char *directory_template_name;
+	char *dialplan_template_name;
+	char *phrases_template_name;
 	switch_xml_t templates_tag;
 	switch_mutex_t *mutex;
 	switch_memory_pool_t *pool;
@@ -150,6 +146,7 @@
 
 	xml_odbc_query_helper_t query_helper;
 
+	/* special case xml-odbc-do - this tag is not copied, but action is done */
 	if (!strcasecmp(xml_in->name, "xml-odbc-do")) {
 		char *name = NULL;
 		char *value = NULL, *new_value = NULL;
@@ -200,6 +197,9 @@
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring unknown xml-odbc-do name=[%s]\n", name);
 		}
 
+		switch_safe_free(new_value);
+
+	/* just copy current tag xml_in to xml_out and recurse for all children */
 	} else {
 
 		/* set name if current root node */
@@ -273,22 +273,22 @@
 		//switch_xml_set_attr_d(xml_out, "type", "freeswitch/xml");
 	}
 
-	xml_odbc_query_type_t query_type;
-
+	char *template_name;
 	int off = 0, ret = 1;
 
 	if (!binding) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No bindings... sorry bud returning now\n");
 		return NULL;
 	}
+
 	if (!strcmp(section, "configuration")) {
-		query_type = XML_ODBC_CONFIG;
+		template_name = strdup(globals.configuration_template_name);
 	} else if (!strcmp(section, "directory")) {
-		query_type = XML_ODBC_DIRECTORY;
+		template_name = strdup(globals.directory_template_name);
 	} else if (!strcmp(section, "dialplan")) {
-		query_type = XML_ODBC_DIALPLAN;
+		template_name = strdup(globals.dialplan_template_name);
 	} else if (!strcmp(section, "phrases")) {
-		query_type = XML_ODBC_PHRASE;
+		template_name = strdup(globals.phrases_template_name);
 	} else {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid section\n");
 		return NULL;
@@ -301,7 +301,7 @@
 					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG in xml_odbc_search, header [%s]=[%s]\n", hi->name, hi->value);
 				}
 			}
-			xml_odbc_render_template(globals.template, params, xml_out, &off); // TODO globals.template should be replace with something specific for this section
+			xml_odbc_render_template(template_name, params, xml_out, &off);
 		}
 	} else {
 		goto cleanup;
@@ -327,22 +327,25 @@
 static switch_status_t do_config()
 {
 	char *cf = "xml_odbc.conf";
-	switch_xml_t cfg, xml, bindings_tag, binding_tag, templates_tag, param;
+	switch_xml_t cfg, xml, settings_tag, bindings_tag, binding_tag, templates_tag, param;
 	xml_binding_t *binding = NULL;
 
-	switch_status_t status = SWITCH_STATUS_SUCCESS;
+	switch_status_t status = SWITCH_STATUS_FALSE;
 
 	char *odbc_user = NULL;
 	char *odbc_pass = NULL;
-	char *sql = NULL;
-
-logger("X");
+	int binding_count = 0;
 
 	if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
 		return SWITCH_STATUS_TERM;
 	}
 
+	if (!(settings_tag = switch_xml_child(cfg, "settings"))) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing <settings> tag!\n");
+		goto done;
+	}
+
 	if (!(bindings_tag = switch_xml_child(cfg, "bindings"))) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing <bindings> tag!\n");
 		goto done;
@@ -353,8 +356,36 @@
 		goto done;
 	}
 
+// is this allowed ? or should I copy the entire tree ?
 	globals.templates_tag = templates_tag;
 
+	/* get all the settings */
+	for (param = switch_xml_child(settings_tag, "param"); param; param = param->next) {
+		char *var = NULL;
+		char *val = NULL;
+
+		var = (char *) switch_xml_attr_soft(param, "name");
+		val = (char *) switch_xml_attr_soft(param, "value");
+
+		/* set globals.odbc_dsn */
+		if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
+			globals.odbc_dsn = switch_core_strdup(globals.pool, val);
+			if ((odbc_user = strchr(globals.odbc_dsn, ':'))) {
+				*odbc_user++ = '\0';
+				if ((odbc_pass = strchr(odbc_user, ':'))) {
+					*odbc_pass++ = '\0';
+				}
+			}
+		}
+	}
+
+	/* check if odbc_dsn is set */
+	if (!globals.odbc_dsn) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No odbc-dsn setting is set!\n");
+		goto done;
+	}
+
+	/* get all bindings */
 	for (binding_tag = switch_xml_child(bindings_tag, "binding"); binding_tag; binding_tag = binding_tag->next) {
 		char *bname = (char*) switch_xml_attr_soft(binding_tag, "name");
 
@@ -365,22 +396,23 @@
 			var = (char *) switch_xml_attr_soft(param, "name");
 			val = (char *) switch_xml_attr_soft(param, "value");
 
-			if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
-				globals.odbc_dsn = switch_core_strdup(globals.pool, val);
-				if ((odbc_user = strchr(globals.odbc_dsn, ':'))) {
-					*odbc_user++ = '\0';
-					if ((odbc_pass = strchr(odbc_user, ':'))) {
-						*odbc_pass++ = '\0';
-					}
+			if (!strcasecmp(var, "template") && !switch_strlen_zero(val)) {
+				if (!strcmp(bname, "configuration")) {
+					globals.configuration_template_name = strdup(val);
+				} else if (!strcmp(bname, "directory")) {
+					globals.directory_template_name = strdup(val);
+				} else if (!strcmp(bname, "dialplan")) {
+					globals.dialplan_template_name = strdup(val);
+				} else if (!strcmp(bname, "phrases")) {
+					globals.phrases_template_name = strdup(val);
+				} else {
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid binding name [%s]\n", bname);
+					goto done;
 				}
-			} else if (!strcasecmp(var, "template") && !switch_strlen_zero(val)) {
-				globals.template = strdup(val);
 			}
 		}
 
-		if (switch_strlen_zero(globals.odbc_dsn) || switch_strlen_zero(odbc_user) || switch_strlen_zero(odbc_pass)) {
-			globals.dbname = "xml_odbc";
-		}
+		binding_count++;
 
 		if (!(binding = malloc(sizeof(*binding)))) {
 			goto done;
@@ -390,11 +422,19 @@
 		binding->bindings = strdup(bname);
 
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Binding [%s] XML ODBC Fetch Function [%s]\n",
-			switch_strlen_zero(bname) ? "N/A" : bname, binding->bindings ? binding->bindings : "all");
+			switch_strlen_zero(bname) ? "N/A" : bname, binding->bindings);
+
 		switch_xml_bind_search_function(xml_odbc_search, switch_xml_parse_section_string(bname), binding);
+
 		binding = NULL;
 	}
 
+	/* check if a binding is set */
+	if (binding_count == 0) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No binding is set, is this really what you want?\n");
+	}
+
+	/* make odbc connection */
 	if (switch_odbc_available() && globals.odbc_dsn) {
 
 		if (!(globals.master_odbc = switch_odbc_handle_new(globals.odbc_dsn, odbc_user, odbc_pass))) {
@@ -412,10 +452,10 @@
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", globals.odbc_dsn);
 	}
 
-  done:
-
-	switch_safe_free(sql);
+	/* all went fine */
+	status = SWITCH_STATUS_SUCCESS;
 
+  done:
 	return status;
 }
 
@@ -438,16 +478,16 @@
 
 	*module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
-	SWITCH_ADD_API(xml_odbc_api_interface, "xml_odbc", "XML ODBC", xml_odbc_function, XML_ODBC_SYNTAX);
-	switch_console_set_complete("add xml_odbc debug_on");
-	switch_console_set_complete("add xml_odbc debug_off");
-	switch_console_set_complete("add xml_odbc render_template");
-
 	if (do_config() != SWITCH_STATUS_SUCCESS) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to load xml_odbc config file\n");
 		return SWITCH_STATUS_FALSE;
 	}
 
+	SWITCH_ADD_API(xml_odbc_api_interface, "xml_odbc", "XML ODBC", xml_odbc_function, XML_ODBC_SYNTAX);
+	switch_console_set_complete("add xml_odbc debug_on");
+	switch_console_set_complete("add xml_odbc debug_off");
+	switch_console_set_complete("add xml_odbc render_template");
+
 	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_SUCCESS;
 }
@@ -455,6 +495,9 @@
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_odbc_shutdown)
 {
+	switch_odbc_handle_disconnect(globals.master_odbc);
+	switch_odbc_handle_destroy(&globals.master_odbc);
+
 	return SWITCH_STATUS_SUCCESS;
 }
 

Modified: freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml
==============================================================================
--- freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml	(original)
+++ freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml	Sun Jun 28 14:19:08 2009
@@ -1,25 +1,25 @@
 <configuration name="xml_odbc.conf" description="XML ODBC Configuration">
 
+  <settings>
+    <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
+  </settings>
+
   <bindings>
 <!--
     <binding name="configuration">
-      <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
       <param name="template" value="configuration"/>
     </binding>
 -->
     <binding name="directory">
-      <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
       <!-- <param name="template" value="directory_swk"/> -->
       <param name="template" value="directory"/>
     </binding>
 <!--
     <binding name="dialplan">
-      <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
       <param name="template" value="dialplan"/>
     </binding>
 
     <binding name="phrases">
-      <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
       <param name="template" value="phrases"/>
     </binding>
 -->



More information about the Freeswitch-svn mailing list