From 735eee5965d32f45f4a93df5f1aaa76fea1a3de3 Mon Sep 17 00:00:00 2001 From: silverqx Date: Fri, 24 Jun 2022 17:12:55 +0200 Subject: [PATCH] changed DM::m_configuration to unordered_map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I have discovered very bad bug that caused crashes because of invalidated references to the configurations caused by QHash after insertion using DB::addConnection(). std::unordered_map doesn't invalidates references after insertion or remove 🙌. --- include/orm/support/databaseconfiguration.hpp | 4 +++- src/orm/databasemanager.cpp | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/orm/support/databaseconfiguration.hpp b/include/orm/support/databaseconfiguration.hpp index a834a24a4..ea5a974e0 100644 --- a/include/orm/support/databaseconfiguration.hpp +++ b/include/orm/support/databaseconfiguration.hpp @@ -7,6 +7,8 @@ TINY_SYSTEM_HEADER #include +#include + #include "orm/macros/commonnamespace.hpp" #include "orm/macros/threadlocal.hpp" @@ -22,7 +24,7 @@ namespace Orm::Support public: /*! Type used for Database Connections map. */ - using ConfigurationsType = QHash; + using ConfigurationsType = std::unordered_map; /*! Default constructor. */ inline DatabaseConfiguration() = default; diff --git a/src/orm/databasemanager.cpp b/src/orm/databasemanager.cpp index 553d63940..e2f5a49a8 100644 --- a/src/orm/databasemanager.cpp +++ b/src/orm/databasemanager.cpp @@ -1,5 +1,7 @@ #include "orm/databasemanager.hpp" +#include + #include "orm/concerns/hasconnectionresolver.hpp" #include "orm/exceptions/invalidargumenterror.hpp" #include "orm/schema.hpp" @@ -260,7 +262,7 @@ DatabaseManager::addConnection(const QVariantHash &config, const QString &name) QStringLiteral("The database connection '%1' already exists.") .arg(name)); - (*m_configuration).insert(name, config); + (*m_configuration).emplace(name, config); return *this; } @@ -269,7 +271,7 @@ DatabaseManager & DatabaseManager::addConnections(const ConfigurationsType &configs) { for (auto itConfig = configs.cbegin(); itConfig != configs.cend(); ++itConfig) - addConnection(itConfig.value(), itConfig.key()); + addConnection(itConfig->second, itConfig->first); return *this; } @@ -303,7 +305,7 @@ bool DatabaseManager::removeConnection(const QString &name) // Not connected if (!(*m_connections).contains(name_)) { - (*m_configuration).remove(name_); + (*m_configuration).erase(name_); resetDefaultConnection_(); return true; } @@ -321,7 +323,7 @@ bool DatabaseManager::removeConnection(const QString &name) Schema::m_schemaBuildersCache.erase(name_); // Remove TinyORM configuration - (*m_configuration).remove(name_); + (*m_configuration).erase(name_); // Remove Qt's database connection QSqlDatabase::removeDatabase(name_); @@ -364,7 +366,7 @@ QSqlDatabase DatabaseManager::connectEagerly(const QString &name) QStringList DatabaseManager::connectionNames() const { - return (*m_configuration).keys(); + return (*m_configuration) | ranges::views::keys | ranges::to(); } QStringList DatabaseManager::openedConnectionNames() const