]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add some convenience for db stuff
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 11 Oct 2012 18:47:06 +0000 (13:47 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 11 Oct 2012 18:47:06 +0000 (13:47 -0500)
src/include/switch_core.h
src/include/switch_event.h
src/switch_core_sqldb.c
src/switch_event.c

index b533a3e6da0d90d48359f0cd0118ca6cbbd5e611..3cb4dc81167ddaaed9d488a0bc3f9e4b8fe2664c 100644 (file)
@@ -2207,6 +2207,8 @@ SWITCH_DECLARE(void) switch_core_sqldb_start_thread(void);
   \}
 */
 
+typedef int (*switch_db_event_callback_func_t) (void *pArg, switch_event_t *event);
+
 #define CACHE_DB_LEN 256
 typedef enum {
        CDF_INUSE = (1 << 0),
@@ -2427,6 +2429,8 @@ SWITCH_DECLARE(switch_status_t) switch_switch_sql_queue_manager_init(switch_sql_
 
 SWITCH_DECLARE(switch_status_t) switch_switch_sql_queue_manager_start(switch_sql_queue_manager_t *qm);
 SWITCH_DECLARE(switch_status_t) switch_switch_sql_queue_manager_stop(switch_sql_queue_manager_t *qm);
+SWITCH_DECLARE(switch_status_t) switch_cache_db_execute_sql_event_callback(switch_cache_db_handle_t *dbh,
+                                                                                                                                                  const char *sql, switch_db_event_callback_func_t callback, void *pdata, char **err);
                                                        
 SWITCH_DECLARE(pid_t) switch_fork(void);
 
index cc78336655a34ad13c284f9dced992997f3b7b64..52187cb820b41857d3925ab90add435be67a7533 100644 (file)
@@ -315,6 +315,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, ch
 SWITCH_DECLARE(switch_status_t) switch_event_serialize_json(switch_event_t *event, char **str);
 SWITCH_DECLARE(switch_status_t) switch_event_create_json(switch_event_t **event, const char *json);
 SWITCH_DECLARE(switch_status_t) switch_event_create_brackets(char *data, char a, char b, char c, switch_event_t **event, char **new_data, switch_bool_t dup);
+SWITCH_DECLARE(switch_status_t) switch_event_create_array_pair(switch_event_t **event, char **names, char **vals, int len);
 
 #ifndef SWIG
 /*!
index 7d57ba53aff53586a2e249ce7aef102c0967bc50..7b20e0ec4b60aca642aa38c09a7f614e2465e565 100644 (file)
@@ -982,6 +982,79 @@ SWITCH_DECLARE(switch_status_t) switch_cache_db_persistant_execute_trans_full(sw
        return status;
 }
 
+struct helper {
+       switch_db_event_callback_func_t callback;
+       void *pdata;
+};
+
+static int helper_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+       struct helper *h = (struct helper *) pArg;
+       int r = 0;
+       switch_event_t *event;
+
+       switch_event_create_array_pair(&event, columnNames, argv, argc);
+
+       r = h->callback(h->pdata, event);
+
+       switch_event_destroy(&event);
+       
+       return r;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_cache_db_execute_sql_event_callback(switch_cache_db_handle_t *dbh,
+                                                                                                                                        const char *sql, switch_db_event_callback_func_t callback, void *pdata, char **err)
+{
+       switch_status_t status = SWITCH_STATUS_FALSE;
+       char *errmsg = NULL;
+       switch_mutex_t *io_mutex = dbh->io_mutex;
+       struct helper h;
+
+
+       if (err) {
+               *err = NULL;
+       }
+
+       if (io_mutex) switch_mutex_lock(io_mutex);
+
+       h.callback = callback;
+       h.pdata = pdata;
+       
+       switch (dbh->type) {
+       case SCDB_TYPE_PGSQL:
+               {
+                       status = switch_pgsql_handle_callback_exec(dbh->native_handle.pgsql_dbh, sql, helper_callback, &h, err);
+               }
+               break;
+       case SCDB_TYPE_ODBC:
+               {
+                       status = switch_odbc_handle_callback_exec(dbh->native_handle.odbc_dbh, sql, helper_callback, &h, err);
+               }
+               break;
+       case SCDB_TYPE_CORE_DB:
+               {
+                       int ret = switch_core_db_exec(dbh->native_handle.core_db_dbh, sql, helper_callback, &h, &errmsg);
+
+                       if (ret == SWITCH_CORE_DB_OK || ret == SWITCH_CORE_DB_ABORT) {
+                               status = SWITCH_STATUS_SUCCESS;
+                       }
+
+                       if (errmsg) {
+                               dbh->last_used = switch_epoch_time_now(NULL) - (SQL_CACHE_TIMEOUT * 2);
+                               if (!strstr(errmsg, "query abort")) {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR: [%s] %s\n", sql, errmsg);
+                               }
+                               switch_core_db_free(errmsg);
+                       }
+               }
+               break;
+       }
+
+       if (io_mutex) switch_mutex_unlock(io_mutex);
+
+       return status;
+}
+
 SWITCH_DECLARE(switch_status_t) switch_cache_db_execute_sql_callback(switch_cache_db_handle_t *dbh,
                                                                                                                                         const char *sql, switch_core_db_callback_func_t callback, void *pdata, char **err)
 {
index 02d23ee8f7c4ab20e22d149464a139910edcf79d..502aeeb1cc7f720c9cc6f756c65dd96ac0c17e38 100644 (file)
@@ -1492,6 +1492,27 @@ SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, ch
        return SWITCH_STATUS_SUCCESS;
 }
 
+SWITCH_DECLARE(switch_status_t) switch_event_create_array_pair(switch_event_t **event, char **names, char **vals, int len)
+{
+       int r;
+       char *name, *val;
+
+       switch_event_create(event, SWITCH_EVENT_CLONE);
+       
+       for (r = 0; r < len; r++) {
+               val = switch_str_nil(vals[r]);
+               name = names[r];
+               
+               if (zstr(name)) {
+                       name = "Unknown";
+               }
+
+               switch_event_add_header(*event, SWITCH_STACK_BOTTOM, name, val);
+       }
+
+       return SWITCH_STATUS_SUCCESS;
+       
+}
 
 SWITCH_DECLARE(switch_status_t) switch_event_create_brackets(char *data, char a, char b, char c, switch_event_t **event, char **new_data, switch_bool_t dup)
 {