[asterisk-addons-commits] tilghman: branch 1.6.1 r962 - in /branches/1.6.1: ./ apps/ configs/
SVN commits to the Asterisk addons project
asterisk-addons-commits at lists.digium.com
Mon Jun 29 18:12:25 CDT 2009
Author: tilghman
Date: Mon Jun 29 18:12:20 2009
New Revision: 962
URL: http://svn.asterisk.org/svn-view/asterisk-addons?view=rev&rev=962
Log:
Merged revisions 960 via svnmerge from
https://origsvn.digium.com/svn/asterisk-addons/trunk
................
r960 | tilghman | 2009-06-29 17:33:29 -0500 (Mon, 29 Jun 2009) | 15 lines
Merged revisions 959 via svnmerge from
https://origsvn.digium.com/svn/asterisk-addons/branches/1.4
........
r959 | tilghman | 2009-06-29 17:21:09 -0500 (Mon, 29 Jun 2009) | 8 lines
Autoclear resources in app MYSQL when the channel ends.
(closes issue #14757)
Reported by: alecdavis
Patches:
20090408__bug14757.diff.txt uploaded by tilghman (license 14)
20090518__issue14757__trunk.diff.txt uploaded by tilghman (license 14)
Tested by: alecdavis
........
................
Added:
branches/1.6.1/configs/mysql.conf.sample (with props)
Modified:
branches/1.6.1/ (props changed)
branches/1.6.1/apps/app_addon_sql_mysql.c
Propchange: branches/1.6.1/
------------------------------------------------------------------------------
--- trunk-merged (original)
+++ trunk-merged Mon Jun 29 18:12:20 2009
@@ -1,1 +1,1 @@
-/trunk:1-690,707,711,715,719,725-726,730,887,910,933
+/trunk:1-690,707,711,715,719,725-726,730,887,910,933,960
Modified: branches/1.6.1/apps/app_addon_sql_mysql.c
URL: http://svn.asterisk.org/svn-view/asterisk-addons/branches/1.6.1/apps/app_addon_sql_mysql.c?view=diff&rev=962&r1=961&r2=962
==============================================================================
--- branches/1.6.1/apps/app_addon_sql_mysql.c (original)
+++ branches/1.6.1/apps/app_addon_sql_mysql.c Mon Jun 29 18:12:20 2009
@@ -90,7 +90,19 @@
#define AST_MYSQL_ID_RESID 2
#define AST_MYSQL_ID_FETCHID 3
+int autoclear = 0;
+
+static void mysql_ds_destroy(void *data);
+static void mysql_ds_fixup(void *data, struct ast_channel *oldchan, struct ast_channel *newchan);
+
+static struct ast_datastore_info mysql_ds_info = {
+ .type = "APP_ADDON_SQL_MYSQL",
+ .destroy = mysql_ds_destroy,
+ .chan_fixup = mysql_ds_fixup,
+};
+
struct ast_MYSQL_id {
+ struct ast_channel *owner;
int identifier_type; /* 0=dummy, 1=connid, 2=resultid */
int identifier;
void *data;
@@ -98,6 +110,56 @@
} *ast_MYSQL_id;
AST_LIST_HEAD(MYSQLidshead,ast_MYSQL_id) _mysql_ids_head;
+
+static void mysql_ds_destroy(void *data)
+{
+ /* Destroy any IDs owned by the channel */
+ struct ast_MYSQL_id *i;
+ if (AST_LIST_LOCK(&_mysql_ids_head)) {
+ ast_log(LOG_WARNING, "Unable to lock identifiers list\n");
+ } else {
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&_mysql_ids_head, i, entries) {
+ if (i->owner == data) {
+ AST_LIST_REMOVE_CURRENT(entries);
+ if (i->identifier_type == AST_MYSQL_ID_CONNID) {
+ /* Drop connection */
+ mysql_close(i->data);
+ } else if (i->identifier_type == AST_MYSQL_ID_RESID) {
+ /* Drop result */
+ mysql_free_result(i->data);
+ }
+ ast_free(i);
+ }
+ }
+ AST_LIST_TRAVERSE_SAFE_END
+ AST_LIST_UNLOCK(&_mysql_ids_head);
+ }
+}
+
+static void mysql_ds_fixup(void *data, struct ast_channel *oldchan, struct ast_channel *newchan)
+{
+ /* Destroy any IDs owned by the channel */
+ struct ast_MYSQL_id *i;
+ if (AST_LIST_LOCK(&_mysql_ids_head)) {
+ ast_log(LOG_WARNING, "Unable to lock identifiers list\n");
+ } else {
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&_mysql_ids_head, i, entries) {
+ if (i->owner == data) {
+ AST_LIST_REMOVE_CURRENT(entries);
+ if (i->identifier_type == AST_MYSQL_ID_CONNID) {
+ /* Drop connection */
+ mysql_close(i->data);
+ } else if (i->identifier_type == AST_MYSQL_ID_RESID) {
+ /* Drop result */
+ mysql_free_result(i->data);
+ }
+ ast_free(i);
+ }
+ }
+ AST_LIST_TRAVERSE_SAFE_END
+ AST_LIST_UNLOCK(&_mysql_ids_head);
+ }
+}
/* helpful procs */
static void *find_identifier(int identifier, int identifier_type)
@@ -126,7 +188,7 @@
return res;
}
-static int add_identifier(int identifier_type, void *data)
+static int add_identifier(struct ast_channel *chan, int identifier_type, void *data)
{
struct ast_MYSQL_id *i = NULL, *j = NULL;
struct MYSQLidshead *headp = &_mysql_ids_head;
@@ -145,6 +207,7 @@
i->identifier = maxidentifier + 1;
i->identifier_type = identifier_type;
i->data = data;
+ i->owner = chan;
AST_LIST_INSERT_HEAD(headp, i, entries);
AST_LIST_UNLOCK(headp);
}
@@ -192,7 +255,7 @@
static int add_identifier_and_set_asterisk_int(struct ast_channel *chan, char *varname, int identifier_type, void *data)
{
- return set_asterisk_int(chan, varname, add_identifier(identifier_type, data));
+ return set_asterisk_int(chan, varname, add_identifier(chan, identifier_type, data));
}
static int safe_scan_int(char **data, char *delim, int def)
@@ -451,7 +514,7 @@
int result;
char sresult[10];
- ast_debug(5, "MYSQL: data=%s\n", (char *)data);
+ ast_debug(5, "MYSQL: data=%s\n", (char *) data);
if (!data) {
ast_log(LOG_WARNING, "MYSQL requires an argument (see manual)\n");
@@ -460,6 +523,17 @@
result = 0;
+ if (autoclear) {
+ struct ast_datastore *mysql_store = ast_channel_datastore_find(chan, &mysql_ds_info, NULL);
+ if (!mysql_store) {
+ if (!(mysql_store = ast_datastore_alloc(&mysql_ds_info, NULL))) {
+ ast_log(LOG_WARNING, "Unable to allocate new datastore.\n");
+ } else {
+ mysql_store->data = chan;
+ ast_channel_datastore_add(chan, mysql_store);
+ }
+ }
+ }
ast_mutex_lock(&_mysql_mutex);
if (strncasecmp("connect", data, strlen("connect")) == 0) {
@@ -477,7 +551,7 @@
} else if (strncasecmp("set", data, 3) == 0) {
result = aMYSQL_set(chan, ast_strdupa(data));
} else {
- ast_log(LOG_WARNING, "Unknown argument to MYSQL application : %s\n", (char *)data);
+ ast_log(LOG_WARNING, "Unknown argument to MYSQL application : %s\n", (char *) data);
result = -1;
}
@@ -496,6 +570,17 @@
static int load_module(void)
{
struct MYSQLidshead *headp = &_mysql_ids_head;
+ struct ast_flags config_flags = { 0 };
+ struct ast_config *cfg = ast_config_load("mysql.conf", config_flags);
+ const char *temp;
+
+ if (cfg) {
+ if ((temp = ast_variable_retrieve(cfg, "general", "autoclear")) && ast_true(temp)) {
+ autoclear = 1;
+ }
+ ast_config_destroy(cfg);
+ }
+
AST_LIST_HEAD_INIT(headp);
return ast_register_application(app, MYSQL_exec, synopsis, descrip);
}
Added: branches/1.6.1/configs/mysql.conf.sample
URL: http://svn.asterisk.org/svn-view/asterisk-addons/branches/1.6.1/configs/mysql.conf.sample?view=auto&rev=962
==============================================================================
--- branches/1.6.1/configs/mysql.conf.sample (added)
+++ branches/1.6.1/configs/mysql.conf.sample Mon Jun 29 18:12:20 2009
@@ -1,0 +1,8 @@
+; Configuration file for app_addon_sql_mysql
+[general]
+; If set, autoclear will destroy allocated statement and connection resources
+; when the channel ends. For most usage of the MYSQL app, this is what you
+; want, but it's conceivable that somebody is sharing MYSQL connections across
+; multiple channels, in which case, this should be set to 'no'. Defaults to
+; 'no', as this was the original behavior.
+autoclear=yes
Propchange: branches/1.6.1/configs/mysql.conf.sample
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/1.6.1/configs/mysql.conf.sample
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: branches/1.6.1/configs/mysql.conf.sample
------------------------------------------------------------------------------
svn:mime-type = text/plain
More information about the asterisk-addons-commits
mailing list