Index: mysql-vm-routines.h =================================================================== RCS file: /usr/cvsroot/asterisk-addons/Attic/mysql-vm-routines.h,v retrieving revision 1.7.2.4 diff -u -r1.7.2.4 mysql-vm-routines.h --- mysql-vm-routines.h 24 Feb 2005 20:56:21 -0000 1.7.2.4 +++ mysql-vm-routines.h 28 Aug 2005 04:34:48 -0000 @@ -2,34 +2,79 @@ * to use mysql-vm-routines, set USE_MYSQL_VM_INTERFACE to 1 * in asterisk/apps/Makefile , then put this file into * asterisk/apps/ and (re)build asterisk. + * + * Joseph Benden 2005-08-28 + * Ensure we reconnect to the database if it disappears + * */ -MYSQL *dbhandler=NULL; +#include + +MYSQL dbhandler; ast_mutex_t mysqllock; char dbuser[80]; char dbpass[80]; char dbhost[80]; char dbname[80]; +int connected; +int dbtimeout = 20; static int mysql_login(void) { - ast_verbose( VERBOSE_PREFIX_3 "Logging into database with user %s, password %s, and database %s\n", dbuser, dbpass, dbname); - - dbhandler=mysql_init(NULL); - if (!mysql_real_connect(dbhandler, dbhost[0] ? dbhost : NULL, dbuser, dbpass, dbname, 0, NULL, 0)) { - ast_log(LOG_WARNING, "Error Logging into database\n"); - return(-1); - } + connected = 0; ast_mutex_init(&mysqllock); return(0); } static void mysql_logout(void) { - mysql_close(dbhandler); + connected = 0; + mysql_close(&dbhandler); } -#ifdef USESQLVM +static int mysql_check_connection(void) +{ + int retries = 5; + + ast_mutex_lock(&mysqllock); + +db_reconnect: + if (!connected) { + ast_verbose( VERBOSE_PREFIX_3 "Logging into database with user %s, password %s, and database %s\n", dbuser, dbpass, dbname); + mysql_init(&dbhandler); + if (dbtimeout && mysql_options(&dbhandler, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&dbtimeout)!=0) { + ast_log(LOG_ERROR, "mysql_options returned (%d) %s\n", mysql_errno(&dbhandler), mysql_error(&dbhandler)); + } + if (!mysql_real_connect(&dbhandler, dbhost, dbuser, dbpass, dbname, 3306, NULL, 0)) { + ast_log(LOG_ERROR, "mysql_real_connect returned (%d) %s\n", mysql_errno(&dbhandler), mysql_error(&dbhandler)); + connected = 0; + } else { + connected = 1; + } + } else { + int error; + if ((error = mysql_ping(&dbhandler))) { + connected = 0; + error = mysql_errno(&dbhandler); + switch (error) { + case CR_SERVER_GONE_ERROR: + case CR_SERVER_LOST: + ast_log(LOG_WARNING, "Server has gone away. Attempting to reconnect.\n"); + break; + default: + ast_log(LOG_ERROR, "Unknown connection error (%d) %s\n", mysql_errno(&dbhandler), mysql_error(&dbhandler)); + } + mysql_close(&dbhandler); + retries--; + if (retries) + goto db_reconnect; + } + } + ast_mutex_unlock(&mysqllock); + return connected; +} + +#ifdef USEMYSQLVM static struct ast_vm_user *find_user(struct ast_vm_user *ivm, char *context, char *mailbox) { MYSQL_RES *result; @@ -40,6 +85,8 @@ char options[160] = ""; struct ast_vm_user *retval; + if (!mysql_check_connection()) return(NULL); + retval=malloc(sizeof(struct ast_vm_user)); if (retval) { @@ -66,8 +113,8 @@ return(NULL); } ast_mutex_lock(&mysqllock); - mysql_query(dbhandler, query); - if ((result=mysql_store_result(dbhandler))!=NULL) { + mysql_query(&dbhandler, query); + if ((result=mysql_store_result(&dbhandler))!=NULL) { if ((rowval=mysql_fetch_row(result))!=NULL) { numFields=mysql_num_fields(result); fields=mysql_fetch_fields(result); @@ -106,6 +153,8 @@ { char query[400]; + if (!mysql_check_connection()) return; + if (*vmu->context) { snprintf(query, sizeof(query)-1, "UPDATE users SET password='%s' WHERE context='%s' AND mailbox='%s' AND password='%s'", password, vmu->context, vmu->mailbox, vmu->password); } else { @@ -114,7 +163,7 @@ snprintf(query, sizeof(query)-1, "UPDATE users SET password='%s' WHERE mailbox='%s' AND password='%s' AND context='default'", password, vmu->mailbox, vmu->password); } ast_mutex_lock(&mysqllock); - mysql_query(dbhandler, query); + mysql_query(&dbhandler, query); strcpy(vmu->password, password); ast_mutex_unlock(&mysqllock); } @@ -123,6 +172,8 @@ { char query[320]; + if (!mysql_check_connection()) return; + if (context) { snprintf(query, sizeof(query)-1, "UPDATE users SET password='%s' WHERE context='%s' AND mailbox='%s'", password, context, mailbox); } else { @@ -131,7 +182,7 @@ snprintf(query, sizeof(query)-1, "UPDATE users SET password='%s' WHERE mailbox='%s' AND context='default'", password, mailbox); } ast_mutex_lock(&mysqllock); - mysql_query(dbhandler, query); + mysql_query(&dbhandler, query); ast_mutex_unlock(&mysqllock); } #endif @@ -149,3 +200,4 @@ { mysql_logout(); } +