[Freeswitch-trunk] [commit] r13846 - freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc
FreeSWITCH SVN
ledr at freeswitch.org
Thu Jun 18 11:34:10 PDT 2009
Author: ledr
Date: Thu Jun 18 13:34:09 2009
New Revision: 13846
Log:
Initial commit
Added:
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/Makefile
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/structure.sql
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/test_data.sql
freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml
Added: freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/Makefile
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/Makefile Thu Jun 18 13:34:09 2009
@@ -0,0 +1,3 @@
+BASE=../../../..
+include $(BASE)/build/modmake.rules
+LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
Added: freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/mod_xml_odbc.c Thu Jun 18 13:34:09 2009
@@ -0,0 +1,468 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2009, Anthony Minessale II <anthm at freeswitch.org>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthm at freeswitch.org>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Anthony Minessale II <anthm at freeswitch.org>
+ * Other FreeSWITCH module contributors that I borrowed code from
+ * Leon de Rooij <leon at scarlet-internet.nl>
+ *
+ *
+ * mod_xml_odbc.c -- use fs odbc to realtime create xml directory
+ * perhaps later also config, dialplan, etc ?
+ *
+ */
+#include <switch.h>
+#ifdef SWITCH_HAVE_ODBC
+#include <switch_odbc.h>
+#endif
+
+typedef enum {
+ XML_ODBC_DIRECTORY
+} xml_odbc_query_type_t;
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_odbc_shutdown);
+SWITCH_MODULE_DEFINITION(mod_xml_odbc, mod_xml_odbc_load, mod_xml_odbc_shutdown, NULL);
+
+typedef struct xml_binding {
+ char *bindings;
+} xml_binding_t;
+
+static struct {
+ char *dbname;
+ char *odbc_dsn;
+ char *query_domain_key_user;
+ char *query_domain_params;
+ char *query_domain_variables;
+ char *query_user_attrs;
+ char *query_user_params;
+ char *query_user_variables;
+ char *query_groups;
+ switch_mutex_t *mutex;
+ switch_memory_pool_t *pool;
+#ifdef SWITCH_HAVE_ODBC
+ switch_odbc_handle_t *master_odbc;
+#else
+ void *filler1;
+#endif
+} globals;
+
+typedef struct did_uid_helper {
+ char *domain_id;
+ char *user_id;
+} did_uid_helper_t;
+
+static int did_uid_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ did_uid_helper_t *h = (did_uid_helper_t *) pArg;
+
+ h->domain_id = strdup(argv[0]);
+ h->user_id = strdup(argv[1]);
+
+ return 0;
+}
+
+static int set_xml_attr_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ switch_xml_t *xml = (switch_xml_t *) pArg;
+ switch_xml_set_attr_d(*xml, argv[0], argv[1]);
+ return 0;
+}
+
+typedef struct xml_helper {
+ switch_xml_t xml;
+ char *str;
+ int off;
+} xml_helper_t;
+
+static int add_xml_child_with_nvpair_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ xml_helper_t *h = (xml_helper_t *) pArg;
+ switch_xml_t xml = NULL;
+
+ if ((xml = switch_xml_add_child_d(h->xml, h->str, h->off++))) {
+ switch_xml_set_attr_d(xml, "name", argv[0]);
+ switch_xml_set_attr_d(xml, "value", argv[1]);
+ }
+
+ return 0;
+}
+
+static int add_xml_group_and_user_callback(void *pArg, int argc, char **argv, char **columnName)
+{
+ xml_helper_t *h = (xml_helper_t *) pArg;
+ switch_xml_t xml = NULL;
+
+ if ((xml = switch_xml_add_child_d(h->xml, "group", h->off++))) {
+ switch_xml_set_attr_d(xml, "name", argv[0]);
+ if ((xml = switch_xml_add_child_d(xml, "users", h->off++))) {
+ if ((xml = switch_xml_add_child_d(xml, "user", h->off++))) {
+ switch_xml_set_attr_d(xml, "id", h->str);
+ switch_xml_set_attr_d(xml, "type", "pointer");
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int xml_odbc_result_not_found(switch_xml_t xml, int *off)
+{
+ switch_xml_t sub = NULL;
+
+ if ((sub = switch_xml_add_child_d(xml, "section", *off++))) {
+ switch_xml_set_attr_d(sub, "name", "result");
+ if ((sub = switch_xml_add_child_d(sub, "result", *off++))) {
+ switch_xml_set_attr_d(sub, "status", "not found");
+ }
+ }
+
+ return 0;
+}
+
+static switch_xml_t xml_odbc_search(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data)
+{
+ xml_binding_t *binding = (xml_binding_t *) user_data;
+ switch_event_header_t *hi;
+
+ switch_xml_t xml = NULL, sub = NULL, sub2 = NULL, sub3 = NULL;
+
+ char *dir_user = NULL, *dir_domain = NULL, *dir_key = NULL;
+ char *sql;
+
+ int off = 0, ret = 1;
+
+ xml_odbc_query_type_t query_type;
+
+ did_uid_helper_t pdata;
+ xml_helper_t pdata2;
+
+ if (!binding) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No bindings... sorry bud returning now\n");
+ return NULL;
+ }
+
+ if (!strcmp(section, "directory")) {
+ query_type = XML_ODBC_DIRECTORY;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid section\n");
+ return NULL;
+ }
+
+ if (params) {
+ if ((hi = params->headers)) {
+ for (; hi; hi = hi->next) {
+ switch (query_type) {
+ case XML_ODBC_DIRECTORY:
+
+//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG in xml_odbc_search with header name=[%s], value=[%s]\n", hi->name, hi->value);
+
+ if (!strcmp(hi->name, "user")) {
+ dir_user = strdup(hi->value);
+ } else if (!strcmp(hi->name, "domain")) {
+ dir_domain = strdup(hi->value);
+ } else if (!strcmp(hi->name, "key")) {
+ dir_key = strdup(hi->value);
+ }
+ break;
+ }
+ }
+ switch (query_type) {
+ case XML_ODBC_DIRECTORY:
+ //if (dir_user && dir_domain) {
+ if (dir_domain) {
+ if ((xml = switch_xml_new("document"))) {
+ switch_xml_set_attr_d(xml, "type", "freeswitch/xml");
+
+ if (!dir_user) {
+// sql = switch_mprintf("SELECT count(*) FROM dir_domains WHERE name = '%q';", dir_domain);
+// if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, count_callback, &pdata10741) == SWITCH_ODBC_SUCCESS) {
+// TODO: Factor out the domain search thing (with params and variables) from below, and call it from here as well..
+// xml_odbc_result_not_found(xml, &off);
+// } else {
+ xml_odbc_result_not_found(xml, &off);
+// }
+
+ } else {
+ sql = switch_mprintf(globals.query_domain_key_user, dir_domain, dir_key, dir_user);
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, did_uid_callback, &pdata) == SWITCH_ODBC_SUCCESS) {
+ if (!pdata.domain_id || !pdata.user_id) {
+ xml_odbc_result_not_found(xml, &off);
+
+ } else {
+ if ((sub = switch_xml_add_child_d(xml, "section", off++))) {
+ switch_xml_set_attr_d(sub, "name", "directory");
+
+ if ((sub = switch_xml_add_child_d(sub, "domain", off++))) {
+ switch_xml_set_attr_d(sub, "name", dir_domain);
+
+ if ((sub2 = switch_xml_add_child_d(sub, "params", off++))) {
+ sql = switch_mprintf(globals.query_domain_params, pdata.domain_id);
+ pdata2.xml = sub2;
+ pdata2.off = off;
+ pdata2.str = "param";
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
+ }
+ }
+
+ if ((sub2 = switch_xml_add_child_d(sub, "variables", off++))) {
+ sql = switch_mprintf(globals.query_domain_variables, pdata.domain_id);
+ pdata2.xml = sub2;
+ pdata2.off = off;
+ pdata2.str = "variable";
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
+ }
+ }
+
+ if ((sub = switch_xml_add_child_d(sub, "groups", off++))) {
+
+ if ((sub2 = switch_xml_add_child_d(sub, "group", off++))) {
+ switch_xml_set_attr_d(sub2, "name", "default");
+
+ if ((sub2 = switch_xml_add_child_d(sub2, "users", off++))) {
+
+ if ((sub2 = switch_xml_add_child_d(sub2, "user", off++))) {
+
+ sql = switch_mprintf(globals.query_user_attrs, pdata.user_id);
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, set_xml_attr_callback, &sub2)) {
+ }
+
+ if ((sub3 = switch_xml_add_child_d(sub2, "params", off++))) {
+ sql = switch_mprintf(globals.query_user_params, pdata.user_id);
+ pdata2.xml = sub3;
+ pdata2.off = off;
+ pdata2.str = "param";
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
+ }
+ }
+
+ if ((sub3 = switch_xml_add_child_d(sub2, "variables", off++))) {
+ sql = switch_mprintf(globals.query_user_variables, pdata.user_id);
+ pdata2.xml = sub3;
+ pdata2.off = off;
+ pdata2.str = "variable";
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ sql = switch_mprintf(globals.query_groups, pdata.user_id);
+ pdata2.xml = sub;
+ pdata2.off = off;
+ pdata2.str = dir_user;
+ if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_group_and_user_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG DUMP OF XML GENERATED:\n\n%s\n\n", switch_xml_toxml(xml, SWITCH_FALSE));
+
+ free(dir_user);
+ dir_user = NULL;
+
+ free(dir_key);
+ dir_key = NULL;
+
+ free(dir_domain);
+ dir_domain = NULL;
+
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
+ "Something bad happened during the query construction phase likely exten(%s) or domain(%s) is null\n", dir_user, dir_domain);
+ goto cleanup;
+
+ }
+ break;
+ }
+
+ } else {
+ goto cleanup;
+
+ }
+ }
+
+ ret = 0;
+
+ cleanup:
+
+ if (ret) {
+ switch_xml_free(xml);
+ return NULL;
+ }
+
+ return xml;
+}
+
+static switch_status_t do_config()
+{
+ char *cf = "xml_odbc.conf";
+ switch_xml_t cfg, xml, bindings_tag, binding_tag, param;
+ xml_binding_t *binding = NULL;
+
+ //switch_core_db_t *db;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ char *odbc_user = NULL;
+ char *odbc_pass = NULL;
+ char *sql = NULL;
+
+ 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 (!(bindings_tag = switch_xml_child(cfg, "bindings"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing <bindings> tag!\n");
+ goto done;
+ }
+
+ 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");
+
+ for (param = switch_xml_child(binding_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");
+
+ 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';
+ }
+ }
+ } else if (!strcasecmp(var, "query-domain-key-user") && !switch_strlen_zero(val)) {
+ globals.query_domain_key_user = strdup(val);
+ } else if (!strcasecmp(var, "query-domain-params") && !switch_strlen_zero(val)) {
+ globals.query_domain_params = strdup(val);
+ } else if (!strcasecmp(var, "query-domain-variables") && !switch_strlen_zero(val)) {
+ globals.query_domain_variables = strdup(val);
+ } else if (!strcasecmp(var, "query-user-attrs") && !switch_strlen_zero(val)) {
+ globals.query_user_attrs = strdup(val);
+ } else if (!strcasecmp(var, "query-user-params") && !switch_strlen_zero(val)) {
+ globals.query_user_params = strdup(val);
+ } else if (!strcasecmp(var, "query-user-variables") && !switch_strlen_zero(val)) {
+ globals.query_user_variables = strdup(val);
+ } else if (!strcasecmp(var, "query-groups") && !switch_strlen_zero(val)) {
+ globals.query_groups = strdup(val);
+ }
+ }
+
+ if (switch_strlen_zero(globals.odbc_dsn) || switch_strlen_zero(odbc_user) || switch_strlen_zero(odbc_pass)) {
+ globals.dbname = "xml_odbc";
+ }
+
+ if (!(binding = malloc(sizeof(*binding)))) {
+ goto done;
+ }
+ memset(binding, 0, sizeof(*binding));
+
+ 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_xml_bind_search_function(xml_odbc_search, switch_xml_parse_section_string(bname), binding);
+ binding = NULL;
+ }
+
+#ifdef SWITCH_HAVE_ODBC
+ if (globals.odbc_dsn) {
+
+ if (!(globals.master_odbc = switch_odbc_handle_new(globals.odbc_dsn, odbc_user, odbc_pass))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
+
+ if (switch_odbc_handle_connect(globals.master_odbc) != SWITCH_ODBC_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", globals.odbc_dsn);
+ }
+#endif
+
+ done:
+
+ switch_safe_free(sql);
+
+ return status;
+}
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load)
+{
+
+ switch_core_new_memory_pool(&globals.pool);
+ switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool);
+
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+#ifndef SWITCH_HAVE_ODBC
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "You must have ODBC support in FreeSWITCH to use this module\n");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "\t./configure --enable-core-odbc-support\n");
+ return SWITCH_STATUS_FALSE;
+#endif
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "XML ODBC module loading...\n");
+
+ 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;
+ }
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_odbc_shutdown)
+{
+ return SWITCH_STATUS_SUCCESS;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ */
Added: freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/structure.sql
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/structure.sql Thu Jun 18 13:34:09 2009
@@ -0,0 +1,73 @@
+CREATE TABLE `dir_domains` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `dir_domains_name` (`name`)
+);
+
+CREATE TABLE `dir_domain_params` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_domain_id` INT NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `value` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_domain_id`) REFERENCES `dir_domains` (`id`)
+);
+
+CREATE TABLE `dir_domain_variables` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_domain_id` INT NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `value` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_domain_id`) REFERENCES `dir_domains` (`id`)
+);
+
+CREATE TABLE `dir_groups` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`)
+);
+
+CREATE TABLE `dir_groups_users` (
+ `dir_group_id` INT NOT NULL,
+ `dir_user_id` INT NOT NULL,
+ FOREIGN KEY (`dir_group_id`) REFERENCES `dir_groups` (`id`),
+ FOREIGN KEY (`dir_user_id`) REFERENCES `dir_users` (`id`)
+);
+
+CREATE TABLE `dir_users` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_domain_id` INT NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_domain_id`) REFERENCES `dir_domains` (`id`)
+);
+
+CREATE TABLE `dir_user_attrs` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_user_id` INT NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `value` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_user_id`) REFERENCES `dir_users` (`id`),
+ KEY `dir_user_attrs_name` (`name`),
+ KEY `dir_user_attrs_value` (`value`)
+);
+
+CREATE TABLE `dir_user_params` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_user_id` INT NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `value` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_user_id`) REFERENCES `dir_users` (`id`)
+);
+
+CREATE TABLE `dir_user_variables` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `dir_user_id` INT NOT NULL,
+ `name` VARCHAR(255) NOT NULL,
+ `value` VARCHAR(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`dir_user_id`) REFERENCES `dir_users` (`id`)
+);
Added: freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/test_data.sql
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/test_data.sql Thu Jun 18 13:34:09 2009
@@ -0,0 +1,9 @@
+INSERT INTO `dir_domains` (`id`, `name`) VALUES (1, '172.31.0.76');
+INSERT INTO `dir_domain_params` (`id`, `dir_domain_id`, `name`, `value`) VALUES (1, 1, 'dom_param_name', 'dom_param_value');
+INSERT INTO `dir_domain_variables` (`id`, `dir_domain_id`, `name`, `value`) VALUES (1, 1, 'dom_variable_name', 'dom_variable_value');
+INSERT INTO `dir_groups` (`id`, `name`) VALUES (1, 'prepay'), (2, 'annoying_customers');
+INSERT INTO `dir_groups_users` (`dir_group_id`, `dir_user_id`) VALUES (1, 1), (2, 1);
+INSERT INTO `dir_users` (`id`, `dir_domain_id`) VALUES (1, 1);
+INSERT INTO `dir_user_attrs` (`id`, `dir_user_id`, `name`, `value`) VALUES (1, 1, 'id', 'someuser'), (2, 1, 'mailbox', '1234');
+INSERT INTO `dir_user_params` (`id`, `dir_user_id`, `name`, `value`) VALUES (1, 1, 'password', 'topsecret'), (2, 1, 'vm-password', '0000');
+INSERT INTO `dir_user_variables` (`id`, `dir_user_id`, `name`, `value`) VALUES (1, 1, 'accountcode', '1234'), (2, 1, 'user_context', 'default'), (3, 1, 'vm_extension', '1234');
Added: freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/ledr/mod_xml_odbc/xml_odbc.conf.xml Thu Jun 18 13:34:09 2009
@@ -0,0 +1,35 @@
+<configuration name="xml_odbc.conf" description="XML ODBC Configuration">
+ <bindings>
+ <binding name="directory">
+ <param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
+
+ <param name="query-domain-key-user" value="SELECT
+ dir_domains.id AS domain_id,
+ dir_users.id AS user_id
+ FROM
+ dir_domains,
+ dir_users,
+ dir_user_attrs
+ WHERE
+ dir_domains.name = '%q' AND
+ dir_user_attrs.name = '%q' AND
+ dir_user_attrs.value = '%q' AND
+ dir_domains.id = dir_users.dir_domain_id AND
+ dir_users.id = dir_user_attrs.dir_user_id;"/>
+
+ <param name="query-domain-params" value="SELECT name, value FROM dir_domain_params WHERE dir_domain_id = '%q';"/>
+
+ <param name="query-domain-variables" value="SELECT name, value FROM dir_domain_variables WHERE dir_domain_id = '%q';"/>
+
+ <param name="query-user-attrs" value="SELECT name, value FROM dir_user_attrs WHERE dir_user_id = '%q';"/>
+
+ <param name="query-user-params" value="SELECT name, value FROM dir_user_params WHERE dir_user_id = '%q';"/>
+
+ <param name="query-user-variables" value="SELECT name, value FROM dir_user_variables WHERE dir_user_id = '%q';"/>
+
+ <param name="query-groups" value="SELECT dir_groups.name FROM dir_groups, dir_groups_users
+ WHERE dir_groups_users.dir_user_id = '%q' AND dir_groups_users.dir_group_id = dir_groups.id;"/>
+
+ </binding>
+ </bindings>
+</configuration>
More information about the Freeswitch-trunk
mailing list