[Freeswitch-branches] [commit] r3881 - freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql
Author: outcast Date: Mon Jan 1 04:28:22 2007 New Revision: 3881 Added: freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/ freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/Makefile freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/README freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/mod_xml_mysql.c Log: new mod_xml_mysql module. Just testing some stuff. I will have better version soon. Added: freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/Makefile ============================================================================== --- (empty file) +++ freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/Makefile Mon Jan 1 04:28:22 2007 @@ -0,0 +1,20 @@ +FLAGS += $(shell mysql_config --include) +LDFLAGS += $(shell mysql_config --libs) + +all: depends $(MODNAME).$(DYNAMIC_LIB_EXTEN) + +depends: + + + +$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c + $(CC) $(CFLAGS) -fPIC -c $(MODNAME).c -o $(MODNAME).o + $(CC) $(SOLINK) -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(MODNAME).o $(LDFLAGS) + + +clean: + rm -fr *.$(DYNAMIC_LIB_EXTEN) *.o *~ + rm -fr *.$(DYNAMIC_LIB_EXTEN) *.so *~ + +install: + cp -f $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(PREFIX)/mod Added: freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/README ============================================================================== --- (empty file) +++ freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/README Mon Jan 1 04:28:22 2007 @@ -0,0 +1,10 @@ +mod_xml_mysql +----- + + +This is an experimental module that I have written to load Freeswitch's configuration from a MySQL database. It may seem a bit crude. This is my first module for Freeswitch and the first time I have used the MySQL API. I would highly recommend not to use this in production. The database schema currently is not included due to the fact it is lame. I will come up with a better database schema and version of the module hopfully by mid-Jan. If you have any quesitons please email me. + + +Outcast aka James Jones <james@virtualrealmsoftware.com> + + Added: freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/mod_xml_mysql.c ============================================================================== --- (empty file) +++ freeswitch/branches/outcast/src/mod/xml_int/mod_xml_mysql/mod_xml_mysql.c Mon Jan 1 04:28:22 2007 @@ -0,0 +1,219 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com> + * + * 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 <anthmct@yahoo.com> + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Outcast aka James Jones <james@virtualrealmsoftware.com> + * Michael Jerris <mike@jerris.com> + * + * mod_xml_mysql.c -- CURL XML Gateway + * + * Based on mod_xml_curl by Michael Jerris <mike@jerris.com> + */ + + +#include <switch.h> +#include <mysql/mysql.h> + +static const char modname[] = "mod_xml_mysql"; + + +static struct { + char *dbname; + char *bindings; + char *dbuser; + char *dbpass; + char *dbhost; + char *debug; + MYSQL mysql; +} globals; + +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dbname, globals.dbname); +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_bindings, globals.bindings); +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dbuser, globals.dbuser); +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dbpass, globals.dbpass); +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dbhost, globals.dbhost); +SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_debug, globals.debug); + + +static switch_xml_t xml_mysql_fetch(char *section, + char *tag_name, + char *key_name, + char *key_value, + char *params) +{ + char *mysql_section = NULL; + char *mysql_tag_name = NULL; + char *mysql_key_name = NULL; + char *mysql_key_value = NULL; + char *mysql_params = NULL; + char *mysql_xml = NULL; + char mysql_query[1000]; + switch_xml_t xml = NULL; + MYSQL_RES *result; + MYSQL_ROW row; + + if (!((mysql_section = section) && (mysql_tag_name = tag_name) && (mysql_key_name = key_name) && (mysql_key_value = key_value))) { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); + return NULL; + } + + snprintf(mysql_query, sizeof(mysql_query), "SELECT data FROM xml_templates WHERE section = \"%s\" and name = \"%s\"", mysql_section, mysql_key_value); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Built query: %s\nSize: %d\n", mysql_query, sizeof(mysql_query)); + + if(mysql_real_query(&globals.mysql, mysql_query, strlen(mysql_query)) == 0){ + + result = mysql_store_result(&globals.mysql); + if(result){ + + if(mysql_num_fields(result) == 1) { + if(!(row = mysql_fetch_row(result))) { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Database returned an empty result\n"); + return NULL; + } else { + + mysql_xml = strdup(row[0]); + } + } else { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Incorrect amount of fields retrived please check MySQL query.\n"); + return NULL; + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No records found for %s in database\n", mysql_key_value); + return NULL; + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Mysql Error: %s\n", mysql_error(&globals.mysql)); + return NULL; + } + + if(mysql_query == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Database returned a null value\n"); + return NULL; + } + + if (!(xml = switch_xml_parse_str(mysql_xml, strlen(mysql_xml)))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result!\n"); + } + mysql_free_result(result); + return xml; +} + + +static switch_loadable_module_interface_t xml_mysql_module_interface = { + /*.module_name */ modname, + /*.endpoint_interface */ NULL, + /*.timer_interface */ NULL, + /*.dialplan_interface */ NULL, + /*.codec_interface */ NULL, + /*.application_interface */ NULL, + /*.api_interface */ NULL, + /*.file_interface */ NULL, + /*.speech_interface */ NULL, + /*.directory_interface */ NULL +}; + +static switch_status_t do_config(void) +{ + char *cf = "xml_mysql.conf"; + switch_xml_t cfg, xml, settings, param; + + 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 = switch_xml_child(cfg, "settings"))) { + for (param = switch_xml_child(settings, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + + if (!strcasecmp(var, "dbname")) { + char *bindings = (char *) switch_xml_attr_soft(param, "bindings"); + set_global_bindings(bindings); + set_global_dbname(val); + } else if (!strcasecmp(var, "dbhost")) { + set_global_dbhost(val); + } else if (!strcasecmp(var, "dbuser")) { + set_global_dbuser(val); + } else if (!strcasecmp(var, "dbpass")) { + set_global_dbpass(val); + } else if (!strcasecmp(var, "dbdebug")) { + set_global_debug(val); + } + } + } + + switch_xml_free(xml); + + return globals.dbname ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; +} + + +SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename) +{ + /* connect my internal structure to the blank pointer passed to me */ + *module_interface = &xml_mysql_module_interface; + + if (do_config() == SWITCH_STATUS_SUCCESS) { + if(mysql_init(&globals.mysql)==NULL) { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to iniate MySQL Connection\n"); + return SWITCH_STATUS_FALSE; + } + + if (!mysql_real_connect(&globals.mysql,globals.dbhost, globals.dbuser, globals.dbpass, globals.dbname,0,NULL,0)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to connect to Database: %s @ %s\n", globals.dbname, globals.dbhost); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Binding MySQL Fetch Function [%s] [%s]\n", + globals.dbname, globals.bindings ? globals.bindings : "all"); + switch_xml_bind_search_function(xml_mysql_fetch, switch_xml_parse_section_string(globals.bindings)); + } else { + return SWITCH_STATUS_FALSE; + } + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void) +{ + mysql_close(&globals.mysql); + return SWITCH_STATUS_SUCCESS; +} + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:nil + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: + */
participants (1)
-
Freeswitch SVN