aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/QueryResult.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-09-04 00:18:12 +0200
committerShauren <shauren.trinity@gmail.com>2015-09-04 00:18:12 +0200
commit8652f4b4de5ed02c89f9db91367125a04ce52dd4 (patch)
tree84c56dc428db816119c2da81c3d944abc3bd7b1c /src/server/database/Database/QueryResult.cpp
parent1bafd96c0fd004afe3d938c62aed0b9313c1be95 (diff)
Core/DBLayer: Allocate a single buffer for entire prepared result set instead of separate ones for each field
Diffstat (limited to 'src/server/database/Database/QueryResult.cpp')
-rw-r--r--src/server/database/Database/QueryResult.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/server/database/Database/QueryResult.cpp b/src/server/database/Database/QueryResult.cpp
index 8c48dd5bfb1..40877890ab1 100644
--- a/src/server/database/Database/QueryResult.cpp
+++ b/src/server/database/Database/QueryResult.cpp
@@ -73,12 +73,13 @@ m_length(NULL)
//- This is where we prepare the buffer based on metadata
MYSQL_FIELD* field = mysql_fetch_fields(m_metadataResult);
+ std::size_t rowSize = 0;
for (uint32 i = 0; i < m_fieldCount; ++i)
{
size_t size = Field::SizeForType(&field[i]);
+ rowSize += size;
m_rBind[i].buffer_type = field[i].type;
- m_rBind[i].buffer = new char[size * m_rowCount];
m_rBind[i].buffer_length = size;
m_rBind[i].length = &m_length[i];
m_rBind[i].is_null = &m_isNull[i];
@@ -86,6 +87,13 @@ m_length(NULL)
m_rBind[i].is_unsigned = field[i].flags & UNSIGNED_FLAG;
}
+ char* dataBuffer = new char[rowSize * m_rowCount];
+ for (uint32 i = 0, offset = 0; i < m_fieldCount; ++i)
+ {
+ m_rBind[i].buffer = dataBuffer + offset;
+ offset += m_rBind[i].buffer_length;
+ }
+
//- This is where we bind the bind the buffer to the statement
if (mysql_stmt_bind_result(m_stmt, m_rBind))
{
@@ -133,7 +141,7 @@ m_length(NULL)
fetched_length);
// move buffer pointer to next part
- m_stmt->bind[fIndex].buffer = (char*)buffer + buffer_length;
+ m_stmt->bind[fIndex].buffer = (char*)buffer + rowSize;
}
else
{
@@ -236,12 +244,7 @@ void PreparedResultSet::CleanUp()
if (m_rBind)
{
- for (uint32 i = 0; i < m_fieldCount; ++i)
- {
- delete[]((char*)m_rBind[i].buffer);
- m_rBind[i].buffer = nullptr;
- }
-
+ delete[](char*)m_rBind->buffer;
delete[] m_rBind;
m_rBind = nullptr;
}