[Freeswitch-svn] [commit] r6277 - freeswitch/trunk/src

Freeswitch SVN anthm at freeswitch.org
Thu Nov 15 12:24:53 EST 2007


Author: anthm
Date: Thu Nov 15 12:24:53 2007
New Revision: 6277

Modified:
   freeswitch/trunk/src/switch_odbc.c

Log:
fix MODENDP-36

Modified: freeswitch/trunk/src/switch_odbc.c
==============================================================================
--- freeswitch/trunk/src/switch_odbc.c	(original)
+++ freeswitch/trunk/src/switch_odbc.c	Thu Nov 15 12:24:53 2007
@@ -97,9 +97,6 @@
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Disconnectiong [%s]\n", handle->dsn);
 		}
 	} 
-	//else {
-	//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "[%s] already disconnected\n", handle->dsn);
-	//}
 
 	handle->state = SWITCH_ODBC_STATE_DOWN;
 
@@ -163,17 +160,16 @@
 	}
 
 	result = SQLGetInfo(handle->con, SQL_DRIVER_NAME, (SQLCHAR*)handle->odbc_driver, 255, &valueLength);
-	if ( result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO)
-	{
+	if ( result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO) {
 		for (i = 0; i < valueLength; ++i)
 			handle->odbc_driver[i] = (char)toupper(handle->odbc_driver[i]);
 	}
 
-	//Firebird do not support "SELECT 1"
-	if (strstr(handle->odbc_driver, "FIREBIRD") != 0 || strstr(handle->odbc_driver, "FB32") != 0 || strstr(handle->odbc_driver, "FB64") != 0)
+	if (strstr(handle->odbc_driver, "FIREBIRD") != 0 || strstr(handle->odbc_driver, "FB32") != 0 || strstr(handle->odbc_driver, "FB64") != 0) {
 		handle->is_firebird = TRUE;
-	else
+	} else {
 		handle->is_firebird = FALSE;
+	}
 
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connected to [%s]\n", handle->dsn);
 	handle->state = SWITCH_ODBC_STATE_CONNECTED;
@@ -190,20 +186,22 @@
 	switch_event_t *event;
 	switch_odbc_status_t recon = 0;
 	char *err_str = NULL;
-	SQLCHAR sql[255];
-
-	//Firebird do not support "SELECT 1"
-	sql[0] = 0;
-	if (handle->is_firebird)
-		strcpy((char*)sql, "select first 1 * from RDB$RELATIONS");
-	else
-		strcpy((char*)sql, "select 1");
+	SQLCHAR sql[255] = "";
+	int max_tries = 120;
 
+ top:
+	
 	if (!handle) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "No DB Handle\n");
 		goto done;
 	}
 
+	if (handle->is_firebird) {
+		strcpy((char*)sql, "select first 1 * from RDB$RELATIONS");
+	} else {
+		strcpy((char*)sql, "select 1");
+	}
+
     if (SQLAllocHandle(SQL_HANDLE_STMT, handle->con, &stmt) != SQL_SUCCESS) {
         goto error;
     }
@@ -217,17 +215,18 @@
 	SQLRowCount(stmt, &m);
 	ret = (int) m;
 
+	if (result < 0 || m < 0) {
+		goto error;
+	}
+
 	goto done;
 
  error:
 	err_str = switch_odbc_handle_get_error(handle, stmt);
+	recon = switch_odbc_handle_connect(handle);
 
-	// No need to reconnect if we can get the string anyway.
-	if (err_str == 0)
-	{
-		recon = switch_odbc_handle_connect(handle);
-		err_str = switch_odbc_handle_get_error(handle, stmt);
-	}
+	
+	max_tries--;
 
 	if (switch_event_create(&event, SWITCH_EVENT_TRAP) == SWITCH_STATUS_SUCCESS) {
 		switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Failure-Message", "The sql server is not responding for DSN %s [%s]", 
@@ -242,8 +241,21 @@
 			switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Additional-Info", "The connection could not be re-established");
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "The connection could not be re-established\n");
 		}
+		if (!max_tries) {
+			switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Additional-Info", "Giving up!");
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Giving up!\n");
+		}
+
 		switch_event_fire(&event);
 	}
+
+	if (!max_tries) {
+		goto done;
+	}
+
+	switch_safe_free(err_str);
+	switch_yield(1000000);
+	goto top;
 	
  done:
 



More information about the Freeswitch-svn mailing list