aboutsummaryrefslogtreecommitdiff
path: root/src/server/database
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2025-01-23 12:21:13 +0100
committerOvahlord <dreadkiller@gmx.de>2025-04-06 19:25:29 +0200
commit383474122aea87b1fbe5a27fd8b661dbb4685ab1 (patch)
treeebd887c2593cf4b75765ff33dc74f6e9544282aa /src/server/database
parentb982de1e3599648af08b3a59984348e3a247cd7e (diff)
Core/Database: Implement accessing query result fields by name
(cherry picked from commit 6de1e51a2f59deb020d7839dade76b9909cb34e4)
Diffstat (limited to 'src/server/database')
-rw-r--r--src/server/database/Database/QueryResult.cpp21
-rw-r--r--src/server/database/Database/QueryResult.h5
2 files changed, 26 insertions, 0 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;