From 6de1e51a2f59deb020d7839dade76b9909cb34e4 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Thu, 23 Jan 2025 12:21:13 +0100 Subject: Core/Database: Implement accessing query result fields by name --- src/server/database/Database/QueryResult.cpp | 21 +++++++++++++++++++++ src/server/database/Database/QueryResult.h | 5 +++++ 2 files changed, 26 insertions(+) (limited to 'src/server/database') 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(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 #include 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 _fieldMetadata; + std::unordered_map _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 m_fieldMetadata; + std::unordered_map m_fieldIndexByAlias; std::vector m_rows; uint64 m_rowCount; uint64 m_rowPosition; -- cgit v1.2.3