diff -r -u ../../MyODBC-3.51.11-vanilla/driver/connect.c ./connect.c --- ../../MyODBC-3.51.11-vanilla/driver/connect.c 2005-01-31 20:12:14.000000000 +0100 +++ ./connect.c 2005-08-02 19:57:56.283165208 +0200 @@ -83,13 +83,13 @@ SQL_AUTOCOMMIT_ON", 0); else if (autocommit_on(dbc) && - (odbc_stmt(dbc,"SET AUTOCOMMIT=0") != SQL_SUCCESS)) + (odbc_stmt(dbc,"SET AUTOCOMMIT=0", 1) != SQL_SUCCESS)) DBUG_RETURN(SQL_ERROR); } else if ((dbc->commit_flag == CHECK_AUTOCOMMIT_ON) && trans_supported(dbc) && !autocommit_on(dbc)) { - if (odbc_stmt(dbc,"SET AUTOCOMMIT=1") != SQL_SUCCESS) + if (odbc_stmt(dbc,"SET AUTOCOMMIT=1", 1) != SQL_SUCCESS) DBUG_RETURN(SQL_ERROR); } @@ -111,7 +111,7 @@ DBUG_PRINT("info",("setting transaction isolation to level '%s'", level)); sprintf(buff,"SET SESSION TRANSACTION ISOLATION LEVEL %s",level); - if (odbc_stmt(dbc,buff) != SQL_SUCCESS) + if (odbc_stmt(dbc,buff, 1) != SQL_SUCCESS) error= SQL_ERROR; } else diff -r -u ../../MyODBC-3.51.11-vanilla/driver/myutil.h ./myutil.h --- ../../MyODBC-3.51.11-vanilla/driver/myutil.h 2005-01-28 23:05:17.000000000 +0100 +++ ./myutil.h 2005-08-02 19:57:02.859286872 +0200 @@ -79,7 +79,7 @@ SQLRETURN SQL_API my_SQLAllocStmt(SQLHDBC hdbc,SQLHSTMT FAR *phstmt); SQLRETURN do_query(STMT FAR *stmt,char *query); char *insert_params(STMT FAR *stmt); -SQLRETURN odbc_stmt(DBC FAR *dbc, const char *query); +SQLRETURN odbc_stmt(DBC FAR *dbc, const char *query, char use_lock); void mysql_link_fields(STMT *stmt,MYSQL_FIELD *fields,uint field_count); void fix_result_types(STMT *stmt); char *fix_str(char *to,char *from,int length); diff -r -u ../../MyODBC-3.51.11-vanilla/driver/options.c ./options.c --- ../../MyODBC-3.51.11-vanilla/driver/options.c 2005-01-31 01:37:51.000000000 +0100 +++ ./options.c 2005-08-02 20:04:14.509666040 +0200 @@ -304,7 +304,12 @@ "Transactions are not enabled", 4000)); if (autocommit_on(dbc)) - DBUG_RETURN(odbc_stmt(dbc,"SET AUTOCOMMIT=0")); + { + SQLRETURN res= odbc_stmt(dbc,"SET AUTOCOMMIT=0", 1); + if (res == SQL_SUCCESS) + dbc->commit_flag= CHECK_AUTOCOMMIT_OFF; + DBUG_RETURN(res); + } } else if (!dbc->server) /* no connection yet */ { @@ -312,7 +317,12 @@ DBUG_RETURN_STATUS(SQL_SUCCESS); } else if (trans_supported(dbc) && !(autocommit_on(dbc))) - DBUG_RETURN(odbc_stmt(dbc,"SET AUTOCOMMIT=1")); + { + SQLRETURN res= odbc_stmt(dbc,"SET AUTOCOMMIT=1", 1); + if (res == SQL_SUCCESS) + dbc->commit_flag= CHECK_AUTOCOMMIT_ON; + DBUG_RETURN(res); + } break; case SQL_ATTR_CONNECTION_TIMEOUT: @@ -398,7 +408,7 @@ else level="READ UNCOMMITTED"; sprintf(buff,"SET SESSION TRANSACTION ISOLATION LEVEL %s",level); - if (odbc_stmt(dbc,buff) == SQL_SUCCESS) + if (odbc_stmt(dbc,buff, 1) == SQL_SUCCESS) dbc->txn_isolation= (SQLINTEGER)ValuePtr; } else diff -r -u ../../MyODBC-3.51.11-vanilla/driver/results.c ./results.c --- ../../MyODBC-3.51.11-vanilla/driver/results.c 2005-01-28 23:05:17.000000000 +0100 +++ ./results.c 2005-08-02 19:59:14.734238832 +0200 @@ -674,7 +674,7 @@ my_bool set_dynamic_result(STMT FAR *stmt) { - if (odbc_stmt(stmt->dbc, stmt->query) != SQL_SUCCESS) + if (odbc_stmt(stmt->dbc, stmt->query, 1) != SQL_SUCCESS) return 1; pthread_mutex_lock(&stmt->dbc->lock); diff -r -u ../../MyODBC-3.51.11-vanilla/driver/utility.c ./utility.c --- ../../MyODBC-3.51.11-vanilla/driver/utility.c 2005-01-28 23:05:17.000000000 +0100 +++ ./utility.c 2005-08-02 20:03:52.591998032 +0200 @@ -43,20 +43,22 @@ @purpose : executes the specified sql statement */ -SQLRETURN odbc_stmt(DBC FAR *dbc, const char *query) +SQLRETURN odbc_stmt(DBC FAR *dbc, const char *query, char use_lock) { SQLRETURN result= SQL_SUCCESS; DBUG_ENTER("odbc_stmt"); DBUG_PRINT("enter",("stmt: %s",query)); - pthread_mutex_lock(&dbc->lock); + if (use_lock) + pthread_mutex_lock(&dbc->lock); if (check_if_server_is_alive(dbc) || mysql_real_query(&dbc->mysql,query,strlen(query))) { result= set_conn_error(dbc,MYERR_S1000,mysql_error(&dbc->mysql), mysql_errno(&dbc->mysql)); } - pthread_mutex_unlock(&dbc->lock); + if (use_lock) + pthread_mutex_unlock(&dbc->lock); DBUG_RETURN(result); } @@ -873,9 +875,24 @@ int result= 0; if ((ulong) (seconds - dbc->last_query_time) >= CHECK_IF_ALIVE) { - if (mysql_ping(&dbc->mysql) && - mysql_errno(&dbc->mysql) == CR_SERVER_GONE_ERROR) - result= 1; + if (mysql_ping(&dbc->mysql)) + { + if (mysql_errno(&dbc->mysql) == CR_SERVER_GONE_ERROR) + result= 1; + else if (!mysql_reconnect(&dbc->mysql)) + { + switch (dbc->commit_flag) { + case CHECK_AUTOCOMMIT_OFF: + result= odbc_stmt(dbc,"SET AUTOCOMMIT=0", 0) != SQL_SUCCESS; + break; + case CHECK_AUTOCOMMIT_ON: + result= odbc_stmt(dbc,"SET AUTOCOMMIT=1", 0) != SQL_SUCCESS; + break; + default: + result= 0; + } + } + } } dbc->last_query_time= seconds; return result; @@ -911,7 +928,7 @@ my_bool reget_current_catalog(DBC FAR *dbc) { my_free((gptr) dbc->database,MYF(0)); - if (odbc_stmt(dbc, "select database()")) + if (odbc_stmt(dbc, "select database()", 1)) { return 1; }