diff --git a/src/server/apps/authserver/Server/AuthSession.cpp b/src/server/apps/authserver/Server/AuthSession.cpp index ca411fa29..b2ae2cab3 100644 --- a/src/server/apps/authserver/Server/AuthSession.cpp +++ b/src/server/apps/authserver/Server/AuthSession.cpp @@ -195,13 +195,14 @@ void AuthSession::CheckIpCallback(PreparedQueryResult result) { bool banned = false; - do + for (auto const& fields : *result) { - Field* fields = result->Fetch(); if (fields[0].Get() != 0) + { banned = true; - - } while (result->NextRow()); + break; + } + } if (banned) { diff --git a/src/server/database/Database/QueryResult.h b/src/server/database/Database/QueryResult.h index b64966e0e..f0cf4e9b5 100644 --- a/src/server/database/Database/QueryResult.h +++ b/src/server/database/Database/QueryResult.h @@ -24,6 +24,27 @@ #include #include +template +struct ResultIterator +{ + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + + explicit ResultIterator(pointer ptr) : _ptr(ptr) { } + + reference operator*() const { return *_ptr; } + pointer operator->() { return _ptr; } + ResultIterator& operator++() { if (!_ptr->NextRow()) _ptr = nullptr; return *this; } + + bool operator!=(const ResultIterator& right) { return _ptr != right._ptr; } + +private: + pointer _ptr; +}; + class AC_DATABASE_API ResultSet { public: @@ -54,6 +75,9 @@ public: return theTuple; } + auto begin() { return ResultIterator(this); } + static auto end() { return ResultIterator(nullptr); } + protected: std::vector _fieldMetadata; uint64 _rowCount; @@ -100,6 +124,9 @@ public: return theTuple; } + auto begin() { return ResultIterator(this); } + static auto end() { return ResultIterator(nullptr); } + protected: std::vector m_fieldMetadata; std::vector m_rows; diff --git a/src/server/shared/Realms/RealmList.cpp b/src/server/shared/Realms/RealmList.cpp index 8a07b710b..9b991d864 100644 --- a/src/server/shared/Realms/RealmList.cpp +++ b/src/server/shared/Realms/RealmList.cpp @@ -53,11 +53,10 @@ void RealmList::Close() void RealmList::LoadBuildInfo() { // 0 1 2 3 4 5 6 - if (QueryResult result = LoginDatabase.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, winChecksumSeed, macChecksumSeed FROM build_info ORDER BY build ASC")) + if (auto result = LoginDatabase.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, winChecksumSeed, macChecksumSeed FROM build_info ORDER BY build ASC")) { - do + for (auto const& fields : *result) { - Field* fields = result->Fetch(); RealmBuildInfo& build = _builds.emplace_back(); build.MajorVersion = fields[0].Get(); build.MinorVersion = fields[1].Get(); @@ -87,7 +86,7 @@ void RealmList::LoadBuildInfo() { HexStrToByteArray(macHash, build.MacHash); } - } while (result->NextRow()); + } } } @@ -149,11 +148,10 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) // Circle through results and add them to the realm map if (result) { - do + for (auto const& fields : *result) { try { - Field* fields = result->Fetch(); uint32 realmId = fields[0].Get(); std::string name = fields[1].Get(); std::string externalAddressString = fields[2].Get(); @@ -221,7 +219,7 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) LOG_ERROR("server.authserver", "Realmlist::UpdateRealms has thrown an exception: {}", ex.what()); ABORT(); } - } while (result->NextRow()); + } } for (auto itr = existingRealms.begin(); itr != existingRealms.end(); ++itr)