rename database classes

This commit is contained in:
T1ti
2025-09-19 21:37:39 +02:00
parent 8f0865cc83
commit 81af05eaaa
12 changed files with 92 additions and 54 deletions

View File

@@ -76,7 +76,7 @@
#include <noggit/tools/AreaTriggerTool.hpp> #include <noggit/tools/AreaTriggerTool.hpp>
#include <noggit/StringHash.hpp> #include <noggit/StringHash.hpp>
#include <noggit/application/NoggitApplication.hpp> #include <noggit/application/NoggitApplication.hpp>
#include <noggit/sql/DatabaseManager.h> #include <noggit/database/SqlDatabaseManager.h>
#include <QtCore/QSettings> #include <QtCore/QSettings>
@@ -2471,7 +2471,7 @@ void MapView::createGUI()
// do we need to do this every tick ? // do we need to do this every tick ?
if (_settings->value("project/mysql/enabled").toBool()) 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)) if (db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit))
{ {

View File

@@ -37,8 +37,7 @@ namespace Noggit
bool ClientDatabase::testUploadDBCtoDB(const BlizzardDatabaseLib::BlizzardDatabaseTable& table) bool ClientDatabase::testUploadDBCtoDB(const BlizzardDatabaseLib::BlizzardDatabaseTable& table)
{ {
auto& db_mgr = Noggit::Sql::SqlDatabaseManager::instance();
auto& db_mgr = Noggit::Sql::DatabaseManager::instance();
bool valid_conn = db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit); bool valid_conn = db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit);
if (!valid_conn) if (!valid_conn)
return false; return false;
@@ -96,6 +95,7 @@ namespace Noggit
if (!table_is_valid) 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."; qDebug() << "Table " << sql_table_name << "does not exist or has wrong structure.";
return false; return false;
} }
@@ -130,11 +130,7 @@ namespace Noggit
noggit_db.transaction(); noggit_db.transaction();
// Disable constraints & indexes for faster bulk load // query.exec("SET UNIQUE_CHECKS=0;");
// 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");
QStringList rowBuffer; // holds each row as a string QStringList rowBuffer; // holds each row as a string
rowBuffer.reserve(batchSize); rowBuffer.reserve(batchSize);
@@ -143,7 +139,7 @@ namespace Noggit
{ {
auto& record = client_table_iterator.Next(); auto& record = client_table_iterator.Next();
QStringList colValues; QStringList colValues;
colValues.reserve(column_names.size()); // reserve columns per row colValues.reserve(column_names.size());
for (auto& column_def : row_definition.ColumnDefinitions) for (auto& column_def : row_definition.ColumnDefinitions)
{ {
@@ -195,7 +191,7 @@ namespace Noggit
if (!query.exec(sql)) if (!query.exec(sql))
{ {
qWarning() << "Batch insert failed:" << query.lastError().text(); qWarning() << "Batch insert failed:" << query.lastError().text();
// query.exec("UNLOCK TABLES"); // query.exec("SET UNIQUE_CHECKS=1;");
noggit_db.rollback(); noggit_db.rollback();
return false; return false;
} }
@@ -218,16 +214,12 @@ namespace Noggit
if (!query.exec(sql)) if (!query.exec(sql))
{ {
qWarning() << "Final batch insert failed:" << query.lastError().text(); qWarning() << "Final batch insert failed:" << query.lastError().text();
// query.exec("UNLOCK TABLES"); // query.exec("SET UNIQUE_CHECKS=1;");
noggit_db.rollback(); noggit_db.rollback();
return false; return false;
} }
} }
// query.exec("SET UNIQUE_CHECKS=1;");
// 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");
noggit_db.commit(); noggit_db.commit();
@@ -237,6 +229,10 @@ namespace Noggit
<< elapsedMs << "ms (" << elapsedMs << "ms ("
<< (table.RecordCount() * 1000.0 / elapsedMs) << " rows/sec)"; << (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; return true;
} }
@@ -253,7 +249,7 @@ namespace Noggit
// never use this function for more than 1 rows, implement a new bulk function // 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) 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 ? // Test connection ?
auto noggit_db = db_mgr.noggitDatabase(); 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 DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE='utf8mb4_general_ci';";
statement += ")\n ENGINE = InnoDB;"; 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); bool valid_conn = db_mgr.testConnection(Noggit::Sql::SQLDbType::Noggit);
if (!valid_conn) if (!valid_conn)
return false; return false;
@@ -426,7 +422,7 @@ namespace Noggit
} }
else else
{ {
qDebug() << "Table " << table_name.c_str() << " created or already exists."; qDebug() << "Table " << table_name.c_str() << " created.";
} }
return success; return success;

View File

