aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Database/PreparedStatement.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-10-21 14:57:20 +0200
committerShauren <shauren.trinity@gmail.com>2014-10-21 14:57:20 +0200
commit1bea52fd4649b6a1761aa157f9e74f01e19872e7 (patch)
treeacfe289a149100283fffd905fd3ed25e28ae2d5c /src/server/shared/Database/PreparedStatement.cpp
parentfe634ac8045e220c1e7de2c99ecea9b10b7faa4f (diff)
Core/DBLayer: Added support for BINARY field type
Diffstat (limited to 'src/server/shared/Database/PreparedStatement.cpp')
-rw-r--r--src/server/shared/Database/PreparedStatement.cpp31
1 files changed, 24 insertions, 7 deletions
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<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 +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<uint8>& 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<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;
- 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";