diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-09-04 00:18:12 +0200 |
---|---|---|
committer | jackpoz <giacomopoz@gmail.com> | 2015-09-27 17:11:35 +0200 |
commit | 5c3ba60d54ce01cc1571e9e2d36a34e1fb64021a (patch) | |
tree | f4babfc9eba70de16f8501af9bf24cc592b3e71e /src/server/database/Database/QueryResult.cpp | |
parent | 25c03039768fefa79dd75d491997c28e451a09a7 (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.cpp | 19 |
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; } |