src/switch_xml_config.c\
src/switch_config.c\
src/switch_time.c\
+src/switch_odbc.c \
libs/stfu/stfu.c\
src/switch_cpp.cpp\
src/g711.c\
if ADD_ODBC
CORE_CFLAGS += -DSWITCH_HAVE_ODBC $(ODBC_INC_FLAGS)
-libfreeswitch_la_SOURCES += src/switch_odbc.c
libfreeswitch_la_LDFLAGS += $(ODBC_LIB_FLAGS)
endif
#include "switch_scheduler.h"
#include "switch_config.h"
#include "switch_nat.h"
+#include "switch_odbc.h"
+
#include <libteletone.h>
/** \mainpage FreeSWITCH
#define SWITCH_ODBC_H
#include <switch.h>
-#include <sql.h>
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:4201)
-#include <sqlext.h>
-#pragma warning(pop)
-#else
-#include <sqlext.h>
-#endif
-#include <sqltypes.h>
-SWITCH_BEGIN_EXTERN_C struct switch_odbc_handle;
+SWITCH_BEGIN_EXTERN_C
+
+struct switch_odbc_handle;
+typedef void * switch_odbc_statement_handle_t;
typedef enum {
SWITCH_ODBC_STATE_INIT,
SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_connect(switch_odbc_handle_t *handle);
SWITCH_DECLARE(void) switch_odbc_handle_destroy(switch_odbc_handle_t **handlep);
SWITCH_DECLARE(switch_odbc_state_t) switch_odbc_handle_get_state(switch_odbc_handle_t *handle);
-SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_t *handle, char *sql, SQLHSTMT * rstmt);
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_t *handle, char *sql, switch_odbc_statement_handle_t * rstmt);
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec_string(switch_odbc_handle_t *handle,
+ char *sql,
+ char *resbuf,
+ size_t len);
+SWITCH_DECLARE(switch_bool_t) switch_odbc_available(void);
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_statement_handle_free(switch_odbc_statement_handle_t * stmt);
/*!
\brief Execute the sql query and issue a callback for each row returned
handle, sql, callback, pdata)
-SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, SQLHSTMT stmt);
+SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, switch_odbc_statement_handle_t stmt);
SWITCH_END_EXTERN_C
#endif
/* For Emacs:
typedef struct switch_network_list switch_network_list_t;
-#define SWITCH_API_VERSION 3
+#define SWITCH_API_VERSION 4
#define SWITCH_MODULE_LOAD_ARGS (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)
#define SWITCH_MODULE_RUNTIME_ARGS (void)
#define SWITCH_MODULE_SHUTDOWN_ARGS (void)
WANT_CURL=yes
-
BASE=../../../..
include $(BASE)/build/modmake.rules
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
+
*/
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
#include <curl/curl.h>
/* Prototypes */
char *odbc_dsn;
char *sql;
-#ifdef SWITCH_HAVE_ODBC
switch_mutex_t *db_mutex;
-#else
- void *filler1;
-#endif
switch_memory_pool_t *pool;
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
-#else
- void *filler2;
-#endif
} globals;
-#ifdef SWITCH_HAVE_ODBC
-struct odbc_obj {
- switch_odbc_handle_t *handle;
- SQLHSTMT stmt;
- SQLCHAR *colbuf;
- int32_t cblen;
- SQLCHAR *code;
- int32_t codelen;
-};
-
-typedef struct odbc_obj odbc_obj_t;
-typedef odbc_obj_t *odbc_handle;
-#endif
-
struct http_data {
switch_stream_handle_t stream;
switch_size_t bytes;
static switch_status_t config_callback_dsn(switch_xml_config_item_t *data, const char *newvalue, switch_config_callback_type_t callback_type, switch_bool_t changed)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
-#ifdef SWITCH_HAVE_ODBC
char *odbc_user = NULL;
char *odbc_pass = NULL;
char *odbc_dsn = NULL;
switch_odbc_handle_t *odbc = NULL;
+ if (!switch_odbc_available()) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC is not compiled in. Do not configure odbc-dsn parameter!\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
if (globals.db_mutex) {
switch_mutex_lock(globals.db_mutex);
}
}
switch_goto_status(SWITCH_STATUS_SUCCESS, done);
-#else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC is not compiled in. Do not configure odbc-dsn parameter!\n");
- switch_goto_status(SWITCH_STATUS_FALSE, done);
-#endif
done:
-#ifdef SWITCH_HAVE_ODBC
if (globals.db_mutex) {
switch_mutex_unlock(globals.db_mutex);
}
switch_safe_free(odbc_dsn);
-#endif
return status;
}
do_config(SWITCH_TRUE);
}
-#ifdef SWITCH_HAVE_ODBC
static switch_bool_t cidlookup_execute_sql_callback(char *sql, switch_core_db_callback_func_t callback, void *pdata)
{
switch_bool_t retval = SWITCH_FALSE;
return SWITCH_STATUS_SUCCESS;
}
-#endif
/* make a new string with digits only */
static char *string_digitsonly(switch_memory_pool_t *pool, const char *str)
return name;
}
-#ifdef SWITCH_HAVE_ODBC
static char *do_db_lookup(switch_memory_pool_t *pool, switch_event_t *event, const char *num) {
char *name = NULL;
char *newsql = NULL;
}
return name;
}
-#endif
static char *do_lookup(switch_memory_pool_t *pool, switch_event_t *event, const char *num, switch_bool_t skipurl) {
char *number = NULL;
number = string_digitsonly(pool, num);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "caller_id_number", number);
-#ifdef SWITCH_HAVE_ODBC
/* database always wins */
- if (globals.master_odbc && globals.sql) {
+ if (switch_odbc_available() && globals.master_odbc && globals.sql) {
name = do_db_lookup(pool, event, number);
}
-#endif
+
if (!name && globals.url) {
if (globals.cache) {
name = check_cache(pool, number);
stream->write_function(stream, " odbc-dsn: %s\n sql: %s\n",
globals.odbc_dsn,
globals.sql);
-#ifdef SWITCH_HAVE_ODBC
- stream->write_function(stream, " ODBC Compiled: true\n");
-#else
- stream->write_function(stream, " ODBC Compiled: false\n");
-#endif
+ stream->write_function(stream, " ODBC Compiled: %s\n", switch_odbc_available() ? "true" : "false");
switch_goto_status(SWITCH_STATUS_SUCCESS, done);
}
globals.pool = pool;
-#ifdef SWITCH_HAVE_ODBC
- if (!globals.db_mutex) {
+ if (switch_odbc_available() && !globals.db_mutex) {
if (switch_mutex_init(&globals.db_mutex, SWITCH_MUTEX_UNNESTED, globals.pool) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to initialize db_mutex\n");
}
}
-#endif
do_config(SWITCH_FALSE);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cidlookup_shutdown)
{
/* Cleanup dynamically allocated config settings */
-#ifdef SWITCH_HAVE_ODBC
+
if (globals.db_mutex) {
switch_mutex_destroy(globals.db_mutex);
}
switch_odbc_handle_disconnect(globals.master_odbc);
switch_odbc_handle_destroy(&globals.master_odbc);
}
-#endif
+
switch_event_unbind(&reload_xml_event);
return SWITCH_STATUS_SUCCESS;
}
+++ /dev/null
-BASE=../../../..
-include $(BASE)/build/modmake.rules
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
-
typedef struct easyroute_results{
char limit[16];
char dialstring[256];
char *default_gateway;
switch_mutex_t *mutex;
char *custom_query;
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
-#else
- void *filler1;
-#endif
} globals;
SWITCH_MODULE_LOAD_FUNCTION(mod_easyroute_load);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_default_gateway, globals.default_gateway);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_custom_query, globals.custom_query);
-#ifdef SWITCH_HAVE_ODBC
static int route_callback(void *pArg, int argc, char **argv, char **columnNames)
{
route_callback_t *cbt = (route_callback_t *) pArg;
return 0;
}
-#endif
static switch_status_t load_config(void)
{
set_global_db_dsn("easyroute");
}
-
-#ifdef SWITCH_HAVE_ODBC
- if (globals.db_dsn) {
+ if (switch_odbc_available() && globals.db_dsn) {
if (!(globals.master_odbc = switch_odbc_handle_new(globals.db_dsn, globals.db_username, globals.db_password))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
status = SWITCH_STATUS_FALSE;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot find SQL Database! (Where\'s the gateways table\?\?)\n");
}
}
- } else {
-#endif
+ } else if (globals.db_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Connection (did you enable it?!)\n");
-#ifdef SWITCH_HAVE_ODBC
}
reallydone:
-#endif
if (xml) {
switch_xml_free(xml);
}
return status;
}
-#ifdef SWITCH_HAVE_ODBC
static char SQL_LOOKUP[] = "SELECT gateways.gateway_ip, gateways.group, gateways.limit, gateways.techprofile, numbers.acctcode, numbers.translated from gateways, numbers where numbers.number = '%q' and numbers.gateway_id = gateways.gateway_id limit 1;";
-#endif
static switch_status_t route_lookup(char *dn, easyroute_results_t *results, int noat, char *seperator)
{
switch_status_t sstatus = SWITCH_STATUS_SUCCESS;
-#ifdef SWITCH_HAVE_ODBC
char *sql = NULL;
route_callback_t pdata;
+ if (!switch_odbc_available()) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
+ "mod_easyroute requires core ODBC support. Please refer to the documentation on how to enable this\n");
+ return sstatus;
+ }
+
memset(&pdata, 0, sizeof(pdata));
if (!globals.custom_query){
sql = switch_mprintf(SQL_LOOKUP, dn);
}
switch_safe_free(sql);
-#else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "mod_easyroute requires core ODBC support. Please refer to the documentation on how to enable this\n");
-#endif
if (globals.mutex){
switch_mutex_unlock(globals.mutex);
goto done;
}
-#ifndef SWITCH_HAVE_ODBC
- stream->write_function(stream, "mod_easyroute requires you enable core odbc support\n");
- status = SWITCH_STATUS_SUCCESS;
- goto done;
-#endif
+ if (!switch_odbc_available()) {
+ stream->write_function(stream, "mod_easyroute requires you enable core odbc support\n");
+ status = SWITCH_STATUS_SUCCESS;
+ goto done;
+ }
if (!cmd || !(mydata = strdup(cmd))) {
stream->write_function(stream, "Usage: easyroute <number>\n");
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_easyroute_shutdown)
{
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_disconnect(globals.master_odbc);
-#endif
-
switch_safe_free(globals.db_username);
switch_safe_free(globals.db_password);
switch_safe_free(globals.db_dsn);
*
*/
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_fifo_shutdown);
SWITCH_MODULE_LOAD_FUNCTION(mod_fifo_load);
char *dbname;
char *odbc_dsn;
int node_thread_running;
-
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
-#else
- void *filler1;
-#endif
} globals;
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
- SQLHSTMT stmt;
+
+ if (switch_odbc_available() && globals.odbc_dsn) {
+ switch_odbc_statement_handle_t stmt;
if (switch_odbc_handle_exec(globals.master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
err_str = switch_odbc_handle_get_error(globals.master_odbc, stmt);
switch_safe_free(err_str);
status = SWITCH_STATUS_FALSE;
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+ switch_odbc_statement_handle_free(&stmt);
} else {
-#endif
if (!(db = switch_core_db_open_file(globals.dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", globals.dbname);
status = SWITCH_STATUS_FALSE;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error [%s]\n[%s]\n", sql, err_str);
free(err_str);
}
-
switch_core_db_close(db);
-
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
end:
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
+ if (switch_odbc_available() && globals.odbc_dsn) {
switch_odbc_handle_callback_exec(globals.master_odbc, sql, callback, pdata);
} else {
-#endif
if (!(db = switch_core_db_open_file(globals.dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", globals.dbname);
goto end;
if (db) {
switch_core_db_close(db);
}
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
end:
if (mutex) {
val = (char *) switch_xml_attr_soft(param, "value");
if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
-#ifdef SWITCH_HAVE_ODBC
- 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 (switch_odbc_available()) {
+ 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 {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
}
-#else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
}
}
}
globals.dbname = "fifo";
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
+ if (switch_odbc_available() && 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;
}
}
} else {
-#endif
if ((db = switch_core_db_open_file(globals.dbname))) {
switch_core_db_test_reactive(db, "delete from fifo_outbound", NULL, (char *)outbound_sql);
} else {
goto done;
}
switch_core_db_close(db);
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
if (reload) {
switch_hash_index_t *hi;
+++ /dev/null
-BASE=../../../..
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
-include $(BASE)/build/modmake.rules
*/
#include <switch.h>
-#include <switch_odbc.h>
-
#define LCR_SYNTAX "lcr <digits> [<lcr profile>] [caller_id] [intrastate]"
#define LCR_ADMIN_SYNTAX "lcr_admin show profiles"
/* sql for random function */
static char *db_random = NULL;
-struct odbc_obj {
- switch_odbc_handle_t *handle;
- SQLHSTMT stmt;
- SQLCHAR *colbuf;
- int32_t cblen;
- SQLCHAR *code;
- int32_t codelen;
-};
-
struct lcr_obj {
char *carrier_name;
char *gw_prefix;
size_t dialstring;
};
-typedef struct odbc_obj odbc_obj_t;
-typedef odbc_obj_t *odbc_handle;
-
typedef struct lcr_obj lcr_obj_t;
typedef lcr_obj_t *lcr_route;
*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
+ if (!switch_odbc_available()) {
+ 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;
+ }
globals.pool = pool;
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_lcr_shutdown)
{
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_disconnect(globals.master_odbc);
switch_odbc_handle_destroy(&globals.master_odbc);
-#endif
switch_core_hash_destroy(&globals.profile_hash);
return SWITCH_STATUS_SUCCESS;
+++ /dev/null
-BASE=../../../..
-include $(BASE)/build/modmake.rules
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
*/
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
#define LIMIT_EVENT_USAGE "limit::usage"
switch_hash_t *limit_hash;
switch_mutex_t *db_hash_mutex;
switch_hash_t *db_hash;
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
-#else
- void *filler1;
-#endif
} globals;
typedef struct {
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
- SQLHSTMT stmt;
+
+ if (switch_odbc_available() && globals.odbc_dsn) {
+ switch_odbc_statement_handle_t stmt;
if (switch_odbc_handle_exec(globals.master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
char *err_str;
err_str = switch_odbc_handle_get_error(globals.master_odbc, stmt);
switch_safe_free(err_str);
status = SWITCH_STATUS_FALSE;
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+ switch_odbc_statement_handle_free(&stmt);
} else {
-#endif
if (!(db = switch_core_db_open_file(globals.dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", globals.dbname);
status = SWITCH_STATUS_FALSE;
goto end;
}
-
status = switch_core_db_persistant_execute(db, sql, 1);
switch_core_db_close(db);
-
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
end:
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
+ if (switch_odbc_available() && globals.odbc_dsn) {
switch_odbc_handle_callback_exec(globals.master_odbc, sql, callback, pdata);
} else {
-#endif
if (!(db = switch_core_db_open_file(globals.dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", globals.dbname);
goto end;
if (db) {
switch_core_db_close(db);
}
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
end:
if (mutex) {
return SWITCH_STATUS_TERM;
}
- if (globals.odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
+ if (switch_odbc_available() && globals.odbc_dsn) {
if ((odbc_user = strchr(globals.odbc_dsn, ':'))) {
*odbc_user++ = '\0';
if ((odbc_pass = strchr(odbc_user, ':'))) {
*odbc_pass++ = '\0';
}
}
-#else
+ } else if (globals.odbc_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
}
globals.dbname = "call_limit";
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.odbc_dsn) {
+ if (switch_odbc_available() && globals.odbc_dsn) {
int x;
char *indexes[] = {
"create index ld_hostname on limit_data (hostname)",
switch_odbc_handle_exec(globals.master_odbc, indexes[x], NULL);
}
} else {
-#endif
if ((db = switch_core_db_open_file(globals.dbname))) {
switch_core_db_test_reactive(db, "select * from limit_data", NULL, limit_sql);
switch_core_db_test_reactive(db, "select * from db_data", NULL, db_sql);
goto done;
}
switch_core_db_close(db);
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
done:
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_limit_shutdown)
{
- #ifdef SWITCH_HAVE_ODBC
if (globals.master_odbc) {
switch_odbc_handle_destroy(&globals.master_odbc);
}
- #endif
switch_event_free_subclass(LIMIT_EVENT_USAGE);
+++ /dev/null
-BASE=../../../..
-include $(BASE)/build/modmake.rules
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
-
/* Defaults */
-#ifdef SWITCH_HAVE_ODBC
static char SQL_LOOKUP[] = "SELECT %s FROM %s WHERE %s='%s'";
static char SQL_SAVE[] = "UPDATE %s SET %s=%s-%f WHERE %s='%s'";
-#endif
typedef struct
{
char *db_table;
char *db_column_cash;
char *db_column_account;
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
-#else
- void *padding1; /* Keep structures same size */
-#endif
} globals;
static void nibblebill_pause(switch_core_session_t *session);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_lowbal_action, globals.lowbal_action);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_nobal_action, globals.nobal_action);
-#ifdef SWITCH_HAVE_ODBC
static int nibblebill_callback(void *pArg, int argc, char **argv, char **columnNames)
{
nibblebill_results_t *cbt = (nibblebill_results_t *) pArg;
return 0;
}
-#endif
static switch_status_t load_config(void)
{
set_global_nobal_action("hangup");
}
-#ifdef SWITCH_HAVE_ODBC
- if (globals.db_dsn) {
+ if (switch_odbc_available() && globals.db_dsn) {
if (!(globals.master_odbc = switch_odbc_handle_new(globals.db_dsn, globals.db_username, globals.db_password))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot create handle to ODBC Database!\n");
status = SWITCH_STATUS_FALSE;
}
if (switch_odbc_handle_connect(globals.master_odbc) != SWITCH_ODBC_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot connect to ODBC driver/database %s (user: %s / pass %s)!\n", globals.db_dsn, globals.db_username, globals.db_password);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
+ "Cannot connect to ODBC driver/database %s (user: %s / pass %s)!\n",
+ globals.db_dsn, globals.db_username, globals.db_password);
status = SWITCH_STATUS_FALSE;
goto done;
} else {
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", globals.db_dsn);
} else {
-#endif
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "ODBC does not appear to be installed in the core. You need to run ./configure --enable-core-odbc-support\n");
-#ifdef SWITCH_HAVE_ODBC
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
+ "ODBC does not appear to be installed in the core. You need to run ./configure --enable-core-odbc-support\n");
}
-#endif
-#ifdef SWITCH_HAVE_ODBC
done:
-#endif
-
if (xml) {
switch_xml_free(xml);
}
/* At this time, billing never succeeds if you don't have a database. */
static switch_status_t bill_event(float billamount, const char *billaccount)
{
-#ifdef SWITCH_HAVE_ODBC
char sql[1024] = "";
- SQLHSTMT stmt;
+ switch_odbc_statement_handle_t stmt;
+
+ if (!switch_odbc_available()) {
+ return SWITCH_STATUS_SUCCESS;
+ }
switch_snprintf(sql, 1024, SQL_SAVE, globals.db_table, globals.db_column_cash, globals.db_column_cash, billamount, globals.db_column_account, billaccount);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Doing update query\n[%s]\n", sql);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str));
switch_safe_free(err_str);
} else {
-#endif
/* TODO: Failover to a flat/text file if DB is unavailable */
return SWITCH_STATUS_SUCCESS;
-#ifdef SWITCH_HAVE_ODBC
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-#endif
+ switch_odbc_statement_handle_free(&stmt);
+
return SWITCH_STATUS_SUCCESS;
}
static float get_balance(const char *billaccount)
{
-#ifdef SWITCH_HAVE_ODBC
char sql[1024] = "";
nibblebill_results_t pdata;
float balance = 0.00f;
+ if (!switch_odbc_available()) {
+ return -1.00f;
+ }
+
memset(&pdata, 0, sizeof(pdata));
snprintf(sql, 1024, SQL_LOOKUP, globals.db_column_cash, globals.db_table, globals.db_column_account, billaccount);
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, nibblebill_callback, &pdata) != SWITCH_ODBC_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error running this query: [%s]\n", sql);
-#endif
/* Return -1 for safety */
- return -1.00;
-#ifdef SWITCH_HAVE_ODBC
+ return -1.00f;
} else {
/* Successfully retrieved! */
balance = pdata.balance;
}
return balance;
-#endif
}
/* This is where we actually charge the guy
{
switch_event_unbind(&globals.node);
switch_core_remove_state_handler(&nibble_state_handler);
-
-#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_disconnect(globals.master_odbc);
-#endif
return SWITCH_STATUS_UNLOAD;
}
+++ /dev/null
-BASE=../../../..
-include $(BASE)/build/modmake.rules
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
*/
#include <switch.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
-
#ifdef _MSC_VER /* compilers are stupid sometimes */
#define TRY_CODE(code) for(;;) {status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;}
#else
switch_mutex_lock(mutex);
}
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
- SQLHSTMT stmt;
+ if (switch_odbc_available() && profile->odbc_dsn) {
+ switch_odbc_statement_handle_t stmt;
if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
char *err_str;
err_str = switch_odbc_handle_get_error(profile->master_odbc, stmt);
switch_safe_free(err_str);
status = SWITCH_STATUS_FALSE;
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-#endif
+ switch_odbc_statement_handle_free(&stmt);
} else {
if (!(db = switch_core_db_open_file(profile->dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
switch_mutex_lock(mutex);
}
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
+ if (switch_odbc_available() && profile->odbc_dsn) {
switch_odbc_handle_callback_exec(profile->master_odbc, sql, callback, pdata);
-#endif
} else {
if (!(db = switch_core_db_open_file(profile->dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
static void free_profile(vm_profile_t *profile)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Destroying Profile %s\n", profile->name);
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn && profile->master_odbc) {
+ if (switch_odbc_available() && profile->odbc_dsn && profile->master_odbc) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Closing ODBC Database! %s\n", profile->name);
switch_odbc_handle_destroy(&profile->master_odbc);
}
-#endif
switch_core_destroy_memory_pool(&profile->pool);
}
}
profile->dbname = switch_core_sprintf(profile->pool, "voicemail_%s", profile_name);
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
+ if (switch_odbc_available() && profile->odbc_dsn) {
if (!(profile->master_odbc = switch_odbc_handle_new(profile->odbc_dsn, profile->odbc_user, profile->odbc_pass))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
goto end;
for (x = 0; vm_index_list[x]; x++) {
switch_odbc_handle_exec(profile->master_odbc, vm_index_list[x], NULL);
}
-#endif
} else {
if ((db = switch_core_db_open_file(profile->dbname))) {
char *errmsg;
switch_thread_rwlock_wrlock(profile->rwlock);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Destroying Profile %s\n", profile->name);
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn && profile->master_odbc) {
+
+ if (switch_odbc_available() && profile->odbc_dsn && profile->master_odbc) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Closing ODBC Database! %s\n", profile->name);
switch_odbc_handle_destroy(&profile->master_odbc);
}
-#endif
switch_core_destroy_memory_pool(&profile->pool);
profile = NULL;
}
LOCAL_CFLAGS = `$(BASE)/libs/apr/apr-1-config --cflags --cppflags --includes`
LOCAL_CFLAGS += `$(BASE)/libs/apr-util/apu-1-config --includes`
-LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
#LOCAL_CFLAGS += -w
IKS_DIR=$(BASE)/libs/iksemel
#include <switch.h>
#include <switch_stun.h>
#include <libdingaling.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
#define DL_CAND_WAIT 10000000
#define DL_CAND_INITIAL_WAIT 2000000
char *timer_name;
char *dbname;
char *avatar;
-#ifdef SWITCH_HAVE_ODBC
char *odbc_dsn;
char *odbc_user;
char *odbc_pass;
switch_odbc_handle_t *master_odbc;
-#else
- void *filler1;
- void *filler2;
- void *filler3;
- void *filler4;
-#endif
switch_mutex_t *mutex;
ldl_handle_t *handle;
uint32_t flags;
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
- SQLHSTMT stmt;
+
+ if (switch_odbc_available() && profile->odbc_dsn) {
+ switch_odbc_statement_handle_t stmt;
if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
char *err_str;
err_str = switch_odbc_handle_get_error(profile->master_odbc, stmt);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str));
switch_safe_free(err_str);
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+ switch_odbc_statement_handle_free(&stmt);
} else {
-#endif
if (!(db = switch_core_db_open_file(profile->dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
goto end;
}
-
switch_core_db_persistant_execute(db, sql, 1);
switch_core_db_close(db);
-
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
-
end:
if (mutex) {
switch_mutex_lock(mutex);
}
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
+ if (switch_odbc_available() && profile->odbc_dsn) {
switch_odbc_handle_callback_exec(profile->master_odbc, sql, callback, pdata);
} else {
-#endif
-
-
-
if (!(db = switch_core_db_open_file(profile->dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
goto end;
}
-
-
switch_core_db_exec(db, sql, callback, pdata, &errmsg);
if (errmsg) {
if (db) {
switch_core_db_close(db);
}
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
-
end:
switch_mutex_unlock(mutex);
}
-
-
return ret;
-
}
static int sub_callback(void *pArg, int argc, char **argv, char **columnNames)
} else if (!strcasecmp(var, "avatar")) {
profile->avatar = switch_core_strdup(module_pool, val);
} else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
-#ifdef SWITCH_HAVE_ODBC
- profile->odbc_dsn = switch_core_strdup(module_pool, val);
- if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
- *profile->odbc_user++ = '\0';
- if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
- *profile->odbc_pass++ = '\0';
+ if (switch_odbc_available()) {
+ profile->odbc_dsn = switch_core_strdup(module_pool, val);
+ if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
+ *profile->odbc_user++ = '\0';
+ if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
+ *profile->odbc_pass++ = '\0';
+ }
}
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
}
-
-#else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
} else if (!strcasecmp(var, "use-rtp-timer") && switch_true(val)) {
switch_set_flag(profile, TFLAG_TIMER);
} else if (!strcasecmp(var, "dialplan") && !switch_strlen_zero(val)) {
switch_snprintf(dbname, sizeof(dbname), "dingaling_%s", profile->name);
profile->dbname = switch_core_strdup(module_pool, dbname);
-
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
+ if (switch_odbc_available() && profile->odbc_dsn) {
if (!(profile->master_odbc = switch_odbc_handle_new(profile->odbc_dsn, profile->odbc_user, profile->odbc_pass))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
continue;
switch_odbc_handle_exec(profile->master_odbc, sub_sql, NULL);
//mdl_execute_sql(profile, sub_sql, NULL);
} else {
-#endif
if ((db = switch_core_db_open_file(profile->dbname))) {
switch_core_db_test_reactive(db, "select * from jabber_subscriptions", NULL, sub_sql);
} else {
continue;
}
switch_core_db_close(db);
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
}
if (profile) {
#define HAVE_APR
#include <switch.h>
#include <switch_version.h>
-#ifdef SWITCH_HAVE_ODBC
-#include <switch_odbc.h>
-#endif
#define SOFIA_NAT_SESSION_TIMEOUT 20
#define SOFIA_MAX_ACL 100
#ifdef _MSC_VER
} else if (!strcasecmp(var, "sip-trace") && switch_true(val)) {
sofia_set_flag(profile, TFLAG_TPORT_LOG);
} else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
-#ifdef SWITCH_HAVE_ODBC
- profile->odbc_dsn = switch_core_strdup(profile->pool, val);
- if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
- *profile->odbc_user++ = '\0';
- if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
- *profile->odbc_pass++ = '\0';
+ if (switch_odbc_available()) {
+ profile->odbc_dsn = switch_core_strdup(profile->pool, val);
+ if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
+ *profile->odbc_user++ = '\0';
+ if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
+ *profile->odbc_pass++ = '\0';
+ }
}
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
}
-#else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
} else if (!strcasecmp(var, "user-agent-string")) {
profile->user_agent = switch_core_strdup(profile->pool, val);
} else if (!strcasecmp(var, "auto-restart")) {
" expires INTEGER\n"
");\n";
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
+ if (switch_odbc_available() && profile->odbc_dsn) {
int x;
char *indexes[] = {
"create index sr_call_id on sip_registrations (call_id)",
}
-#else
+ } else if (profile->odbc_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
} else {
if (!(profile->master_db = switch_core_db_open_file(profile->dbname))) {
return 0;
switch_core_db_exec(profile->master_db, "create index if not exists sa_hostname on sip_authentication (hostname)", NULL, NULL, NULL);
}
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
+ if (switch_odbc_available() && profile->odbc_dsn) {
return profile->master_odbc ? 1 : 0;
}
-#endif
return profile->master_db ? 1 : 0;
}
void sofia_glue_sql_close(sofia_profile_t *profile)
{
-#ifdef SWITCH_HAVE_ODBC
- if (profile->master_odbc) {
+ if (switch_odbc_available() && profile->master_odbc) {
switch_odbc_handle_destroy(&profile->master_odbc);
+ } else {
+ switch_core_db_close(profile->master_db);
+ profile->master_db = NULL;
}
-#else
- switch_core_db_close(profile->master_db);
- profile->master_db = NULL;
-#endif
}
-
void sofia_glue_execute_sql(sofia_profile_t *profile, char **sqlp, switch_bool_t sql_already_dynamic)
{
switch_status_t status = SWITCH_STATUS_FALSE;
switch_mutex_lock(mutex);
}
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
- SQLHSTMT stmt;
+ if (switch_odbc_available() && profile->odbc_dsn) {
+ switch_odbc_statement_handle_t stmt;
if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
char *err_str;
err_str = switch_odbc_handle_get_error(profile->master_odbc, stmt);
}
switch_safe_free(err_str);
}
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-#else
+ switch_odbc_statement_handle_free(&stmt);
+ } else if (profile->odbc_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
} else {
if (master) {
db = profile->master_db;
}
- if (profile->odbc_dsn) {
-#ifdef SWITCH_HAVE_ODBC
+ if (switch_odbc_available() && profile->odbc_dsn) {
switch_odbc_handle_callback_exec(profile->master_odbc, sql, callback, pdata);
-#else
+ } else if (profile->odbc_dsn) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
-#endif
} else {
if (master) {
return ret;
}
-#ifdef SWITCH_HAVE_ODBC
static char *sofia_glue_execute_sql2str_odbc(sofia_profile_t *profile, switch_mutex_t *mutex, char *sql, char *resbuf, size_t len)
{
char *ret = NULL;
- SQLHSTMT stmt;
- SQLCHAR name[1024];
- SQLLEN m = 0;
-
- if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) == SWITCH_ODBC_SUCCESS) {
- SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable;
- SQLULEN ColumnSize;
- SQLRowCount(stmt, &m);
- if (m <= 0) {
- return NULL;
- }
-
- if (SQLFetch(stmt) != SQL_SUCCESS) {
- return NULL;
- }
-
- SQLDescribeCol(stmt, 1, name, sizeof(name), &NameLength, &DataType, &ColumnSize, &DecimalDigits, &Nullable);
- SQLGetData(stmt, 1, SQL_C_CHAR, (SQLCHAR *) resbuf, (SQLLEN) len, NULL);
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+ if (switch_odbc_handle_exec_string(profile->master_odbc, sql, resbuf, len) == SWITCH_ODBC_SUCCESS) {
ret = resbuf;
}
return ret;
}
-#endif
+
char *sofia_glue_execute_sql2str(sofia_profile_t *profile, switch_mutex_t *mutex, char *sql, char *resbuf, size_t len)
{
switch_core_db_stmt_t *stmt;
char *ret = NULL;
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
+ if (switch_odbc_available() && profile->odbc_dsn) {
return sofia_glue_execute_sql2str_odbc(profile, mutex, sql, resbuf, len);
}
-#endif
if (mutex) {
switch_mutex_lock(mutex);
{
char sql[1024];
-#ifdef SWITCH_HAVE_ODBC
- if (profile->odbc_dsn) {
+ if (switch_odbc_available() && profile->odbc_dsn) {
if (!profile->master_odbc) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
return;
}
} else {
-#endif
if (!profile->master_db) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
return;
}
-#ifdef SWITCH_HAVE_ODBC
}
-#endif
-
switch_mutex_lock(profile->ireg_mutex);
*
*/
#include "mod_spidermonkey.h"
-#include <switch_odbc.h>
+
+#include <sql.h>
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4201)
+#include <sqlext.h>
+#pragma warning(pop)
+#else
+#include <sqlext.h>
+#endif
+#include <sqltypes.h>
static const char modname[] = "ODBC";
*/
#include <switch.h>
-#include <switch_odbc.h>
+
+#ifdef SWITCH_HAVE_ODBC
+#include <sql.h>
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4201)
+#include <sqlext.h>
+#pragma warning(pop)
+#else
+#include <sqlext.h>
+#endif
+#include <sqltypes.h>
#if (ODBCVER < 0x0300)
#define SQL_NO_DATA SQL_SUCCESS
char odbc_driver[256];
BOOL is_firebird;
};
+#endif
SWITCH_DECLARE(switch_odbc_handle_t *) switch_odbc_handle_new(char *dsn, char *username, char *password)
{
+#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *new_handle;
if (!(new_handle = malloc(sizeof(*new_handle)))) {
switch_safe_free(new_handle);
}
+#endif
return NULL;
}
SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_disconnect(switch_odbc_handle_t *handle)
{
+#ifdef SWITCH_HAVE_ODBC
+
int result;
+ if (!handle) {
+ return SWITCH_ODBC_FAIL;
+ }
+
if (handle->state == SWITCH_ODBC_STATE_CONNECTED) {
result = SQLDisconnect(handle->con);
if (result == SWITCH_ODBC_SUCCESS) {
handle->state = SWITCH_ODBC_STATE_DOWN;
return SWITCH_ODBC_SUCCESS;
+#else
+ return SWITCH_ODBC_FAIL;
+#endif
}
SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_connect(switch_odbc_handle_t *handle)
{
+#ifdef SWITCH_HAVE_ODBC
int result;
SQLINTEGER err;
int16_t mlen;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connected to [%s]\n", handle->dsn);
handle->state = SWITCH_ODBC_STATE_CONNECTED;
return SWITCH_ODBC_SUCCESS;
+#else
+ return SWITCH_ODBC_FAIL;
+#endif
}
static int db_is_up(switch_odbc_handle_t *handle)
{
+#ifdef SWITCH_HAVE_ODBC
int ret = 0;
SQLHSTMT stmt = NULL;
SQLLEN m = 0;
}
return ret;
+#else
+ return SWITCH_ODBC_FAIL;
+#endif
}
-SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_t *handle, char *sql, SQLHSTMT * rstmt)
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_statement_handle_free(switch_odbc_statement_handle_t * stmt)
{
+ if (!stmt || ! *stmt) {
+ return SWITCH_ODBC_FAIL;
+ }
+#ifdef SWITCH_HAVE_ODBC
+ SQLFreeHandle(SQL_HANDLE_STMT, *stmt);
+ *stmt = NULL;
+ return SWITCH_ODBC_SUCCESS;
+#else
+ return SWITCH_ODBC_FAIL;
+#endif
+}
+
+
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec_string(switch_odbc_handle_t *handle,
+ char *sql,
+ char *resbuf,
+ size_t len)
+{
+#ifdef SWITCH_HAVE_ODBC
+ switch_odbc_status_t sstatus = SWITCH_ODBC_FAIL;
+ switch_odbc_statement_handle_t stmt = NULL;
+ SQLCHAR name[1024];
+ SQLLEN m = 0;
+
+ if (switch_odbc_handle_exec(handle, sql, &stmt) == SWITCH_ODBC_SUCCESS) {
+ SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable;
+ SQLULEN ColumnSize;
+ SQLRowCount(stmt, &m);
+
+ if (m <= 0) {
+ goto done;
+ }
+
+ if (SQLFetch(stmt) != SQL_SUCCESS) {
+ goto done;
+ }
+
+ SQLDescribeCol(stmt, 1, name, sizeof(name), &NameLength, &DataType, &ColumnSize, &DecimalDigits, &Nullable);
+ SQLGetData(stmt, 1, SQL_C_CHAR, (SQLCHAR *) resbuf, (SQLLEN) len, NULL);
+ sstatus = SWITCH_ODBC_SUCCESS;
+ } else {
+ return sstatus;
+ }
+
+ done:
+ switch_odbc_statement_handle_free(&stmt);
+ return sstatus;
+#else
+ return SWITCH_ODBC_FAIL;
+#endif
+}
+
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_t *handle, char *sql, switch_odbc_statement_handle_t * rstmt)
+{
+#ifdef SWITCH_HAVE_ODBC
SQLHSTMT stmt = NULL;
int result;
} else if (stmt) {
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
+#endif
return SWITCH_ODBC_FAIL;
}
switch_odbc_handle_t *handle,
char *sql, switch_core_db_callback_func_t callback, void *pdata)
{
+#ifdef SWITCH_HAVE_ODBC
SQLHSTMT stmt = NULL;
SQLSMALLINT c = 0, x = 0;
SQLLEN m = 0, t = 0;
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
+#endif
return SWITCH_ODBC_FAIL;
}
SWITCH_DECLARE(void) switch_odbc_handle_destroy(switch_odbc_handle_t **handlep)
{
+#ifdef SWITCH_HAVE_ODBC
+
switch_odbc_handle_t *handle = NULL;
if (!handlep) {
free(handle);
}
*handlep = NULL;
+#else
+ return;
+#endif
}
SWITCH_DECLARE(switch_odbc_state_t) switch_odbc_handle_get_state(switch_odbc_handle_t *handle)
{
+#ifdef SWITCH_HAVE_ODBC
return handle ? handle->state : SWITCH_ODBC_STATE_INIT;
+#else
+ return SWITCH_ODBC_STATE_ERROR;
+#endif
}
-SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, SQLHSTMT stmt)
+SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, switch_odbc_statement_handle_t stmt)
{
+#ifdef SWITCH_HAVE_ODBC
+
char buffer[SQL_MAX_MESSAGE_LENGTH + 1] = "";
char sqlstate[SQL_SQLSTATE_SIZE + 1] = "";
SQLINTEGER sqlcode;
};
return ret;
+#else
+ return NULL;
+#endif
+}
+
+SWITCH_DECLARE(switch_bool_t) switch_odbc_available(void)
+{
+#ifdef SWITCH_HAVE_ODBC
+ return SWITCH_TRUE;
+#else
+ return SWITCH_FALSE;
+#endif
}