From 1bea52fd4649b6a1761aa157f9e74f01e19872e7 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 21 Oct 2014 14:57:20 +0200 Subject: Core/DBLayer: Added support for BINARY field type --- src/server/shared/Database/PreparedStatement.cpp | 31 ++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'src/server/shared/Database/PreparedStatement.cpp') diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/shared/Database/PreparedStatement.cpp index 23c50ac2ef8..1f036b5bf0a 100644 --- a/src/server/shared/Database/PreparedStatement.cpp +++ b/src/server/shared/Database/PreparedStatement.cpp @@ -68,8 +68,10 @@ void PreparedStatement::BindParameters() m_stmt->setDouble(i, statement_data[i].data.d); break; case TYPE_STRING: - m_stmt->setString(i, statement_data[i].str.c_str()); + m_stmt->setBinary(i, statement_data[i].binary, true); break; + case TYPE_BINARY: + m_stmt->setBinary(i, statement_data[i].binary, false); case TYPE_NULL: m_stmt->setNull(i); break; @@ -186,10 +188,20 @@ void PreparedStatement::setString(const uint8 index, const std::string& value) if (index >= statement_data.size()) statement_data.resize(index+1); - statement_data[index].str = value; + statement_data[index].binary.resize(value.length() + 1); + memcpy(statement_data[index].binary.data(), value.c_str(), value.length() + 1); statement_data[index].type = TYPE_STRING; } +void PreparedStatement::setBinary(const uint8 index, const std::vector& value) +{ + if (index >= statement_data.size()) + statement_data.resize(index + 1); + + statement_data[index].binary = value; + statement_data[index].type = TYPE_BINARY; +} + void PreparedStatement::setNull(const uint8 index) { if (index >= statement_data.size()) @@ -339,21 +351,23 @@ void MySQLPreparedStatement::setDouble(const uint8 index, const double value) setValue(param, MYSQL_TYPE_DOUBLE, &value, sizeof(double), (value > 0.0f)); } -void MySQLPreparedStatement::setString(const uint8 index, const char* value) +void MySQLPreparedStatement::setBinary(const uint8 index, const std::vector& value, bool isString) { CheckValidIndex(index); m_paramsSet[index] = true; MYSQL_BIND* param = &m_bind[index]; - size_t len = strlen(value) + 1; + size_t len = 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-1); + param->length = new unsigned long(len); + if (isString) + *param->length -= 1; - memcpy(param->buffer, value, len); + memcpy(param->buffer, value.data(), len); } void MySQLPreparedStatement::setNull(const uint8 index) @@ -429,7 +443,10 @@ std::string MySQLPreparedStatement::getQueryString(std::string const& sqlPattern ss << m_stmt->statement_data[i].data.d; break; case TYPE_STRING: - ss << '\'' << m_stmt->statement_data[i].str << '\''; + ss << '\'' << (char const*)m_stmt->statement_data[i].binary.data() << '\''; + break; + case TYPE_BINARY: + ss << "BINARY"; break; case TYPE_NULL: ss << "NULL"; -- cgit v1.2.3