[asterisk-commits] tilghman: trunk r99350 - in /trunk: ./ configs/ include/asterisk/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jan 22 10:39:39 CST 2008


Author: tilghman
Date: Mon Jan 21 12:15:57 2008
New Revision: 99350

URL: http://svn.digium.com/view/asterisk?view=rev&rev=99350
Log:
Merged revisions 99341 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r99341 | tilghman | 2008-01-21 12:11:07 -0600 (Mon, 21 Jan 2008) | 8 lines

Permit the user to specify number of seconds that a connection may remain idle,
which fixes a crash on reconnect with the MyODBC driver.
(closes issue #11798)
 Reported by: Corydon76
 Patches: 
       20080119__res_odbc__idlecheck.diff.txt uploaded by Corydon76 (license 14)
 Tested by: mvanbaak

........

Modified:
    trunk/   (props changed)
    trunk/configs/res_odbc.conf.sample
    trunk/include/asterisk/res_odbc.h
    trunk/res/res_odbc.c

Change Statistics:
 trunk/configs/res_odbc.conf.sample |    5 +++++
 trunk/include/asterisk/res_odbc.h  |    1 +
 trunk/res/res_odbc.c               |   25 ++++++++++++++++++++-----
 3 files changed, 26 insertions(+), 5 deletions(-)

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/configs/res_odbc.conf.sample
URL: http://svn.digium.com/view/asterisk/trunk/configs/res_odbc.conf.sample?view=diff&rev=99350&r1=99349&r2=99350
==============================================================================
--- trunk/configs/res_odbc.conf.sample (original)
+++ trunk/configs/res_odbc.conf.sample Mon Jan 21 12:15:57 2008
@@ -27,6 +27,11 @@
 username => myuser
 password => mypass
 pre-connect => yes
+;
+; On some databases, the connection times out and a reconnection will be
+; necessary.  This setting configures the amount of time a connection
+; may sit idle (in seconds) before a reconnection will be attempted.
+;idlecheck => 3600
 
 ; Certain servers, such as MS SQL Server and Sybase use the TDS protocol, which
 ; limits the number of active queries per connection to 1.  By setting up pools

Modified: trunk/include/asterisk/res_odbc.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/res_odbc.h?view=diff&rev=99350&r1=99349&r2=99350
==============================================================================
--- trunk/include/asterisk/res_odbc.h (original)
+++ trunk/include/asterisk/res_odbc.h Mon Jan 21 12:15:57 2008
@@ -38,6 +38,7 @@
 	ast_mutex_t lock;
 	SQLHDBC  con;                   /* ODBC Connection Handle */
 	struct odbc_class *parent;      /* Information about the connection is protected */
+	struct timeval last_used;
 	unsigned int used:1;
 	unsigned int up:1;
 	AST_LIST_ENTRY(odbc_obj) list;

Modified: trunk/res/res_odbc.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_odbc.c?view=diff&rev=99350&r1=99349&r2=99350
==============================================================================
--- trunk/res/res_odbc.c (original)
+++ trunk/res/res_odbc.c Mon Jan 21 12:15:57 2008
@@ -46,6 +46,7 @@
 #include "asterisk/cli.h"
 #include "asterisk/lock.h"
 #include "asterisk/res_odbc.h"
+#include "asterisk/time.h"
 
 struct odbc_class
 {
@@ -61,6 +62,7 @@
 	unsigned int count:10;          /* Running count of pooled connections */
 	unsigned int delme:1;			/* Purge the class */
 	unsigned int backslash_is_escape:1;	/* On this database, the backslash is a native escape sequence */
+	unsigned int idlecheck;			/* Recheck the connection if it is idle for this long */
 	AST_LIST_HEAD(, odbc_obj) odbc_obj;
 };
 
@@ -135,7 +137,8 @@
 				 */
 				ast_odbc_sanity_check(obj);
 				continue;
-			}
+			} else
+				obj->last_used = ast_tvnow();
 			break;
 		} else if (attempt == 0)
 			ast_odbc_sanity_check(obj);
@@ -180,7 +183,8 @@
 		odbc_obj_connect(obj);
 		res = SQLExecute(stmt);
 #endif
-	}
+	} else
+		obj->last_used = ast_tvnow();
 	
 	return res;
 }
@@ -229,6 +233,7 @@
 	char *cat;
 	const char *dsn, *username, *password, *sanitysql;
 	int enabled, pooling, limit, bse;
+	unsigned int idlecheck;
 	int connect = 0, res = 0;
 	struct ast_flags config_flags = { 0 };
 
@@ -249,7 +254,7 @@
 			/* Reset all to defaults for each class of odbc connections */
 			dsn = username = password = sanitysql = NULL;
 			enabled = 1;
-			connect = 0;
+			connect = idlecheck = 0;
 			pooling = 0;
 			limit = 0;
 			bse = 1;
@@ -267,6 +272,8 @@
 						enabled = 0;
 						break;
 					}
+				} else if (!strcasecmp(v->name, "idlecheck")) {
+					sscanf(v->value, "%d", &idlecheck);
 				} else if (!strcasecmp(v->name, "enabled")) {
 					enabled = ast_true(v->value);
 				} else if (!strcasecmp(v->name, "pre-connect")) {
@@ -323,6 +330,7 @@
 				}
 
 				new->backslash_is_escape = bse ? 1 : 0;
+				new->idlecheck = idlecheck;
 
 				odbc_register_class(new, connect);
 				ast_log(LOG_NOTICE, "Registered ODBC class '%s' dsn->[%s]\n", cat, dsn);
@@ -508,7 +516,9 @@
 
 	if (obj && check) {
 		ast_odbc_sanity_check(obj);
-	}
+	} else if (obj->parent->idlecheck > 0 && ast_tvdiff_ms(ast_tvnow(), obj->last_used) / 1000 > obj->parent->idlecheck)
+		odbc_obj_connect(obj);
+
 	return obj;
 }
 
@@ -576,6 +586,7 @@
 	} else {
 		ast_log(LOG_NOTICE, "res_odbc: Connected to %s [%s]\n", obj->parent->name, obj->parent->dsn);
 		obj->up = 1;
+		obj->last_used = ast_tvnow();
 	}
 
 	ast_mutex_unlock(&obj->lock);
@@ -590,6 +601,7 @@
 	char *cat;
 	const char *dsn, *username, *password, *sanitysql;
 	int enabled, pooling, limit, bse;
+	unsigned int idlecheck;
 	int connect = 0, res = 0;
 	struct ast_flags config_flags = { CONFIG_FLAG_FILEUNCHANGED };
 
@@ -615,7 +627,7 @@
 				/* Reset all to defaults for each class of odbc connections */
 				dsn = username = password = sanitysql = NULL;
 				enabled = 1;
-				connect = 0;
+				connect = idlecheck = 0;
 				pooling = 0;
 				limit = 0;
 				bse = 1;
@@ -632,6 +644,8 @@
 							enabled = 0;
 							break;
 						}
+					} else if (!strcasecmp(v->name, "idlecheck")) {
+						sscanf(v->value, "%ud", &idlecheck);
 					} else if (!strcasecmp(v->name, "enabled")) {
 						enabled = ast_true(v->value);
 					} else if (!strcasecmp(v->name, "pre-connect")) {
@@ -720,6 +734,7 @@
 					}
 
 					new->backslash_is_escape = bse;
+					new->idlecheck = idlecheck;
 
 					if (class) {
 						ast_log(LOG_NOTICE, "Refreshing ODBC class '%s' dsn->[%s]\n", cat, dsn);




More information about the asterisk-commits mailing list