mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Database: Implement accessing query result fields by name
This commit is contained in:
@@ -400,10 +400,13 @@ _result(result),
|
||||
_fields(fields)
|
||||
{
|
||||
_fieldMetadata.resize(_fieldCount);
|
||||
_fieldIndexByAlias.reserve(_fieldCount);
|
||||
_currentRow = new Field[_fieldCount];
|
||||
for (uint32 i = 0; i < _fieldCount; i++)
|
||||
{
|
||||
InitializeDatabaseFieldMetadata(&_fieldMetadata[i], &_fields[i], i, false);
|
||||
bool success = _fieldIndexByAlias.try_emplace(_fieldMetadata[i].Alias, i).second;
|
||||
ASSERT(success);
|
||||
_currentRow[i].SetMetadata(&_fieldMetadata[i]);
|
||||
}
|
||||
}
|
||||
@@ -452,6 +455,7 @@ m_metadataResult(result)
|
||||
//- This is where we prepare the buffer based on metadata
|
||||
MySQLField* field = reinterpret_cast<MySQLField*>(mysql_fetch_fields(m_metadataResult));
|
||||
m_fieldMetadata.resize(m_fieldCount);
|
||||
m_fieldIndexByAlias.reserve(m_fieldCount);
|
||||
std::size_t rowSize = 0;
|
||||
for (uint32 i = 0; i < m_fieldCount; ++i)
|
||||
{
|
||||
@@ -459,6 +463,8 @@ m_metadataResult(result)
|
||||
rowSize += size;
|
||||
|
||||
InitializeDatabaseFieldMetadata(&m_fieldMetadata[i], &field[i], i, true);
|
||||
bool success = m_fieldIndexByAlias.try_emplace(m_fieldMetadata[i].Alias, i).second;
|
||||
ASSERT(success);
|
||||
|
||||
m_rBind[i].buffer_type = field[i].type;
|
||||
m_rBind[i].buffer_length = size;
|
||||
@@ -631,6 +637,13 @@ Field const& ResultSet::operator[](std::size_t index) const
|
||||
return _currentRow[index];
|
||||
}
|
||||
|
||||
Field const& ResultSet::operator[](std::string_view const& alias) const
|
||||
{
|
||||
auto itr = _fieldIndexByAlias.find(alias);
|
||||
ASSERT(itr != _fieldIndexByAlias.end());
|
||||
return _currentRow[itr->second];
|
||||
}
|
||||
|
||||
QueryResultFieldMetadata const& ResultSet::GetFieldMetadata(std::size_t index) const
|
||||
{
|
||||
ASSERT(index < std::size_t(_fieldCount));
|
||||
@@ -650,6 +663,14 @@ Field const& PreparedResultSet::operator[](std::size_t index) const
|
||||
return m_rows[std::size_t(m_rowPosition) * m_fieldCount + index];
|
||||
}
|
||||
|
||||
Field const& PreparedResultSet::operator[](std::string_view const& alias) const
|
||||
{
|
||||
ASSERT(m_rowPosition < m_rowCount);
|
||||
auto itr = m_fieldIndexByAlias.find(alias);
|
||||
ASSERT(itr != m_fieldIndexByAlias.end());
|
||||
return m_rows[std::size_t(m_rowPosition) * m_fieldCount + itr->second];
|
||||
}
|
||||
|
||||
QueryResultFieldMetadata const& PreparedResultSet::GetFieldMetadata(std::size_t index) const
|
||||
{
|
||||
ASSERT(index < std::size_t(m_fieldCount));
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "Define.h"
|
||||
#include "DatabaseEnvFwd.h"
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
class TC_DATABASE_API ResultSet
|
||||
@@ -34,11 +35,13 @@ class TC_DATABASE_API ResultSet
|
||||
|
||||
Field* Fetch() const { return _currentRow; }
|
||||
Field const& operator[](std::size_t index) const;
|
||||
Field const& operator[](std::string_view const& alias) const;
|
||||
|
||||
QueryResultFieldMetadata const& GetFieldMetadata(std::size_t index) const;
|
||||
|
||||
protected:
|
||||
std::vector<QueryResultFieldMetadata> _fieldMetadata;
|
||||
std::unordered_map<std::string_view, std::size_t> _fieldIndexByAlias;
|
||||
uint64 _rowCount;
|
||||
Field* _currentRow;
|
||||
uint32 _fieldCount;
|
||||
@@ -64,11 +67,13 @@ class TC_DATABASE_API PreparedResultSet
|
||||
|
||||
Field* Fetch() const;
|
||||
Field const& operator[](std::size_t index) const;
|
||||
Field const& operator[](std::string_view const& alias) const;
|
||||
|
||||
QueryResultFieldMetadata const& GetFieldMetadata(std::size_t index) const;
|
||||
|
||||
protected:
|
||||
std::vector<QueryResultFieldMetadata> m_fieldMetadata;
|
||||
std::unordered_map<std::string_view, std::size_t> m_fieldIndexByAlias;
|
||||
std::vector<Field> m_rows;
|
||||
uint64 m_rowCount;
|
||||
uint64 m_rowPosition;
|
||||
|
||||
@@ -26960,11 +26960,11 @@ void Player::_LoadSkills(PreparedQueryResult result)
|
||||
break;
|
||||
}
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
uint16 skill = fields[0].GetUInt16();
|
||||
uint16 value = fields[1].GetUInt16();
|
||||
uint16 max = fields[2].GetUInt16();
|
||||
int8 professionSlot = fields[3].GetInt8();
|
||||
PreparedResultSet const& fields = *result;
|
||||
uint16 skill = fields["skill"].GetUInt16();
|
||||
uint16 value = fields["value"].GetUInt16();
|
||||
uint16 max = fields["max"].GetUInt16();
|
||||
int8 professionSlot = fields["professionSlot"].GetInt8();
|
||||
|
||||
SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skill, race, GetClass());
|
||||
if (!rcEntry)
|
||||
|
||||
Reference in New Issue
Block a user