[asterisk-commits] tilghman: trunk r47530 - in /trunk: configs/res_odbc.conf.sample res/res_odbc.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sun Nov 12 22:58:15 MST 2006


Author: tilghman
Date: Sun Nov 12 23:58:14 2006
New Revision: 47530

URL: http://svn.digium.com/view/asterisk?view=rev&rev=47530
Log:
Feature:  allow the sanity SQL to be customized per connection class (Issue 6453)

Modified:
    trunk/configs/res_odbc.conf.sample
    trunk/res/res_odbc.c

Modified: trunk/configs/res_odbc.conf.sample
URL: http://svn.digium.com/view/asterisk/trunk/configs/res_odbc.conf.sample?view=diff&rev=47530&r1=47529&r2=47530
==============================================================================
--- trunk/configs/res_odbc.conf.sample (original)
+++ trunk/configs/res_odbc.conf.sample Sun Nov 12 23:58:14 2006
@@ -15,6 +15,10 @@
 ;username => myuser
 ;password => mypass
 pre-connect => yes
+; What should we execute to ensure that our connection is still alive?  The
+; statement should return a non-zero value in the first field of its first
+; record.  The default is "select 1".
+;sanitysql => select 1
 
 
 [mysql2]
@@ -35,7 +39,7 @@
 username => oscar
 password => thegrouch
 pre-connect => yes
+sanitysql => select count(*) from systables
 
 
 
-

Modified: trunk/res/res_odbc.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_odbc.c?view=diff&rev=47530&r1=47529&r2=47530
==============================================================================
--- trunk/res/res_odbc.c (original)
+++ trunk/res/res_odbc.c Sun Nov 12 23:58:14 2006
@@ -60,6 +60,7 @@
 	char dsn[80];
 	char username[80];
 	char password[80];
+	char sanitysql[256];
 	SQLHENV env;
 	unsigned int haspool:1;         /* Boolean - TDS databases need this */
 	unsigned int limit:10;          /* Gives a limit of 1023 maximum */
@@ -115,17 +116,12 @@
 				 * While this isn't the best way to try to correct an error, this won't automatically
 				 * fail when the statement handle invalidates.
 				 */
-				/* XXX Actually, it might, if we're using a non-pooled connection. Possible race here. XXX */
-				odbc_obj_disconnect(obj);
-				odbc_obj_connect(obj);
+				ast_odbc_sanity_check(obj);
 				continue;
 			}
 			break;
-		} else {
-			ast_log(LOG_WARNING, "SQL Prepare failed.  Attempting a reconnect...\n");
-			odbc_obj_disconnect(obj);
-			odbc_obj_connect(obj);
-		}
+		} else if (attempt == 0)
+			ast_odbc_sanity_check(obj);
 	}
 
 	return stmt;
@@ -179,6 +175,9 @@
 	SQLHSTMT stmt;
 	int res = 0;
 
+	if (obj->parent->sanitysql)
+		test_sql = obj->parent->sanitysql;
+
 	if (obj->up) {
 		res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt);
 		if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
@@ -210,7 +209,7 @@
 	static char *cfg = "res_odbc.conf";
 	struct ast_config *config;
 	struct ast_variable *v;
-	char *cat, *dsn, *username, *password;
+	char *cat, *dsn, *username, *password, *sanitysql;
 	int enabled, pooling, limit;
 	int connect = 0, res = 0;
 
@@ -229,7 +228,7 @@
 			}
 		} else {
 			/* Reset all to defaults for each class of odbc connections */
-			dsn = username = password = NULL;
+			dsn = username = password = sanitysql = NULL;
 			enabled = 1;
 			connect = 0;
 			pooling = 0;
@@ -258,6 +257,8 @@
 					username = v->value;
 				} else if (!strcasecmp(v->name, "password")) {
 					password = v->value;
+				} else if (!strcasecmp(v->name, "sanitysql")) {
+					sanitysql = v->value;
 				}
 			}
 
@@ -277,6 +278,8 @@
 					ast_copy_string(new->username, username, sizeof(new->username));
 				if (password)
 					ast_copy_string(new->password, password, sizeof(new->password));
+				if (sanitysql)
+					ast_copy_string(new->sanitysql, sanitysql, sizeof(new->sanitysql));
 
 				SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &new->env);
 				res = SQLSetEnvAttr(new->env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
@@ -524,7 +527,7 @@
 	static char *cfg = "res_odbc.conf";
 	struct ast_config *config;
 	struct ast_variable *v;
-	char *cat, *dsn, *username, *password;
+	char *cat, *dsn, *username, *password, *sanitysql;
 	int enabled, pooling, limit;
 	int connect = 0, res = 0;
 
@@ -547,7 +550,7 @@
 				}
 			} else {
 				/* Reset all to defaults for each class of odbc connections */
-				dsn = username = password = NULL;
+				dsn = username = password = sanitysql = NULL;
 				enabled = 1;
 				connect = 0;
 				pooling = 0;
@@ -575,6 +578,8 @@
 						username = v->value;
 					} else if (!strcasecmp(v->name, "password")) {
 						password = v->value;
+					} else if (!strcasecmp(v->name, "sanitysql")) {
+						sanitysql = v->value;
 					}
 				}
 
@@ -606,6 +611,8 @@
 						ast_copy_string(new->username, username, sizeof(new->username));
 					if (password)
 						ast_copy_string(new->password, password, sizeof(new->password));
+					if (sanitysql)
+						ast_copy_string(new->sanitysql, sanitysql, sizeof(new->sanitysql));
 
 					if (!class) {
 						SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &new->env);



More information about the asterisk-commits mailing list