[Asterisk-cvs] asterisk-addons res_config_mysql.c,1.9,1.10
kpfleming
kpfleming
Thu Oct 13 16:49:17 CDT 2005
Update of /usr/cvsroot/asterisk-addons
In directory mongoose.digium.com:/tmp/cvs-serv21894
Modified Files:
res_config_mysql.c
Log Message:
handle connection locking more properly (issue #4973)
Index: res_config_mysql.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/res_config_mysql.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- res_config_mysql.c 26 Aug 2005 20:34:41 -0000 1.9
+++ res_config_mysql.c 13 Oct 2005 20:43:54 -0000 1.10
@@ -8,6 +8,8 @@
*
* res_config_mysql.c <mysql plugin for RealTime configuration engine>
*
+ * v2.0 - (10-07-05) - mutex_lock fixes (bug #4973, comment #0034602)
+ *
* v1.9 - (08-19-05) - Added support to correctly honor the family database specified
* in extconfig.conf (bug #4973)
*
@@ -123,11 +125,12 @@
ast_log(LOG_DEBUG, "MySQL RealTime: Retrieve SQL: %s\n", sql);
/* We now have our complete statement; Lets connect to the server and execute it. */
+ ast_mutex_lock(&mysql_lock);
if(!mysql_reconnect(database)) {
+ ast_mutex_unlock(&mysql_lock);
return NULL;
}
- ast_mutex_lock(&mysql_lock);
if(mysql_real_query(&mysql, sql, strlen(sql))) {
ast_log(LOG_WARNING, "MySQL RealTime: Failed to query database. Check debug for more info.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Query: %s\n", sql);
@@ -234,11 +237,12 @@
ast_log(LOG_DEBUG, "MySQL RealTime: Retrieve SQL: %s\n", sql);
/* We now have our complete statement; Lets connect to the server and execute it. */
+ ast_mutex_lock(&mysql_lock);
if(!mysql_reconnect(database)) {
+ ast_mutex_unlock(&mysql_lock);
return NULL;
}
- ast_mutex_lock(&mysql_lock);
if(mysql_real_query(&mysql, sql, strlen(sql))) {
ast_log(LOG_WARNING, "MySQL RealTime: Failed to query database. Check debug for more info.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Query: %s\n", sql);
@@ -317,17 +321,18 @@
ast_log(LOG_DEBUG,"MySQL RealTime: Update SQL: %s\n", sql);
/* We now have our complete statement; Lets connect to the server and execute it. */
+ ast_mutex_lock(&mysql_lock);
if(!mysql_reconnect(database)) {
- return -1;
+ ast_mutex_unlock(&mysql_lock);
+ return -1;
}
- ast_mutex_lock(&mysql_lock);
if(mysql_real_query(&mysql, sql, strlen(sql))) {
ast_log(LOG_WARNING, "MySQL RealTime: Failed to query database. Check debug for more info.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Query: %s\n", sql);
ast_log(LOG_DEBUG, "MySQL RealTime: Query Failed because: %s\n", mysql_error(&mysql));
ast_mutex_unlock(&mysql_lock);
- return -1;
+ return -1;
}
numrows = mysql_affected_rows(&mysql);
@@ -335,14 +340,14 @@
ast_log(LOG_DEBUG,"MySQL RealTime: Updated %llu rows on table: %s\n", numrows, table);
- /* From http://dev.mysql.com/doc/mysql/en/mysql-affected-rows.html
- * An integer greater than zero indicates the number of rows affected
- * Zero indicates that no records were updated
- * -1 indicates that the query returned an error (although, if the query failed, it should have been caught above.)
- */
+ /* From http://dev.mysql.com/doc/mysql/en/mysql-affected-rows.html
+ * An integer greater than zero indicates the number of rows affected
+ * Zero indicates that no records were updated
+ * -1 indicates that the query returned an error (although, if the query failed, it should have been caught above.)
+ */
- if(numrows >= 0)
- return (int)numrows;
+ if(numrows >= 0)
+ return (int)numrows;
return -1;
}
@@ -373,7 +378,9 @@
ast_log(LOG_DEBUG, "MySQL RealTime: Static SQL: %s\n", sql);
/* We now have our complete statement; Lets connect to the server and execute it. */
+ ast_mutex_lock(&mysql_lock);
if(!mysql_reconnect(database)) {
+ ast_mutex_unlock(&mysql_lock);
return NULL;
}
@@ -437,6 +444,8 @@
{
parse_config();
+ ast_mutex_lock(&mysql_lock);
+
if(!mysql_reconnect(NULL)) {
ast_log(LOG_WARNING, "MySQL RealTime: Couldn't establish connection. Check debug.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Cannot Connect: %s\n", mysql_error(&mysql));
@@ -448,6 +457,8 @@
}
ast_cli_register(&cli_realtime_mysql_status);
+ ast_mutex_unlock(&mysql_lock);
+
return 0;
}
@@ -480,9 +491,6 @@
connected = 0;
parse_config();
- /* Need to unlock so that mysql_reconnect can regain the lock. */
- ast_mutex_unlock(&mysql_lock);
-
if(!mysql_reconnect(NULL)) {
ast_log(LOG_WARNING, "MySQL RealTime: Couldn't establish connection. Check debug.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Cannot Connect: %s\n", mysql_error(&mysql));
@@ -490,6 +498,9 @@
ast_verbose(VERBOSE_PREFIX_2 "MySQL RealTime reloaded.\n");
+ /* Done reloading. Release lock so others can now use driver. */
+ ast_mutex_unlock(&mysql_lock);
+
return 0;
}
@@ -587,25 +598,23 @@
else
ast_copy_string(my_database, database, sizeof(my_database));
- ast_mutex_lock(&mysql_lock);
+ /* mutex lock should have been locked before calling this function. */
+
if((!connected) && (dbhost || dbsock) && dbuser && dbpass && my_database) {
if(!mysql_init(&mysql)) {
ast_log(LOG_WARNING, "MySQL RealTime: Insufficient memory to allocate MySQL resource.\n");
connected = 0;
- ast_mutex_unlock(&mysql_lock);
return 0;
}
if(mysql_real_connect(&mysql, dbhost, dbuser, dbpass, my_database, dbport, dbsock, 0)) {
ast_log(LOG_DEBUG, "MySQL RealTime: Successfully connected to database.\n");
connected = 1;
connect_time = time(NULL);
- ast_mutex_unlock(&mysql_lock);
return 1;
} else {
ast_log(LOG_ERROR, "MySQL RealTime: Failed to connect database server %s on %s. Check debug for more info.\n", dbname, dbhost);
ast_log(LOG_DEBUG, "MySQL RealTime: Cannot Connect: %s\n", mysql_error(&mysql));
connected = 0;
- ast_mutex_unlock(&mysql_lock);
return 0;
}
} else {
@@ -613,7 +622,6 @@
connected = 0;
ast_log(LOG_ERROR, "MySQL RealTime: Failed to reconnect. Check debug for more info.\n");
ast_log(LOG_DEBUG, "MySQL RealTime: Server Error: %s\n", mysql_error(&mysql));
- ast_mutex_unlock(&mysql_lock);
return 0;
}
@@ -622,12 +630,10 @@
if(mysql_select_db(&mysql, my_database) != 0) {
ast_log(LOG_WARNING, "MySQL RealTime: Unable to select database: %s. Still Connected.\n", my_database);
ast_log(LOG_DEBUG, "MySQL RealTime: Database Select Failed: %s\n", mysql_error(&mysql));
- ast_mutex_unlock(&mysql_lock);
return 0;
}
ast_log(LOG_DEBUG, "MySQL RealTime: Everything is fine.\n");
- ast_mutex_unlock(&mysql_lock);
return 1;
}
}
More information about the svn-commits
mailing list