[Freeswitch-svn] [commit] r14027 - in freeswitch/trunk/contrib/ledr/mod_xml_odbc: . xml_odbc_templates

FreeSWITCH SVN ledr at freeswitch.org
Mon Jun 29 05:45:45 PDT 2009


Author: ledr
Date: Mon Jun 29 07:45:44 2009
New Revision: 14027

Log:
added xml-odbc-do name="replace_header_value" to translate for example key=id to key=username when db column name differs


Modified:
   freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
   freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory.xml
   freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory_swk.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	Mon Jun 29 07:45:44 2009
@@ -50,6 +50,8 @@
 static switch_status_t xml_odbc_render_template(char *template, switch_event_t *params, switch_xml_t xml_out, int *off);
 static switch_status_t xml_odbc_render_tag(switch_xml_t xml_in, switch_event_t *params, switch_xml_t xml_out, int *off);
 
+
+/*
 static char *my_dup(const char *s)
 {
     size_t len = strlen(s) + 1;
@@ -68,48 +70,11 @@
 #ifndef FREE
 #define FREE(ptr) switch_safe_free(ptr)
 #endif
+*/
 
 
 #define XML_ODBC_SYNTAX "[debug_on|debug_off|render_template]"
 
-/* replace all headers in event with new_header_name AND/OR new_header_value, where header_name AND/OR header_value match */
-static switch_status_t switch_event_replace_header(switch_event_t *event, const char *header_name, const char *header_value, char *new_header_name, char *new_header_value)
-{
-	switch_event_header_t *hp;
-	switch_ssize_t hlen = -1, new_hlen = -1;
-	unsigned long hash = 0, new_hash = 0;
-	switch_status_t status = SWITCH_STATUS_FALSE;
-
-	switch_assert(event);
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "INSIDE switch_event_replace_header header_name[%s] header_value[%s] new_header_name[%s] new_header_value[%s]\n", header_name, header_value, new_header_name, new_header_value);
-
-	if (!header_name && !header_value) return status;
-	if (!new_header_name && !new_header_value) return status;
-
-	hash = switch_ci_hashfunc_default(header_name, &hlen);
-
-	for (hp = event->headers; hp; hp = hp->next) {
-		if ( (!hp->hash || hash == hp->hash) && !(header_name && strcasecmp(hp->name, header_name)) && !(header_value && strcasecmp(hp->value, header_value)) ) {
-
-			if (new_header_name) {
-				FREE(hp->name);
-				hp->name = DUP(new_header_name);
-				new_hash = switch_ci_hashfunc_default(new_header_name, &new_hlen);
-				hp->hash = new_hash;
-			}
-
-			if (new_header_value) {
-				FREE(hp->value);
-				hp->value = new_header_value;
-			}
-
-			status = SWITCH_STATUS_SUCCESS;
-		}
-	}
-	return status;
-}
-
 
 static struct {
 	char *odbc_dsn;
@@ -206,8 +171,7 @@
 	char *name = NULL;
 	char *value = NULL, *new_value = NULL;
 
-//	char *when_key = NULL, *when_val = NULL;
-//	char *to_key = NULL, *to_val = NULL;
+	char *when_name = NULL, *when_value = NULL;
 
 	char *empty_result_break_to = NULL;
 	char *no_template_break_to = NULL;
@@ -219,6 +183,7 @@
 	/* special case xml-odbc-do - this tag is not copied, but action is done */
 	if (!strcasecmp(xml_in->name, "xml-odbc-do")) {
 		name = (char *) switch_xml_attr_soft(xml_in, "name");
+		value = (char *) switch_xml_attr_soft(xml_in, "value");
 
 		no_template_break_to = (char *) switch_xml_attr_soft(xml_in, "on-no-template-break-to"); // THIS DOESN'T WORK YET !!
 
@@ -227,55 +192,51 @@
 			goto done;
 		}
 
-		if (!strcasecmp(name, "replace_header")) {
-			char *when_key = (char *) switch_xml_attr(xml_in, "when-key");			
-			char *when_val = (char *) switch_xml_attr(xml_in, "when-val");			
-			char *to_key = (char *) switch_xml_attr(xml_in, "to-key");			
-			char *to_val = (char *) switch_xml_attr(xml_in, "to-val");			
+		if (switch_strlen_zero(value)) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no value attr is given\n", name);
+			goto done;
+		}
+		new_value = switch_event_expand_headers(params, value);
 
-			if (!when_key && !when_val) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no when-key AND no when-val are given\n", name);
-				goto done;
-			}
+		if (!strcasecmp(name, "replace_header_value")) {
+			/* replace a header value when when_name AND/OR when_value matches */
+
+			when_name = (char *) switch_xml_attr_soft(xml_in, "when-name");			
+			when_value = (char *) switch_xml_attr_soft(xml_in, "when-value");			
 
-			if (!to_key && !to_val) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no to-key AND no to-val are given\n", name);
+			if (switch_strlen_zero(when_name)) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no when-name is given\n", name);
 				goto done;
 			}
 
