diff --git a/src/mod/applications/mod_nibblebill/mod_nibblebill.c b/src/mod/applications/mod_nibblebill/mod_nibblebill.c index c1a788454a..53b8270b99 100755 --- a/src/mod/applications/mod_nibblebill/mod_nibblebill.c +++ b/src/mod/applications/mod_nibblebill/mod_nibblebill.c @@ -92,9 +92,8 @@ static struct { int global_heartbeat; /* Supervise and bill every X seconds, 0 means off */ /* Database settings */ - char *db_username; - char *db_password; - char *db_dsn; + char *dbname; + char *odbc_dsn; char *db_table; char *db_column_cash; char *db_column_account; @@ -118,9 +117,6 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_nibblebill_shutdown); SWITCH_MODULE_DEFINITION(mod_nibblebill, mod_nibblebill_load, mod_nibblebill_shutdown, NULL); /* String setting functions */ -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_username, globals.db_username); -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_password, globals.db_password); -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_dsn, globals.db_dsn); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_table, globals.db_table); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_column_cash, globals.db_column_cash); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_db_column_account, globals.db_column_account); @@ -130,6 +126,24 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_percall_action, globals.percall_act SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_lowbal_action, globals.lowbal_action); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_nobal_action, globals.nobal_action); +static switch_cache_db_handle_t *nibblebill_get_db_handle(void) +{ + switch_cache_db_handle_t *dbh = NULL; + char *dsn; + + if (!zstr(globals.odbc_dsn)) { + dsn = globals.odbc_dsn; + } else { + dsn = globals.dbname; + } + + if (switch_cache_db_get_db_handle_dsn(&dbh, dsn) != SWITCH_STATUS_SUCCESS) { + dbh = NULL; + } + + return dbh; +} + static int nibblebill_callback(void *pArg, int argc, char **argv, char **columnNames) { int i = 0; @@ -144,9 +158,27 @@ static int nibblebill_callback(void *pArg, int argc, char **argv, char **columnN return 0; } -static switch_status_t load_config(void) +static switch_bool_t nibblebill_execute_sql_callback(char *sql, switch_core_db_callback_func_t callback, void *pdata) +{ + switch_bool_t retval = SWITCH_FALSE; + switch_cache_db_handle_t *dbh = NULL; + + if (globals.odbc_dsn && (dbh = nibblebill_get_db_handle())) { + if (switch_cache_db_execute_sql_callback(dbh, sql, callback, pdata, NULL) != SWITCH_STATUS_SUCCESS) { + retval = SWITCH_FALSE; + } else { + retval = SWITCH_TRUE; + } + } + switch_cache_db_release_db_handle(&dbh); + return retval; +} + + +static switch_status_t nibblebill_load_config(void) { char *cf = "nibblebill.conf"; + switch_cache_db_handle_t *dbh = NULL; switch_xml_t cfg, xml = NULL, param, settings; switch_status_t status = SWITCH_STATUS_SUCCESS; @@ -160,13 +192,11 @@ static switch_status_t load_config(void) 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, "db_username")) { - set_global_db_username(val); - } else if (!strcasecmp(var, "db_password")) { - set_global_db_password(val); - } else if (!strcasecmp(var, "db_dsn")) { - set_global_db_dsn(val); + + if (!strcasecmp(var, "odbc-dsn") && !zstr(val)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "odbc_dsn is %s\n", val); + switch_safe_free(globals.odbc_dsn); + globals.odbc_dsn = strdup(val); } else if (!strcasecmp(var, "db_table")) { set_global_db_table(val); } else if (!strcasecmp(var, "db_column_cash")) { @@ -194,6 +224,7 @@ static switch_status_t load_config(void) } } } + /* Set defaults for any variables still not set */ setdefaults: @@ -207,28 +238,15 @@ static switch_status_t load_config(void) set_global_nobal_action("hangup"); } - 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; - goto done; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Opened ODBC Database handle!\n"); + if (globals.odbc_dsn) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG + , "dsn is \"%s\"\n" + , globals.odbc_dsn + ); + if (!(dbh = nibblebill_get_db_handle())) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n"); + switch_goto_status(SWITCH_STATUS_FALSE, done); } - - 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); - status = SWITCH_STATUS_FALSE; - goto done; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Opened ODBC Database!\n"); - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", globals.db_dsn); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, - "ODBC does not appear to be installed in the core or your dsn is empty. You need to run ./configure --enable-core-odbc-support\n"); } done: @@ -314,12 +332,7 @@ static void transfer_call(switch_core_session_t *session, char *destination) static switch_status_t bill_event(double billamount, const char *billaccount, switch_channel_t *channel) { char *sql = NULL, *dsql = NULL; - switch_odbc_statement_handle_t stmt = NULL; - switch_status_t status = SWITCH_STATUS_FALSE; - - if (!switch_odbc_available()) { - return status; - } + switch_status_t status = SWITCH_FALSE; if (globals.custom_sql_save) { if (switch_string_var_check_const(globals.custom_sql_save) || switch_string_has_escaped_data(globals.custom_sql_save)) { @@ -336,36 +349,18 @@ static switch_status_t bill_event(double billamount, const char *billaccount, sw } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Doing update query\n[%s]\n", sql); - - if (switch_odbc_handle_exec(globals.master_odbc, sql, &stmt, NULL) != SWITCH_ODBC_SUCCESS) { - char *err_str; - err_str = switch_odbc_handle_get_error(globals.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); - } else { - status = SWITCH_STATUS_SUCCESS; - } - - if (stmt) { - switch_odbc_statement_handle_free(&stmt); - } - + status = nibblebill_execute_sql_callback(sql, nibblebill_callback, NULL); switch_safe_free(dsql); return status; } - static double get_balance(const char *billaccount, switch_channel_t *channel) { char *dsql = NULL, *sql = NULL; nibblebill_results_t pdata; double balance = 0.0; - if (!switch_odbc_available()) { - return -1.0; - } - memset(&pdata, 0, sizeof(pdata)); if (globals.custom_sql_lookup) { @@ -381,11 +376,9 @@ static double get_balance(const char *billaccount, switch_channel_t *channel) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Doing lookup query\n[%s]\n", sql); - - if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, nibblebill_callback, &pdata, NULL) != SWITCH_ODBC_SUCCESS) { + if (nibblebill_execute_sql_callback(sql, nibblebill_callback, &pdata) != SWITCH_TRUE) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error running this query: [%s]\n", sql); /* Return -1 for safety */ - balance = -1.0; } else { /* Successfully retrieved! */ @@ -529,7 +522,7 @@ static switch_status_t do_billing(switch_core_session_t *session) uuid, nibble_data->total); /* DO ODBC BILLING HERE and reset counters if it's successful! */ - if (bill_event(billamount, billaccount, channel) == SWITCH_STATUS_SUCCESS) { + if (bill_event(billamount, billaccount, channel) == SWITCH_TRUE) { /* Increment total cost */ nibble_data->total += billamount; @@ -581,14 +574,12 @@ static switch_status_t do_billing(switch_core_session_t *session) } } - /* Done changing - release lock */ if (globals.mutex) { switch_mutex_unlock(globals.mutex); } /* Go check if this call is allowed to continue */ - return SWITCH_STATUS_SUCCESS; } @@ -955,7 +946,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_nibblebill_load) globals.pool = pool; switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool); - load_config(); + nibblebill_load_config(); /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); @@ -987,10 +978,9 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_nibblebill_shutdown) switch_event_unbind(&globals.node); switch_core_remove_state_handler(&nibble_state_handler); switch_odbc_handle_disconnect(globals.master_odbc); - - switch_safe_free(globals.db_username); - switch_safe_free(globals.db_password); - switch_safe_free(globals.db_dsn); + + switch_safe_free(globals.dbname); + switch_safe_free(globals.odbc_dsn); switch_safe_free(globals.db_table); switch_safe_free(globals.db_column_cash); switch_safe_free(globals.db_column_account);