Index: funcs/func_odbc.c =================================================================== --- funcs/func_odbc.c (revision 39497) +++ funcs/func_odbc.c (working copy) @@ -235,7 +235,7 @@ struct odbc_obj *obj; struct acf_odbc_query *query; char sql[2048] = "", varname[15]; - int res, x, buflen = 0, escapecommas; + int res, x, buflen = 0, escapecommas, retry=0; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(field)[100]; ); @@ -261,13 +261,11 @@ } obj = odbc_request_obj(query->dsn, 0); - if (!obj) { ast_log(LOG_ERROR, "No such DSN registered (or out of connections): %s (check res_odbc.conf)\n", query->dsn); AST_LIST_UNLOCK(&queries); return -1; } - #ifdef NEEDTRACE SQLSetConnectAttr(obj->con, SQL_ATTR_TRACE, &enable, SQL_IS_INTEGER); SQLSetConnectAttr(obj->con, SQL_ATTR_TRACEFILE, tracefile, strlen(tracefile)); @@ -291,10 +289,16 @@ escapecommas = ast_test_flag(query, OPT_ESCAPECOMMAS); AST_LIST_UNLOCK(&queries); - +retry_read: res = SQLAllocHandle (SQL_HANDLE_STMT, obj->con, &stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n"); + odbc_release_obj(obj); + obj = odbc_request_obj(query->dsn, 1); + if (!retry) { + retry = 1; + goto retry_read; + } return -1; } @@ -302,6 +306,12 @@ if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql); SQLFreeHandle (SQL_HANDLE_STMT, stmt); + odbc_release_obj(obj); + obj = odbc_request_obj(query->dsn, 1); + if (!retry) { + retry = 1; + goto retry_read; + } return -1; } @@ -309,6 +319,12 @@ if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Execute error!\n[%s]\n\n", sql); SQLFreeHandle (SQL_HANDLE_STMT, stmt); + odbc_release_obj(obj); + obj = odbc_request_obj(query->dsn, 1); + if (!retry) { + retry = 1; + goto retry_read; + } return -1; }