@ -49,6 +49,29 @@ MySQL_Connection_userinfo::~MySQL_Connection_userinfo() {
if ( schemaname ) free ( schemaname ) ;
}
void MySQL_Connection : : compute_unknown_transaction_status ( ) {
if ( mysql ) {
int _myerrno = mysql_errno ( mysql ) ;
if ( _myerrno = = 0 ) {
unknown_transaction_status = false ; // no error
return ;
}
if ( _myerrno > = 2000 & & _myerrno < 3000 ) { // client error
// do not change it
return ;
}
if ( _myerrno > = 1000 & & _myerrno < 2000 ) { // server error
unknown_transaction_status = true ;
return ;
}
if ( _myerrno > = 3000 & & _myerrno < 4000 ) { // server error
unknown_transaction_status = true ;
return ;
}
// all other cases, server error
}
}
uint64_t MySQL_Connection_userinfo : : compute_hash ( ) {
int l = 0 ;
if ( username )
@ -190,6 +213,7 @@ MySQL_Connection::MySQL_Connection() {
multiplex_delayed = false ;
MyRS = NULL ;
MyRS_reuse = NULL ;
unknown_transaction_status = false ;
creation_time = 0 ;
processing_multi_statement = false ;
proxy_debug ( PROXY_DEBUG_MYSQL_CONNPOOL , 4 , " Creating new MySQL_Connection %p \n " , this ) ;
@ -1004,6 +1028,14 @@ handler_again:
}
break ;
case ASYNC_QUERY_END :
if ( mysql ) {
int _myerrno = mysql_errno ( mysql ) ;
if ( _myerrno = = 0 ) {
unknown_transaction_status = false ;
} else {
compute_unknown_transaction_status ( ) ;
}
}
if ( mysql_result ) {
mysql_free_result ( mysql_result ) ;
mysql_result = NULL ;
@ -1160,6 +1192,7 @@ int MySQL_Connection::async_connect(short event) {
return 0 ;
}
if ( async_state_machine = = ASYNC_CONNECT_SUCCESSFUL ) {
compute_unknown_transaction_status ( ) ;
async_state_machine = ASYNC_IDLE ;
myds - > wait_until = 0 ;
creation_time = monotonic_time ( ) ;
@ -1168,6 +1201,7 @@ int MySQL_Connection::async_connect(short event) {
handler ( event ) ;
switch ( async_state_machine ) {
case ASYNC_CONNECT_SUCCESSFUL :
compute_unknown_transaction_status ( ) ;
async_state_machine = ASYNC_IDLE ;
myds - > wait_until = 0 ;
return 0 ;
@ -1246,6 +1280,7 @@ int MySQL_Connection::async_query(short event, char *stmt, unsigned long length,
}
if ( async_state_machine = = ASYNC_QUERY_END ) {
compute_unknown_transaction_status ( ) ;
if ( mysql_errno ( mysql ) ) {
return - 1 ;
} else {
@ -1255,6 +1290,7 @@ int MySQL_Connection::async_query(short event, char *stmt, unsigned long length,
if ( async_state_machine = = ASYNC_STMT_EXECUTE_END ) {
query . stmt_meta = NULL ;
async_state_machine = ASYNC_QUERY_END ;
compute_unknown_transaction_status ( ) ;
if ( mysql_stmt_errno ( query . stmt ) ) {
return - 1 ;
} else {
@ -1263,6 +1299,7 @@ int MySQL_Connection::async_query(short event, char *stmt, unsigned long length,
}
if ( async_state_machine = = ASYNC_STMT_PREPARE_SUCCESSFUL | | async_state_machine = = ASYNC_STMT_PREPARE_FAILED ) {
query . stmt_meta = NULL ;
compute_unknown_transaction_status ( ) ;
if ( async_state_machine = = ASYNC_STMT_PREPARE_FAILED ) {
return - 1 ;
} else {
@ -1296,6 +1333,7 @@ int MySQL_Connection::async_ping(short event) {
assert ( ret_mysql ) ;
switch ( async_state_machine ) {
case ASYNC_PING_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1315,6 +1353,7 @@ int MySQL_Connection::async_ping(short event) {
// check again
switch ( async_state_machine ) {
case ASYNC_PING_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1337,6 +1376,7 @@ int MySQL_Connection::async_change_user(short event) {
assert ( ret_mysql ) ;
switch ( async_state_machine ) {
case ASYNC_CHANGE_USER_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1356,6 +1396,7 @@ int MySQL_Connection::async_change_user(short event) {
// check again
switch ( async_state_machine ) {
case ASYNC_CHANGE_USER_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1378,6 +1419,7 @@ int MySQL_Connection::async_select_db(short event) {
assert ( ret_mysql ) ;
switch ( async_state_machine ) {
case ASYNC_INITDB_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1394,6 +1436,7 @@ int MySQL_Connection::async_select_db(short event) {
// check again
switch ( async_state_machine ) {
case ASYNC_INITDB_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1413,6 +1456,7 @@ int MySQL_Connection::async_set_autocommit(short event, bool ac) {
assert ( ret_mysql ) ;
switch ( async_state_machine ) {
case ASYNC_SET_AUTOCOMMIT_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1430,6 +1474,7 @@ int MySQL_Connection::async_set_autocommit(short event, bool ac) {
// check again
switch ( async_state_machine ) {
case ASYNC_SET_AUTOCOMMIT_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1449,6 +1494,7 @@ int MySQL_Connection::async_set_names(short event, uint8_t c) {
assert ( ret_mysql ) ;
switch ( async_state_machine ) {
case ASYNC_SET_NAMES_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1466,6 +1512,7 @@ int MySQL_Connection::async_set_names(short event, uint8_t c) {
// check again
switch ( async_state_machine ) {
case ASYNC_SET_NAMES_SUCCESSFUL :
unknown_transaction_status = false ;
async_state_machine = ASYNC_IDLE ;
return 0 ;
break ;
@ -1510,6 +1557,7 @@ void MySQL_Connection::async_free_result() {
mysql_result = NULL ;
}
}
compute_unknown_transaction_status ( ) ;
async_state_machine = ASYNC_IDLE ;
if ( MyRS ) {
if ( MyRS_reuse ) {
@ -1525,7 +1573,7 @@ bool MySQL_Connection::IsActiveTransaction() {
bool ret = false ;
if ( mysql ) {
ret = ( mysql - > server_status & SERVER_STATUS_IN_TRANS ) ;
if ( ret = = false & & ( mysql ) - > net . last_errno ) {
if ( ret = = false & & ( mysql ) - > net . last_errno & & unknown_transaction_status = = true ) {
ret = true ;
}
if ( ret = = false ) {
@ -1710,6 +1758,7 @@ int MySQL_Connection::async_send_simple_command(short event, char *stmt, unsigne
proxy_error ( " Retrieved a resultset while running a simple command. This is an error!! Simple command: %s \n " , stmt ) ;
}
if ( async_state_machine = = ASYNC_QUERY_END ) {
compute_unknown_transaction_status ( ) ;
if ( mysql_errno ( mysql ) ) {
return - 1 ;
} else {