[Freeswitch-svn] [commit] r14026 - freeswitch/trunk/contrib/ledr/mod_xml_odbc
FreeSWITCH SVN
ledr at freeswitch.org
Mon Jun 29 04:53:30 PDT 2009
Author: ledr
Date: Mon Jun 29 06:53:29 2009
New Revision: 14026
Log:
broken, need backup, am fixing replace_header
Modified:
freeswitch/trunk/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
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 06:53:29 2009
@@ -50,8 +50,67 @@
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;
+ void *new = malloc(len);
+ switch_assert(new);
+
+ return (char *) memcpy(new, s, len);
+}
+
+#ifndef ALLOC
+#define ALLOC(size) malloc(size)
+#endif
+#ifndef DUP
+#define DUP(str) my_dup(str)
+#endif
+#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;
char *configuration_template_name;
@@ -146,6 +205,10 @@
char *name = NULL;
char *value = NULL, *new_value = NULL;
+
+// char *when_key = NULL, *when_val = NULL;
+// char *to_key = NULL, *to_val = NULL;
+
char *empty_result_break_to = NULL;
char *no_template_break_to = NULL;
@@ -156,29 +219,57 @@
/* 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");
- empty_result_break_to = (char *) switch_xml_attr_soft(xml_in, "on-empty-result-break-to");
- no_template_break_to = (char *) switch_xml_attr_soft(xml_in, "on-no-template-break-to");
+
+ no_template_break_to = (char *) switch_xml_attr_soft(xml_in, "on-no-template-break-to"); // THIS DOESN'T WORK YET !!
if (switch_strlen_zero(name)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Ignoring xml-odbc-do because no name attribute is given\n");
goto done;
}
- 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;
- }
+ 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");
- 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 (!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);
+ 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;
+ }
+ new_value = switch_event_expand_headers(params, value);
- 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);
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;
@@ -187,13 +278,15 @@
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);
- } else {
- if (!switch_strlen_zero(empty_result_break_to) && query_helper.rowcount == 0) {
- /* 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", empty_result_break_to);
- goto done;
- }
+ goto done;
+ }
+
+ empty_result_break_to = (char *) switch_xml_attr_soft(xml_in, "on-empty-result-break-to");
+ if (!switch_strlen_zero(empty_result_break_to) && query_helper.rowcount == 0) {
+ /* 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", empty_result_break_to);
+ goto done;
}
} else {
More information about the Freeswitch-svn
mailing list