MXS-2512 Do not recalculate information that exists

As the end of the error packet is known, it is better to pass
around an iterator to that instead of recalculating it.
This commit is contained in:
Johan Wikman 2019-06-10 14:07:35 +03:00
parent 9d1f094c45
commit b09a4e676d
2 changed files with 19 additions and 10 deletions

View File

@ -244,9 +244,19 @@ private:
bool m_skip_next = false;
Error m_error;
void process_reply_start(mxs::Buffer::iterator it, uint32_t len);
/**
* @param it Iterator pointing to the command byte of an error packet.
* @param end Iterator pointing one past the end of the error packet.
*/
void process_reply_start(mxs::Buffer::iterator it, mxs::Buffer::iterator end);
void update_error(mxs::Buffer::iterator it, uint32_t len);
/**
* Update @c m_error.
*
* @param it Iterator that points to the first byte of the error code in an error packet.
* @param end Iterator pointing one past the end of the error packet.
*/
void update_error(mxs::Buffer::iterator it, mxs::Buffer::iterator end);
inline bool is_opening_cursor() const
{

View File

@ -241,7 +241,7 @@ bool is_last_eof(Iter it)
return (status & SERVER_MORE_RESULTS_EXIST) == 0;
}
void RWBackend::process_reply_start(Iter it, uint32_t len)
void RWBackend::process_reply_start(Iter it, mxs::Buffer::iterator end)
{
uint8_t cmd = *it;
m_local_infile_requested = false;
@ -264,7 +264,7 @@ void RWBackend::process_reply_start(Iter it, uint32_t len)
case MYSQL_REPLY_ERR:
// Nothing ever follows an error packet
++it;
update_error(it, len);
update_error(it, end);
set_reply_state(REPLY_STATE_DONE);
break;
@ -321,7 +321,7 @@ void RWBackend::process_packets(GWBUF* result)
switch (m_reply_state)
{
case REPLY_STATE_START:
process_reply_start(it, len);
process_reply_start(it, end);
break;
case REPLY_STATE_DONE:
@ -361,7 +361,7 @@ void RWBackend::process_packets(GWBUF* result)
else if (cmd == MYSQL_REPLY_ERR)
{
++it;
update_error(it, len);
update_error(it, end);
set_reply_state(REPLY_STATE_DONE);
}
break;
@ -454,7 +454,7 @@ mxs::SRWBackends RWBackend::from_servers(SERVER_REF* servers)
return backends;
}
void RWBackend::update_error(mxs::Buffer::iterator it, uint32_t len)
void RWBackend::update_error(mxs::Buffer::iterator it, mxs::Buffer::iterator end)
{
uint16_t code = 0;
code |= (*it++);
@ -463,9 +463,8 @@ void RWBackend::update_error(mxs::Buffer::iterator it, uint32_t len)
auto sql_state_begin = it;
it.advance(5);
auto sql_state_end = it;
auto message_begin = it;
it.advance(len - (1 + 2 + 1 + 5));
auto message_end = it;
auto message_begin = sql_state_end;
auto message_end = end;
m_error.set(code, sql_state_begin, sql_state_end, message_begin, message_end);
}