From f871f0098e8953b2f585eacddaf7415c9ddc307a Mon Sep 17 00:00:00 2001 From: Ujp8LfXBJ6wCPR Date: Sat, 29 Feb 2020 17:14:15 +0100 Subject: Replace MySQL prepared statement union with std::variant (#24158) (cherry picked from commit 3ebcb71c3dc80e0bea9a36207401a033712bda88) --- .../database/Database/MySQLPreparedStatement.cpp | 52 +++++++++++++--------- 1 file changed, 32 insertions(+), 20 deletions(-) (limited to 'src/server/database/Database/MySQLPreparedStatement.cpp') diff --git a/src/server/database/Database/MySQLPreparedStatement.cpp b/src/server/database/Database/MySQLPreparedStatement.cpp index 2e848804902..5fe2ab25658 100644 --- a/src/server/database/Database/MySQLPreparedStatement.cpp +++ b/src/server/database/Database/MySQLPreparedStatement.cpp @@ -187,7 +187,24 @@ void MySQLPreparedStatement::setDouble(const uint8 index, const double value) SetParameterValue(param, MYSQL_TYPE_DOUBLE, &value, sizeof(double), (value > 0.0f)); } -void MySQLPreparedStatement::setBinary(const uint8 index, const std::vector& value, bool isString) +void MySQLPreparedStatement::setString(const uint8 index, const std::string& value) +{ + AssertValidIndex(index); + m_paramsSet[index] = true; + MYSQL_BIND* param = &m_bind[index]; + uint32 len = uint32(value.size()); + param->buffer_type = MYSQL_TYPE_VAR_STRING; + delete [] static_cast(param->buffer); + param->buffer = new char[len]; + param->buffer_length = len; + param->is_null_value = 0; + delete param->length; + param->length = new unsigned long(len); + + memcpy(param->buffer, value.c_str(), len); +} + +void MySQLPreparedStatement::setBinary(const uint8 index, const std::vector& value) { AssertValidIndex(index); m_paramsSet[index] = true; @@ -200,11 +217,6 @@ void MySQLPreparedStatement::setBinary(const uint8 index, const std::vectoris_null_value = 0; delete param->length; param->length = new unsigned long(len); - if (isString) - { - *param->length -= 1; - param->buffer_type = MYSQL_TYPE_VAR_STRING; - } memcpy(param->buffer, value.data(), len); } @@ -214,48 +226,48 @@ std::string MySQLPreparedStatement::getQueryString() const std::string queryString(m_queryString); size_t pos = 0; - for (uint32 i = 0; i < m_stmt->statement_data.size(); i++) + for (PreparedStatementData& data : m_stmt->statement_data) { pos = queryString.find('?', pos); std::stringstream ss; - switch (m_stmt->statement_data[i].type) + switch (data.type) { case TYPE_BOOL: - ss << uint16(m_stmt->statement_data[i].data.boolean); + ss << uint16(std::get(data.data)); // stringstream will append a character with that code instead of numeric representation break; case TYPE_UI8: - ss << uint16(m_stmt->statement_data[i].data.ui8); // stringstream will append a character with that code instead of numeric representation + ss << uint16(std::get(data.data)); // stringstream will append a character with that code instead of numeric representation break; case TYPE_UI16: - ss << m_stmt->statement_data[i].data.ui16; + ss << std::get(data.data); break; case TYPE_UI32: - ss << m_stmt->statement_data[i].data.ui32; + ss << std::get(data.data); break; case TYPE_I8: - ss << int16(m_stmt->statement_data[i].data.i8); // stringstream will append a character with that code instead of numeric representation + ss << int16(std::get(data.data)); // stringstream will append a character with that code instead of numeric representation break; case TYPE_I16: - ss << m_stmt->statement_data[i].data.i16; + ss << std::get(data.data); break; case TYPE_I32: - ss << m_stmt->statement_data[i].data.i32; + ss << std::get(data.data); break; case TYPE_UI64: - ss << m_stmt->statement_data[i].data.ui64; + ss << std::get(data.data); break; case TYPE_I64: - ss << m_stmt->statement_data[i].data.i64; + ss << std::get(data.data); break; case TYPE_FLOAT: - ss << m_stmt->statement_data[i].data.f; + ss << std::get(data.data); break; case TYPE_DOUBLE: - ss << m_stmt->statement_data[i].data.d; + ss << std::get(data.data); break; case TYPE_STRING: - ss << '\'' << (char const*)m_stmt->statement_data[i].binary.data() << '\''; + ss << '\'' << std::get(data.data) << '\''; break; case TYPE_BINARY: ss << "BINARY"; -- cgit v1.2.3