From 81af05eaaa828c73319127da27fd40a4b6e3b319 Mon Sep 17 00:00:00 2001 From: T1ti <40864460+T1ti@users.noreply.github.com> Date: Fri, 19 Sep 2025 21:37:39 +0200 Subject: [PATCH] rename database classes --- src/noggit/MapView.cpp | 4 +- .../{sql => database}/ClientDatabase.cpp | 32 ++++++------- src/noggit/{sql => database}/ClientDatabase.h | 45 ++++++++++++++++++- .../SqlDatabaseManager.cpp} | 0 .../SqlDatabaseManager.h} | 30 ++++++------- .../{sql => database}/SqlUIDStorage.cpp | 8 ++-- src/noggit/{sql => database}/SqlUIDStorage.h | 2 +- .../database/clientDbDefinitions/MapDB.h | 0 src/noggit/map_index.cpp | 2 +- .../Ui/MapCreationWizard.cpp | 3 +- .../ui/windows/noggitWindow/NoggitWindow.cpp | 8 ++-- .../windows/settingsPanel/SettingsPanel.cpp | 12 ++--- 12 files changed, 92 insertions(+), 54 deletions(-) rename src/noggit/{sql => database}/ClientDatabase.cpp (93%) rename src/noggit/{sql => database}/ClientDatabase.h (67%) rename src/noggit/{sql/DatabaseManager.cpp => database/SqlDatabaseManager.cpp} (100%) rename src/noggit/{sql/DatabaseManager.h => database/SqlDatabaseManager.h} (86%) rename src/noggit/{sql => database}/SqlUIDStorage.cpp (92%) rename src/noggit/{sql => database}/SqlUIDStorage.h (87%) create mode 100644 src/noggit/database/clientDbDefinitions/MapDB.h diff --git a/src/noggit/MapView.cpp b/src/noggit/MapView.cpp index 94283e87..aca8e12e 100644 --- a/src/noggit/MapView.cpp +++ b/src/noggit/MapView.cpp @@ -76,7 +76,7 @@ #include #include #include -#include +#include #include @@ -2471,7 +2471,7 @@ void MapView::createGUI() // do we need to do this every tick ? if (_settings->value("project/mysql/enabled").toBool()) { - auto& db_mgr = Noggit::Sql::DatabaseManager::instance(); + auto& db_mgr = Noggit::Sql::SqlDatabaseManager::instance(); if (db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit)) { diff --git a/src/noggit/sql/ClientDatabase.cpp b/src/noggit/database/ClientDatabase.cpp similarity index 93% rename from src/noggit/sql/ClientDatabase.cpp rename to src/noggit/database/ClientDatabase.cpp index e80fcaa0..459d471b 100644 --- a/src/noggit/sql/ClientDatabase.cpp +++ b/src/noggit/database/ClientDatabase.cpp @@ -37,8 +37,7 @@ namespace Noggit bool ClientDatabase::testUploadDBCtoDB(const BlizzardDatabaseLib::BlizzardDatabaseTable& table) { - - auto& db_mgr = Noggit::Sql::DatabaseManager::instance(); + auto& db_mgr = Noggit::Sql::SqlDatabaseManager::instance(); bool valid_conn = db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit); if (!valid_conn) return false; @@ -96,6 +95,7 @@ namespace Noggit if (!table_is_valid) { + Log << "Table " << sql_table_name.toStdString() << "does not exist or has wrong structure."; qDebug() << "Table " << sql_table_name << "does not exist or has wrong structure."; return false; } @@ -130,11 +130,7 @@ namespace Noggit noggit_db.transaction(); - // Disable constraints & indexes for faster bulk load - // query.exec("SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0"); - // query.exec("SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0"); - // query.exec("LOCK TABLES `" + sql_table_name + "` WRITE"); - // query.exec("ALTER TABLE `" + sql_table_name + "` DISABLE KEYS"); + // query.exec("SET UNIQUE_CHECKS=0;"); QStringList rowBuffer; // holds each row as a string rowBuffer.reserve(batchSize); @@ -143,7 +139,7 @@ namespace Noggit { auto& record = client_table_iterator.Next(); QStringList colValues; - colValues.reserve(column_names.size()); // reserve columns per row + colValues.reserve(column_names.size()); for (auto& column_def : row_definition.ColumnDefinitions) { @@ -195,7 +191,7 @@ namespace Noggit if (!query.exec(sql)) { qWarning() << "Batch insert failed:" << query.lastError().text(); - // query.exec("UNLOCK TABLES"); + // query.exec("SET UNIQUE_CHECKS=1;"); noggit_db.rollback(); return false; } @@ -218,16 +214,12 @@ namespace Noggit if (!query.exec(sql)) { qWarning() << "Final batch insert failed:" << query.lastError().text(); - // query.exec("UNLOCK TABLES"); + // query.exec("SET UNIQUE_CHECKS=1;"); noggit_db.rollback(); return false; } } - - // query.exec("ALTER TABLE `" + sql_table_name + "` ENABLE KEYS"); - // query.exec("UNLOCK TABLES"); - // query.exec("SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS"); - // query.exec("SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS"); + // query.exec("SET UNIQUE_CHECKS=1;"); noggit_db.commit(); @@ -237,6 +229,10 @@ namespace Noggit << elapsedMs << "ms (" << (table.RecordCount() * 1000.0 / elapsedMs) << " rows/sec)"; + Log << "Inserted " << table.RecordCount() << " rows in " + << elapsedMs << "ms (" + << (table.RecordCount() * 1000.0 / elapsedMs) << " rows/sec)" << std::endl; + return true; } @@ -253,7 +249,7 @@ namespace Noggit // never use this function for more than 1 rows, implement a new bulk function Structures::BlizzardDatabaseRow ClientDatabase::sqlRowById(const std::string& tableName, unsigned int id) { - auto& db_mgr = Noggit::Sql::DatabaseManager::instance(); + auto& db_mgr = Noggit::Sql::SqlDatabaseManager::instance(); // Test connection ? auto noggit_db = db_mgr.noggitDatabase(); @@ -411,7 +407,7 @@ namespace Noggit // statement += ")\n ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE='utf8mb4_general_ci';"; statement += ")\n ENGINE = InnoDB;"; - auto& db_mgr = Noggit::Sql::DatabaseManager::instance(); + auto& db_mgr = Noggit::Sql::SqlDatabaseManager::instance(); bool valid_conn = db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit); if (!valid_conn) return false; @@ -426,7 +422,7 @@ namespace Noggit } else { - qDebug() << "Table " << table_name.c_str() << " created or already exists."; + qDebug() << "Table " << table_name.c_str() << " created."; } return success; diff --git a/src/noggit/sql/ClientDatabase.h b/src/noggit/database/ClientDatabase.h similarity index 67% rename from src/noggit/sql/ClientDatabase.h rename to src/noggit/database/ClientDatabase.h index dace359b..bd94573a 100644 --- a/src/noggit/sql/ClientDatabase.h +++ b/src/noggit/database/ClientDatabase.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include @@ -27,6 +27,49 @@ namespace Noggit bool isSigned = true; }; + // interface table that gets data either from sql or raw dbc + class ClientDatabaseTable + { + private: + const std::string _tableName; + + public: + unsigned int RecordCount() const; + + // column count from file header, not definition file + int ColumnCount() const + { + return static_cast(_tableReader->FieldCount()); + } + + std::string Name() const + { + return _tableName; + } + + Structures::BlizzardDatabaseRow RecordById(unsigned int id) const + { + return _tableReader->RecordById(id); + } + + Structures::BlizzardDatabaseRow RecordByPosition(unsigned int positionId) const + { + return _tableReader->Record(positionId); + } + + BlizzardDatabaseRecordCollection Records() const + { + return BlizzardDatabaseRecordCollection(_tableReader); + } + + Structures::BlizzardDatabaseRowDefinition GetRecordDefinition() const + { + return _tableReader->RecordDefinition(); + } + + + }; + // calls client or server db adaptively. so /sql/ is not really a good location class ClientDatabase { diff --git a/src/noggit/sql/DatabaseManager.cpp b/src/noggit/database/SqlDatabaseManager.cpp similarity index 100% rename from src/noggit/sql/DatabaseManager.cpp rename to src/noggit/database/SqlDatabaseManager.cpp diff --git a/src/noggit/sql/DatabaseManager.h b/src/noggit/database/SqlDatabaseManager.h similarity index 86% rename from src/noggit/sql/DatabaseManager.h rename to src/noggit/database/SqlDatabaseManager.h index 4fa0a096..3660a99e 100644 --- a/src/noggit/sql/DatabaseManager.h +++ b/src/noggit/database/SqlDatabaseManager.h @@ -33,16 +33,16 @@ namespace Noggit::Sql QString password; }; - class DatabaseManager + class SqlDatabaseManager { public: - static DatabaseManager& instance() + static SqlDatabaseManager& instance() { - static DatabaseManager _instance; + static SqlDatabaseManager _instance; return _instance; } - bool initializeDb(SQLDbType type, + bool initializeDbConnection(SQLDbType type, const QString& host, int port, const QString& dbName, const QString& user, const QString& password) { @@ -116,7 +116,7 @@ namespace Noggit::Sql qWarning() << "No configuration for database type" << static_cast(type); } - QSqlDatabase db = database(type); + QSqlDatabase db = databaseConnection(type); if (db.isValid() && db.isOpen()) return true; @@ -170,9 +170,9 @@ namespace Noggit::Sql // disable if connection is not valid // settings.value("project/mysql/enabled") = false; - promptText << database(type).lastError().text().toStdString() << std::endl; - promptText << database(type).lastError().nativeErrorCode().toStdString() << std::endl; - promptText << database(type).lastError().databaseText().toStdString() << std::endl; + promptText << databaseConnection(type).lastError().text().toStdString() << std::endl; + promptText << databaseConnection(type).lastError().nativeErrorCode().toStdString() << std::endl; + promptText << databaseConnection(type).lastError().databaseText().toStdString() << std::endl; prompt.setInformativeText(promptText.str().c_str()); prompt.exec(); @@ -187,26 +187,26 @@ namespace Noggit::Sql return availableDrivers.contains(driverToString(_sql_driver), Qt::CaseInsensitive); } - QSqlDatabase database(SQLDbType type) const + QSqlDatabase databaseConnection(SQLDbType type) const { return QSqlDatabase::database(connectionName(type)); } QSqlDatabase noggitDatabase() const { - return DatabaseManager::database(SQLDbType::Noggit); + return SqlDatabaseManager::databaseConnection(SQLDbType::Noggit); } QSqlDatabase worldDatabase() const { - return DatabaseManager::database(SQLDbType::World); + return SqlDatabaseManager::databaseConnection(SQLDbType::World); } private: - DatabaseManager() = default; - ~DatabaseManager() = default; - DatabaseManager(const DatabaseManager&) = delete; - DatabaseManager& operator=(const DatabaseManager&) = delete; + SqlDatabaseManager() = default; + ~SqlDatabaseManager() = default; + SqlDatabaseManager(const SqlDatabaseManager&) = delete; + SqlDatabaseManager& operator=(const SqlDatabaseManager&) = delete; SqlDriver _sql_driver = SqlDriver::MySQL; diff --git a/src/noggit/sql/SqlUIDStorage.cpp b/src/noggit/database/SqlUIDStorage.cpp similarity index 92% rename from src/noggit/sql/SqlUIDStorage.cpp rename to src/noggit/database/SqlUIDStorage.cpp index f751ec83..535b3977 100644 --- a/src/noggit/sql/SqlUIDStorage.cpp +++ b/src/noggit/database/SqlUIDStorage.cpp @@ -2,7 +2,7 @@ bool Noggit::Sql::SqlUIDStorage::hasMaxUIDStoredDB(std::size_t mapID) { - auto& db_mgr = DatabaseManager::instance(); + auto& db_mgr = SqlDatabaseManager::instance(); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit); if (!valid_conn) @@ -25,7 +25,7 @@ bool Noggit::Sql::SqlUIDStorage::hasMaxUIDStoredDB(std::size_t mapID) std::uint32_t Noggit::Sql::SqlUIDStorage::getGUIDFromDB(std::size_t mapID) { - auto& db_mgr = Sql::DatabaseManager::instance(); + auto& db_mgr = Sql::SqlDatabaseManager::instance(); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit); if (!valid_conn) @@ -66,7 +66,7 @@ std::uint32_t Noggit::Sql::SqlUIDStorage::getGUIDFromDB(std::size_t mapID) void Noggit::Sql::SqlUIDStorage::insertUIDinDB(std::size_t mapID, std::uint32_t NewUID) { - auto& db_mgr = Sql::DatabaseManager::instance(); + auto& db_mgr = Sql::SqlDatabaseManager::instance(); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit); if (!valid_conn) { @@ -88,7 +88,7 @@ void Noggit::Sql::SqlUIDStorage::insertUIDinDB(std::size_t mapID, std::uint32_t void Noggit::Sql::SqlUIDStorage::updateUIDinDB(std::size_t mapID, std::uint32_t NewUID) { - auto& db_mgr = Sql::DatabaseManager::instance(); + auto& db_mgr = Sql::SqlDatabaseManager::instance(); if (!db_mgr.testConnection(SQLDbType::Noggit)) return; diff --git a/src/noggit/sql/SqlUIDStorage.h b/src/noggit/database/SqlUIDStorage.h similarity index 87% rename from src/noggit/sql/SqlUIDStorage.h rename to src/noggit/database/SqlUIDStorage.h index b4f9cd97..bb91d006 100644 --- a/src/noggit/sql/SqlUIDStorage.h +++ b/src/noggit/database/SqlUIDStorage.h @@ -1,5 +1,5 @@ #pragma once -#include +#include namespace Noggit::Sql { diff --git a/src/noggit/database/clientDbDefinitions/MapDB.h b/src/noggit/database/clientDbDefinitions/MapDB.h new file mode 100644 index 00000000..e69de29b diff --git a/src/noggit/map_index.cpp b/src/noggit/map_index.cpp index 69c77dd7..03ea8ac8 100755 --- a/src/noggit/map_index.cpp +++ b/src/noggit/map_index.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/noggit/ui/tools/MapCreationWizard/Ui/MapCreationWizard.cpp b/src/noggit/ui/tools/MapCreationWizard/Ui/MapCreationWizard.cpp index bfca1de9..30f728bc 100755 --- a/src/noggit/ui/tools/MapCreationWizard/Ui/MapCreationWizard.cpp +++ b/src/noggit/ui/tools/MapCreationWizard/Ui/MapCreationWizard.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include @@ -649,7 +649,6 @@ void MapCreationWizard::selectMap(int map_id) } /////////////////////////////// - _cur_map_id = map_id; if (_world) diff --git a/src/noggit/ui/windows/noggitWindow/NoggitWindow.cpp b/src/noggit/ui/windows/noggitWindow/NoggitWindow.cpp index 17668e20..4a99b3dc 100755 --- a/src/noggit/ui/windows/noggitWindow/NoggitWindow.cpp +++ b/src/noggit/ui/windows/noggitWindow/NoggitWindow.cpp @@ -21,8 +21,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -94,8 +94,8 @@ namespace Noggit::Ui::Windows auto user = settings.value("project/mysql/user").toString(); auto pass = settings.value("project/mysql/pwd").toString(); - auto& db_manager = Sql::DatabaseManager::instance(); - db_manager.initializeDb(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); + auto& db_manager = Sql::SqlDatabaseManager::instance(); + db_manager.initializeDbConnection(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); } setCentralWidget(_null_widget); diff --git a/src/noggit/ui/windows/settingsPanel/SettingsPanel.cpp b/src/noggit/ui/windows/settingsPanel/SettingsPanel.cpp index 0fc035d9..8795daad 100644 --- a/src/noggit/ui/windows/settingsPanel/SettingsPanel.cpp +++ b/src/noggit/ui/windows/settingsPanel/SettingsPanel.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -170,7 +170,7 @@ namespace Noggit // save_changes(); // old method saved and only used qsetting - auto& db_manager = Sql::DatabaseManager::instance(); + auto& db_manager = Sql::SqlDatabaseManager::instance(); if (!db_manager.isDriverAvailable()) { @@ -201,7 +201,7 @@ namespace Noggit int port = ui->_mysql_port_field->value(); // test temporary connection from text fields - bool test1 = db_manager.initializeDb(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); + bool test1 = db_manager.initializeDbConnection(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); bool test2 = db_manager.testConnectionWithPopup(Sql::SQLDbType::Noggit, false); // reconnect to saved db from settings @@ -212,7 +212,7 @@ namespace Noggit user = settings.value("project/mysql/user").toString(); pass = settings.value("project/mysql/pwd").toString(); - bool test3 = db_manager.initializeDb(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); + bool test3 = db_manager.initializeDbConnection(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); assert(db_manager.testConnection(Sql::SQLDbType::Noggit)); } @@ -375,14 +375,14 @@ namespace Noggit _settings->sync(); // reinitialize db on save - auto& db_manager = Sql::DatabaseManager::instance(); + auto& db_manager = Sql::SqlDatabaseManager::instance(); QString host = _settings->value("project/mysql/server").toString(); int port = _settings->value("project/mysql/port", "3306").toInt(); QString db_name = _settings->value("project/mysql/db").toString(); QString user = _settings->value("project/mysql/user").toString(); QString pass = _settings->value("project/mysql/pwd").toString(); - bool test1 = db_manager.initializeDb(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); + bool test1 = db_manager.initializeDbConnection(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); bool test2 = db_manager.testConnectionWithPopup(Sql::SQLDbType::Noggit, true);