diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 049525cd7..76dabf3a1 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -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); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 24826010a..e8770540c 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -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); +}