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> -->