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
committerjackpoz <giacomopoz@gmail.com>2015-09-27 17:11:35 +0200
commit5c3ba60d54ce01cc1571e9e2d36a34e1fb64021a (patch)
treef4babfc9eba70de16f8501af9bf24cc592b3e71e /src/server/database/Database/QueryResult.cpp
parent25c03039768fefa79dd75d491997c28e451a09a7 (diff)
Core/DBLayer: Allocate a single buffer for entire prepared result set instead of separate ones for each field
(cherry picked from commit 8652f4b4de5ed02c89f9db91367125a04ce52dd4)
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 6afc949d6a9..983ffee24c4 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
{
@@ -228,12 +236,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;
}