@@ -2,7 +2,7 @@
#include <blizzard-database-library/include/BlizzardDatabase.h> #include <blizzard-database-library/include/BlizzardDatabase.h>
#include <blizzard-database-library/include/structures/FileStructures.h> #include <blizzard-database-library/include/structures/FileStructures.h>
#include <noggit/sql/DatabaseManager.h> #include <noggit/database/SqlDatabaseManager.h>
#include <optional> #include <optional>
@@ -27,6 +27,49 @@ namespace Noggit
bool isSigned = true; 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<int>(_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 // calls client or server db adaptively. so /sql/ is not really a good location
class ClientDatabase class ClientDatabase
{ {

View File

@@ -33,16 +33,16 @@ namespace Noggit::Sql
QString password; QString password;
}; };
class DatabaseManager class SqlDatabaseManager
{ {
public: public:
static DatabaseManager& instance() static SqlDatabaseManager& instance()
{ {
static DatabaseManager _instance; static SqlDatabaseManager _instance;
return _instance; return _instance;
} }
bool initializeDb(SQLDbType type, bool initializeDbConnection(SQLDbType type,
const QString& host, int port, const QString& host, int port,
const QString& dbName, const QString& user, const QString& password) const QString& dbName, const QString& user, const QString& password)
{ {
@@ -116,7 +116,7 @@ namespace Noggit::Sql
qWarning() << "No configuration for database type" << static_cast<int>(type); qWarning() << "No configuration for database type" << static_cast<int>(type);
} }
QSqlDatabase db = database(type); QSqlDatabase db = databaseConnection(type);
if (db.isValid() && db.isOpen()) if (db.isValid() && db.isOpen())
return true; return true;
@@ -170,9 +170,9 @@ namespace Noggit::Sql
// disable if connection is not valid // disable if connection is not valid
// settings.value("project/mysql/enabled") = false; // settings.value("project/mysql/enabled") = false;
promptText << database(type).lastError().text().toStdString() << std::endl; promptText << databaseConnection(type).lastError().text().toStdString() << std::endl;
promptText << database(type).lastError().nativeErrorCode().toStdString() << std::endl; promptText << databaseConnection(type).lastError().nativeErrorCode().toStdString() << std::endl;
promptText << database(type).lastError().databaseText().toStdString() << std::endl; promptText << databaseConnection(type).lastError().databaseText().toStdString() << std::endl;
prompt.setInformativeText(promptText.str().c_str()); prompt.setInformativeText(promptText.str().c_str());
prompt.exec(); prompt.exec();
@@ -187,26 +187,26 @@ namespace Noggit::Sql
return availableDrivers.contains(driverToString(_sql_driver), Qt::CaseInsensitive); return availableDrivers.contains(driverToString(_sql_driver), Qt::CaseInsensitive);
} }
QSqlDatabase database(SQLDbType type) const QSqlDatabase databaseConnection(SQLDbType type) const
{ {
return QSqlDatabase::database(connectionName(type)); return QSqlDatabase::database(connectionName(type));
} }
QSqlDatabase noggitDatabase() const QSqlDatabase noggitDatabase() const
{ {
return DatabaseManager::database(SQLDbType::Noggit); return SqlDatabaseManager::databaseConnection(SQLDbType::Noggit);
} }
QSqlDatabase worldDatabase() const QSqlDatabase worldDatabase() const
{ {
return DatabaseManager::database(SQLDbType::World); return SqlDatabaseManager::databaseConnection(SQLDbType::World);
} }
private: private:
DatabaseManager() = default; SqlDatabaseManager() = default;
~DatabaseManager() = default; ~SqlDatabaseManager() = default;
DatabaseManager(const DatabaseManager&) = delete; SqlDatabaseManager(const SqlDatabaseManager&) = delete;
DatabaseManager& operator=(const DatabaseManager&) = delete; SqlDatabaseManager& operator=(const SqlDatabaseManager&) = delete;
SqlDriver _sql_driver = SqlDriver::MySQL; SqlDriver _sql_driver = SqlDriver::MySQL;

View File

@@ -2,7 +2,7 @@
bool Noggit::Sql::SqlUIDStorage::hasMaxUIDStoredDB(std::size_t mapID) 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); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit);
if (!valid_conn) 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) 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); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit);
if (!valid_conn) 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) 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); bool valid_conn = db_mgr.testConnection(SQLDbType::Noggit);
if (!valid_conn) 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) 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)) if (!db_mgr.testConnection(SQLDbType::Noggit))
return; return;

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#include <noggit/sql/DatabaseManager.h> #include <noggit/database/SqlDatabaseManager.h>
namespace Noggit::Sql namespace Noggit::Sql
{ {

View File

@@ -13,7 +13,7 @@
#include <noggit/uid_storage.hpp> #include <noggit/uid_storage.hpp>
#include <noggit/application/NoggitApplication.hpp> #include <noggit/application/NoggitApplication.hpp>
#include <ClientFile.hpp> #include <ClientFile.hpp>
#include <noggit/sql/SqlUIDStorage.h> #include <noggit/database/SqlUIDStorage.h>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QByteArray> #include <QByteArray>

View File

@@ -14,7 +14,7 @@
#include <noggit/World.h> #include <noggit/World.h>
#include <blizzard-database-library/include/BlizzardDatabase.h> #include <blizzard-database-library/include/BlizzardDatabase.h>
#include <noggit/sql/ClientDatabase.h> #include <noggit/database/ClientDatabase.h>
#include <QApplication> #include <QApplication>
#include <QButtonGroup> #include <QButtonGroup>
@@ -649,7 +649,6 @@ void MapCreationWizard::selectMap(int map_id)
} }
/////////////////////////////// ///////////////////////////////
_cur_map_id = map_id; _cur_map_id = map_id;
if (_world) if (_world)

