mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 17:05:44 +01:00
Core/DBLayer: Allocate a single buffer for entire prepared result set instead of separate ones for each field
(cherry picked from commit 8652f4b4de)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user