diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-09-04 00:18:12 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-09-04 00:18:12 +0200 |
commit | 8652f4b4de5ed02c89f9db91367125a04ce52dd4 (patch) | |
tree | 84c56dc428db816119c2da81c3d944abc3bd7b1c /src/server/database/Database/QueryResult.cpp | |
parent | 1bafd96c0fd004afe3d938c62aed0b9313c1be95 (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.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 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; } |