diff options
Diffstat (limited to 'src/server/database/Database/PreparedStatement.cpp')
-rw-r--r-- | src/server/database/Database/PreparedStatement.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/server/database/Database/PreparedStatement.cpp b/src/server/database/Database/PreparedStatement.cpp index 119f1d4c93b..d32b3306995 100644 --- a/src/server/database/Database/PreparedStatement.cpp +++ b/src/server/database/Database/PreparedStatement.cpp @@ -68,7 +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); break; case TYPE_NULL: m_stmt->setNull(i); @@ -186,10 +189,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<uint8>& 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 +352,26 @@ 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<uint8>& value, bool isString) { CheckValidIndex(index); m_paramsSet[index] = true; MYSQL_BIND* param = &m_bind[index]; - uint32 len = uint32(strlen(value) + 1); - param->buffer_type = MYSQL_TYPE_VAR_STRING; + uint32 len = uint32(value.size()); + param->buffer_type = MYSQL_TYPE_BLOB; delete [] static_cast<char *>(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; + param->buffer_type = MYSQL_TYPE_VAR_STRING; + } - memcpy(param->buffer, value, len); + memcpy(param->buffer, value.data(), len); } void MySQLPreparedStatement::setNull(const uint8 index) @@ -429,7 +447,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"; |