MaxScale/server/core/session_command.cc
2018-12-05 11:12:20 +02:00

92 lines
1.8 KiB
C++

/*
* Copyright (c) 2016 MariaDB Corporation Ab
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
*
* Change Date: 2022-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2 or later of the General
* Public License.
*/
#include <maxscale/session_command.hh>
#include <maxscale/modutil.hh>
#include <maxscale/protocol/mysql.hh>
namespace maxscale
{
uint8_t SessionCommand::get_command() const
{
return m_command;
}
uint64_t SessionCommand::get_position() const
{
return m_pos;
}
GWBUF* SessionCommand::deep_copy_buffer()
{
GWBUF* temp = m_buffer.release();
GWBUF* rval = gwbuf_deep_clone(temp);
m_buffer.reset(temp);
return rval;
}
SessionCommand::SessionCommand(GWBUF* buffer, uint64_t id)
: m_buffer(buffer)
, m_command(0)
, m_pos(id)
, m_reply_sent(false)
{
if (buffer)
{
gwbuf_copy_data(buffer, MYSQL_HEADER_LEN, 1, &m_command);
}
}
SessionCommand::~SessionCommand()
{
}
bool SessionCommand::eq(const SessionCommand& rhs) const
{
return rhs.m_buffer.compare(m_buffer) == 0;
}
std::string SessionCommand::to_string()
{
std::string str;
char* sql;
int sql_len;
/** TODO: Create C++ versions of modutil functions */
GWBUF* buf = m_buffer.release();
if (!GWBUF_IS_CONTIGUOUS(buf))
{
buf = gwbuf_make_contiguous(buf);
}
if (modutil_extract_SQL(buf, &sql, &sql_len))
{
str.append(sql, sql_len);
}
m_buffer.reset(buf);
return str;
}
void SessionCommand::mark_as_duplicate(const SessionCommand& rhs)
{
mxb_assert(eq(rhs));
// The commands now share the mxs::Buffer that contains the actual command
m_buffer = rhs.m_buffer;
}
}