aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/PreparedStatement.cpp
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2016-08-10 16:02:22 +0200
committerjackpoz <giacomopoz@gmail.com>2016-08-10 16:02:22 +0200
commitabe37e458c2b482d478ce98ba44bc8dcf76caeb1 (patch)
tree9cbbbbaa3ab019e549b3e310e6f3ebf9aae8d62b /src/server/database/Database/PreparedStatement.cpp
parent375593761167ba1bf8ef16bbe345cb569ad1e00b (diff)
Server/Database: Reduce differences between 3.3.5 and 6.x branches
Cherry-pick 1bea52fd4649b6a1761aa157f9e74f01e19872e7 and 543bea32 to add support to TYPE_BINARY MySQL field type
Diffstat (limited to 'src/server/database/Database/PreparedStatement.cpp')
-rw-r--r--src/server/database/Database/PreparedStatement.cpp37
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";