View File

@@ -21,8 +21,8 @@
#include <noggit/ui/windows/settingsPanel/SettingsPanel.h> #include <noggit/ui/windows/settingsPanel/SettingsPanel.h>
#include <noggit/uid_storage.hpp> #include <noggit/uid_storage.hpp>
#include <noggit/World.h> #include <noggit/World.h>
#include <noggit/sql/SqlUIDStorage.h> #include <noggit/database/SqlUIDStorage.h>
#include <noggit/sql/ClientDatabase.h> #include <noggit/database/ClientDatabase.h>
#include <string> #include <string>
#include <blizzard-archive-library/include/Exception.hpp> #include <blizzard-archive-library/include/Exception.hpp>
@@ -94,8 +94,8 @@ namespace Noggit::Ui::Windows
auto user = settings.value("project/mysql/user").toString(); auto user = settings.value("project/mysql/user").toString();
auto pass = settings.value("project/mysql/pwd").toString(); auto pass = settings.value("project/mysql/pwd").toString();
auto& db_manager = Sql::DatabaseManager::instance(); auto& db_manager = Sql::SqlDatabaseManager::instance();
db_manager.initializeDb(Sql::SQLDbType::Noggit, host, port, db_name, user, pass); db_manager.initializeDbConnection(Sql::SQLDbType::Noggit, host, port, db_name, user, pass);
} }
setCentralWidget(_null_widget); setCentralWidget(_null_widget);

View File

@@ -3,7 +3,7 @@
#include <noggit/Log.h> #include <noggit/Log.h>
#include <noggit/ui/FramelessWindow.hpp> #include <noggit/ui/FramelessWindow.hpp>
#include <noggit/ui/windows/settingsPanel/SettingsPanel.h> #include <noggit/ui/windows/settingsPanel/SettingsPanel.h>
#include <noggit/sql/DatabaseManager.h> #include <noggit/database/SqlDatabaseManager.h>
#include <QDir> #include <QDir>
#include <QtCore/QSettings> #include <QtCore/QSettings>
@@ -170,7 +170,7 @@ namespace Noggit
// save_changes(); // old method saved and only used qsetting // 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()) if (!db_manager.isDriverAvailable())
{ {
@@ -201,7 +201,7 @@ namespace Noggit
int port = ui->_mysql_port_field->value(); int port = ui->_mysql_port_field->value();
// test temporary connection from text fields // 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); bool test2 = db_manager.testConnectionWithPopup(Sql::SQLDbType::Noggit, false);
// reconnect to saved db from settings // reconnect to saved db from settings
@@ -212,7 +212,7 @@ namespace Noggit
user = settings.value("project/mysql/user").toString(); user = settings.value("project/mysql/user").toString();
pass = settings.value("project/mysql/pwd").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)); assert(db_manager.testConnection(Sql::SQLDbType::Noggit));
} }
@@ -375,14 +375,14 @@ namespace Noggit
_settings->sync(); _settings->sync();
// reinitialize db on save // reinitialize db on save
auto& db_manager = Sql::DatabaseManager::instance(); auto& db_manager = Sql::SqlDatabaseManager::instance();
QString host = _settings->value("project/mysql/server").toString(); QString host = _settings->value("project/mysql/server").toString();
int port = _settings->value("project/mysql/port", "3306").toInt(); int port = _settings->value("project/mysql/port", "3306").toInt();
QString db_name = _settings->value("project/mysql/db").toString(); QString db_name = _settings->value("project/mysql/db").toString();
QString user = _settings->value("project/mysql/user").toString(); QString user = _settings->value("project/mysql/user").toString();
QString pass = _settings->value("project/mysql/pwd").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); bool test2 = db_manager.testConnectionWithPopup(Sql::SQLDbType::Noggit, true);