diff options
author | Ovahlord <dreadkiller@gmx.de> | 2025-01-23 12:21:13 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-03-13 12:41:00 +0100 |
commit | 6de1e51a2f59deb020d7839dade76b9909cb34e4 (patch) | |
tree | 48ca63ff20be7c2c309c5bddf1f3a984a6b6a222 | |
parent | 64e5f9cce90a751cb3608178982aeb7a632bd197 (diff) |
Core/Database: Implement accessing query result fields by name
-rw-r--r-- | src/server/database/Database/QueryResult.cpp | 21 | ||||
-rw-r--r-- | src/server/database/Database/QueryResult.h | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 |
3 files changed, 31 insertions, 5 deletions
diff --git a/src/server/database/Database/QueryResult.cpp b/src/server/database/Database/QueryResult.cpp index cbb349e5803..3180761b81f 100644 --- a/src/server/database/Database/QueryResult.cpp +++ b/src/server/database/Database/QueryResult.cpp @@ -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)); diff --git a/src/server/database/Database/QueryResult.h b/src/server/database/Database/QueryResult.h index a6d964f846d..381fd9d368c 100644 --- a/src/server/database/Database/QueryResult.h +++ b/src/server/database/Database/QueryResult.h @@ -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; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ce070f5c1a0..63a793f951e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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) |