-			switch_event_replace_header(params, when_key, when_val, to_key, to_val);
-			//switch_event_replace_header(params, NULL, NULL, NULL, NULL);
-			
-		} else if (!strcasecmp(name, "break-to")) {
-
-			value = (char *) switch_xml_attr_soft(xml_in, "value");
-			if (switch_strlen_zero(value)) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no value attr is given\n", name);
-				goto done;
+			char *old_header_value = NULL;
+			if ((old_header_value = switch_event_get_header(params, when_name))) {
+				if (switch_strlen_zero(when_value) || !strcasecmp(when_value, old_header_value)) {
+					switch_event_del_header(params, when_name);
+					switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, when_name, new_value);
+				}
 			}
-			new_value = switch_event_expand_headers(params, value);
 
+		} else if (!strcasecmp(name, "break-to")) {
 			/* set a next_template header so xml_odbc_render_template breaks the loop and starts over with a new template */
+
 			switch_event_del_header(params, "next_template_name");
-			switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "next_template_name", value);
+			switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "next_template_name", new_value);
 			goto done;
 
 		} else if (!strcasecmp(name, "query")) {
-
-			value = (char *) switch_xml_attr_soft(xml_in, "value");
-			if (switch_strlen_zero(value)) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do name=[%s] because no value attr is given\n", name);
-				goto done;
-			}
-			new_value = switch_event_expand_headers(params, value);
-
 			/* create query_helper that is given to callback function on each returned row */
+
 			query_helper.xml_in = xml_in;
 			query_helper.xml_out = xml_out;
 			query_helper.off = off;
 			query_helper.params = params;
 			query_helper.rowcount = 0;
 
+			if (debug == SWITCH_TRUE) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG Performing Query:\n%s\n", new_value);
+			}
+
 			if (switch_odbc_handle_callback_exec(globals.master_odbc, new_value, xml_odbc_query_callback, &query_helper) != SWITCH_ODBC_SUCCESS) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error running this query: [%s]\n", new_value);
 				goto done;

Modified: freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory.xml
==============================================================================
--- freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory.xml	(original)
+++ freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory.xml	Mon Jun 29 07:45:44 2009
@@ -1,6 +1,7 @@
 <include>
   <template name="directory">
     <document type="freeswitch/xml">
+      <xml-odbc-do name="replace_header_value" when-name="key" when-value="id" value="username"/>
       <xml-odbc-do name="query" on-empty-result-break-to="not_found" value="
         SELECT
           dir_domains.id AS domain_id,

Modified: freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory_swk.xml
==============================================================================
--- freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory_swk.xml	(original)
+++ freeswitch/trunk/contrib/ledr/mod_xml_odbc/xml_odbc_templates/directory_swk.xml	Mon Jun 29 07:45:44 2009
@@ -1,6 +1,7 @@
 <include>
   <template name="directory_swk" description="based on swk's shipment sql">
     <document type="freeswitch/xml">
+      <xml-odbc-do name="replace_header_value" when-name="key" when-value="id" value="username"/>
       <xml-odbc-do name="query" on-empty-result-break-to="not_found" value="
         SELECT
           domains.uid AS domains_uid,
@@ -11,7 +12,7 @@
           domains,
           users
         WHERE
-          users.username = '${user}' AND
+          users.${key} = '${user}' AND
           domains.name = '${domain}' AND
           users.domains_uid = domains.uid AND
           domains.enabled = '1' AND



More information about the Freeswitch-svn mailing list