Splitting MySQL_Session::get_pkts_from_client()

Adding the following methods:
* handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_RESET()
* handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_CLOSE()
* handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_SEND_LONG_DATA()
pull/2738/head
René Cannaò 6 years ago
parent 4bed506067
commit 4b2107b7c3

@ -131,6 +131,9 @@ class MySQL_Session
void add_ldap_comment_to_pkt(PtrSize_t *);
int get_pkts_from_client(bool&, PtrSize_t&);
void handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_RESET(PtrSize_t&);
void handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_CLOSE(PtrSize_t&);
void handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_SEND_LONG_DATA(PtrSize_t&);
public:
bool handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, const char *var_name, const char *var_value, bool no_quote=false, bool set_transaction=false);

@ -3075,52 +3075,13 @@ __get_pkts_from_client:
handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_CHANGE_USER(&pkt, &wrong_pass);
break;
case _MYSQL_COM_STMT_RESET:
{
uint32_t stmt_global_id=0;
memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
SLDH->reset(stmt_global_id);
l_free(pkt.size,pkt.ptr);
client_myds->setDSS_STATE_QUERY_SENT_NET();
unsigned int nTrx=NumActiveTransactions();
uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 );
if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT;
client_myds->myprot.generate_pkt_OK(true,NULL,NULL,1,0,0,setStatus,0,NULL);
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
}
handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_RESET(pkt);
break;
case _MYSQL_COM_STMT_CLOSE:
{
uint32_t client_global_id=0;
memcpy(&client_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
// FIXME: no input validation
uint64_t stmt_global_id=0;
stmt_global_id=client_myds->myconn->local_stmts->find_global_stmt_id_from_client(client_global_id);
SLDH->reset(client_global_id);
if (stmt_global_id) {
sess_STMTs_meta->erase(stmt_global_id);
}
client_myds->myconn->local_stmts->client_close(client_global_id);
}
l_free(pkt.size,pkt.ptr);
// FIXME: this is not complete. Counters should be decreased
thread->status_variables.stvar[st_var_frontend_stmt_close]++;
thread->status_variables.stvar[st_var_queries]++;
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_CLOSE(pkt);
break;
case _MYSQL_COM_STMT_SEND_LONG_DATA:
{
// FIXME: no input validation
uint32_t stmt_global_id=0;
memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
uint32_t stmt_param_id=0;
memcpy(&stmt_param_id,(char *)pkt.ptr+9,sizeof(uint16_t));
SLDH->add(stmt_global_id,stmt_param_id,(char *)pkt.ptr+11,pkt.size-11);
}
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
l_free(pkt.size,pkt.ptr);
handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_SEND_LONG_DATA(pkt);
break;
case _MYSQL_COM_STMT_PREPARE:
if (session_type != PROXYSQL_SESSION_MYSQL) { // only MySQL module supports prepared statement!!
@ -6489,3 +6450,49 @@ bool MySQL_Session::has_any_backend() {
}
return false;
}
void MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_RESET(PtrSize_t& pkt) {
uint32_t stmt_global_id=0;
memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
SLDH->reset(stmt_global_id);
l_free(pkt.size,pkt.ptr);
client_myds->setDSS_STATE_QUERY_SENT_NET();
unsigned int nTrx=NumActiveTransactions();
uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 );
if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT;
client_myds->myprot.generate_pkt_OK(true,NULL,NULL,1,0,0,setStatus,0,NULL);
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
}
void MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_CLOSE(PtrSize_t& pkt) {
uint32_t client_global_id=0;
memcpy(&client_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
// FIXME: no input validation
uint64_t stmt_global_id=0;
stmt_global_id=client_myds->myconn->local_stmts->find_global_stmt_id_from_client(client_global_id);
SLDH->reset(client_global_id);
if (stmt_global_id) {
sess_STMTs_meta->erase(stmt_global_id);
}
client_myds->myconn->local_stmts->client_close(client_global_id);
l_free(pkt.size,pkt.ptr);
// FIXME: this is not complete. Counters should be decreased
thread->status_variables.stvar[st_var_frontend_stmt_close]++;
thread->status_variables.stvar[st_var_queries]++;
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
}
void MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_STMT_SEND_LONG_DATA(PtrSize_t& pkt) {
// FIXME: no input validation
uint32_t stmt_global_id=0;
memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t));
uint32_t stmt_param_id=0;
memcpy(&stmt_param_id,(char *)pkt.ptr+9,sizeof(uint16_t));
SLDH->add(stmt_global_id,stmt_param_id,(char *)pkt.ptr+11,pkt.size-11);
client_myds->DSS=STATE_SLEEP;
status=WAITING_CLIENT_DATA;
l_free(pkt.size,pkt.ptr);
}

Loading…
Cancel
Save