diff options
author | Kargatum <dowlandtop@yandex.com> | 2022-06-09 18:23:38 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-09 08:23:38 -0300 |
commit | 94528cd44df22ff1471cbe85074e180c61579647 (patch) | |
tree | a5fbd0c8e0723413a2718ee074bb40e4d896cff9 /src/tools | |
parent | c0ab2ab08e001ffce3c688eaf54301608af109a8 (diff) |
feat(Tools/DbImport): implement separated app for importing DB (#11614)
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/CMakeLists.txt | 35 | ||||
-rw-r--r-- | src/tools/dbimport/Main.cpp | 151 | ||||
-rw-r--r-- | src/tools/dbimport/dbimport.conf.dist | 286 |
3 files changed, 458 insertions, 14 deletions
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 9ce44a36e3..1edce4cbfa 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -27,9 +27,9 @@ if (TOOLS_BUILD MATCHES "-only") list(APPEND BUILD_TOOLS_WHITELIST map_extractor mmaps_generator vmap4_assembler vmap4_extractor) endif() - # if (TOOLS_BUILD STREQUAL "db-only") - # list(APPEND BUILD_TOOLS_WHITELIST dbimport) - # endif() + if (TOOLS_BUILD STREQUAL "db-only") + list(APPEND BUILD_TOOLS_WHITELIST dbimport) + endif() endif() # Set the TOOL_${TOOL_BUILD_NAME} variables from the @@ -66,7 +66,7 @@ list(SORT TOOL_BUILD_GRAPH_KEYS) list(REMOVE_DUPLICATES TOOL_BUILD_GRAPH_KEYS) # Display the graphs -# message("") +message("") message("* Tools build list (${TOOLS_BUILD}):") message(" |") @@ -112,19 +112,26 @@ foreach(TOOL_NAME ${TOOLS_BUILD_LIST}) add_dependencies(${TOOL_PROJECT_NAME} revision.h) - # Need fix errors + # Need fix errors in maps tools # target_link_libraries(${TOOL_PROJECT_NAME} # PRIVATE - # acore-core-interface) + # acore-dependency-interface) + + if (${TOOL_PROJECT_NAME} MATCHES "dbimport") + target_link_libraries(${TOOL_PROJECT_NAME} + PUBLIC + database + PRIVATE + acore-core-interface) - # if (${TOOL_PROJECT_NAME} MATCHES "dbimport") - # target_link_libraries(${TOOL_PROJECT_NAME} - # PUBLIC - # database) + # Install config + CopyToolConfig(${TOOL_PROJECT_NAME} ${TOOL_NAME}) + else() + + target_link_libraries(${TOOL_PROJECT_NAME} + PRIVATE + acore-dependency-interface) - # # Install config - # CopyToolConfig(${TOOL_PROJECT_NAME} ${TOOL_NAME}) - # else() target_link_libraries(${TOOL_PROJECT_NAME} PUBLIC common @@ -132,7 +139,7 @@ foreach(TOOL_NAME ${TOOLS_BUILD_LIST}) zlib Recast g3dlib) - # endif() + endif() unset(TOOL_PUBLIC_INCLUDES) CollectIncludeDirectories( diff --git a/src/tools/dbimport/Main.cpp b/src/tools/dbimport/Main.cpp new file mode 100644 index 0000000000..644e80a29e --- /dev/null +++ b/src/tools/dbimport/Main.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Banner.h" +#include "Common.h" +#include "Config.h" +#include "DatabaseEnv.h" +#include "DatabaseLoader.h" +#include "IoContext.h" +#include "Log.h" +#include "MySQLThreading.h" +#include "Util.h" +#include <boost/program_options.hpp> +#include <boost/version.hpp> +#include <csignal> +#include <filesystem> +#include <iostream> +#include <openssl/crypto.h> +#include <openssl/opensslv.h> + +#ifndef _ACORE_DB_IMPORT_CONFIG +#define _ACORE_DB_IMPORT_CONFIG "dbimport.conf" +#endif + +using namespace boost::program_options; +namespace fs = std::filesystem; + +bool StartDB(); +void StopDB(); +variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile); + +/// Launch the db import server +int main(int argc, char** argv) +{ + signal(SIGABRT, &Acore::AbortHandler); + + // Command line parsing + auto configFile = fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_DB_IMPORT_CONFIG)); + auto vm = GetConsoleArguments(argc, argv, configFile); + + // exit if help is enabled + if (vm.count("help")) + return 0; + + // Add file and args in config + sConfigMgr->Configure(configFile.generic_string(), std::vector<std::string>(argv, argv + argc)); + + if (!sConfigMgr->LoadAppConfigs()) + return 1; + + // Init logging + sLog->Initialize(); + + Acore::Banner::Show("dbimport", + [](std::string_view text) + { + LOG_INFO("dbimport", text); + }, + []() + { + LOG_INFO("dbimport", "> Using configuration file: {}", sConfigMgr->GetFilename()); + LOG_INFO("dbimport", "> Using SSL version: {} (library: {})", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); + LOG_INFO("dbimport", "> Using Boost version: {}.{}.{}", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100); + } + ); + + // Initialize the database connection + if (!StartDB()) + return 1; + + std::shared_ptr<void> dbHandle(nullptr, [](void*) { StopDB(); }); + + LOG_INFO("dbimport", "Halting process..."); + + return 0; +} + +/// Initialize connection to the database +bool StartDB() +{ + MySQL::Library_Init(); + + // Load databases + DatabaseLoader loader("dbimport"); + loader + .AddDatabase(LoginDatabase, "Login") + .AddDatabase(CharacterDatabase, "Character") + .AddDatabase(WorldDatabase, "World"); + + if (!loader.Load()) + return false; + + LOG_INFO("dbimport", "Started database connection pool."); + return true; +} + +/// Close the connection to the database +void StopDB() +{ + CharacterDatabase.Close(); + WorldDatabase.Close(); + LoginDatabase.Close(); + MySQL::Library_End(); +} + +variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile) +{ + options_description all("Allowed options"); + all.add_options() + ("help,h", "print usage message") + ("version,v", "print version build info") + ("dry-run,d", "Dry run") + ("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_DB_IMPORT_CONFIG))), "use <arg> as configuration file"); + + variables_map variablesMap; + + try + { + store(command_line_parser(argc, argv).options(all).allow_unregistered().run(), variablesMap); + notify(variablesMap); + } + catch (std::exception const& e) + { + std::cerr << e.what() << "\n"; + } + + if (variablesMap.count("help")) + { + std::cout << all << "\n"; + } + else if (variablesMap.count("dry-run")) + { + sConfigMgr->setDryRun(true); + } + + return variablesMap; +} diff --git a/src/tools/dbimport/dbimport.conf.dist b/src/tools/dbimport/dbimport.conf.dist new file mode 100644 index 0000000000..b4c1e77a45 --- /dev/null +++ b/src/tools/dbimport/dbimport.conf.dist @@ -0,0 +1,286 @@ +################################################## +# AzerothCore Database Import configuration file # +################################################## + +################################################################################################### +# SECTION INDEX +# +# EXAMPLE CONFIG +# DB IMPORT CONFIG +# MYSQL SETTINGS +# UPDATE SETTINGS +# LOGGING SYSTEM SETTINGS +# +################################################################################################### + +################################################################################################### +# EXAMPLE CONFIG +# +# Variable +# Description: Brief description what the variable is doing. +# Important: Annotation for important things about this variable. +# Example: "Example, i.e. if the value is a string" +# Default: 10 - (Enabled|Comment|Variable name in case of grouped config options) +# 0 - (Disabled|Comment|Variable name in case of grouped config options) +# +# Note to developers: +# - Copy this example to keep the formatting. +# - Line breaks should be at column 100. +################################################################################################### + +################################################################################################### +# DB IMPORT CONFIG +# +# LogsDir +# Description: Logs directory setting. +# Important: LogsDir needs to be quoted, as the string might contain space characters. +# Logs directory must exists, or log file creation will be disabled. +# Example: "/home/youruser/azerothcore/logs" +# Default: "" - (Log files will be stored in the current path) + +LogsDir = "" + +# +# SourceDirectory +# Description: The path to your AzerothCore source directory. +# If the path is left empty, the built-in CMAKE_SOURCE_DIR is used. +# Example: "../AzerothCore" +# Default: "" +# + +SourceDirectory = "" + +# +# MySQLExecutable +# Description: The path to your MySQL CLI binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MariaDB 10.9/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" +# + +MySQLExecutable = "" +################################################################################################### + +################################################################################################### +# MYSQL SETTINGS +# +# LoginDatabaseInfo +# WorldDatabaseInfo +# CharacterDatabaseInfo +# Description: Database connection settings for the world server. +# Example: "hostname;port;username;password;database" +# ".;somenumber;username;password;database" - (Use named pipes on Windows +# "enable-named-pipe" to [mysqld] +# section my.ini) +# ".;/path/to/unix_socket;username;password;database;ssl" - (use Unix sockets on +# Unix/Linux) +# Default: "127.0.0.1;3306;acore;acore;acore_auth" - (LoginDatabaseInfo) +# "127.0.0.1;3306;acore;acore;acore_world" - (WorldDatabaseInfo) +# "127.0.0.1;3306;acore;acore;acore_characters" - (CharacterDatabaseInfo) +# +# The SSL option will enable TLS when connecting to the specified database. If not provided or +# any value other than 'ssl' is set, TLS will not be used. +# + +LoginDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_auth" +WorldDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_world" +CharacterDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_characters" + +# +# Database.Reconnect.Seconds +# Database.Reconnect.Attempts +# +# Description: How many seconds between every reconnection attempt +# and how many attempts will be performed in total +# Default: 20 attempts every 15 seconds +# + +Database.Reconnect.Seconds = 5 +Database.Reconnect.Attempts = 5 + +# +# LoginDatabase.WorkerThreads +# WorldDatabase.WorkerThreads +# CharacterDatabase.WorkerThreads +# Description: The amount of worker threads spawned to handle asynchronous (delayed) MySQL +# statements. Each worker thread is mirrored with its own connection to the +# MySQL server and their own thread on the MySQL server. +# Default: 1 - (LoginDatabase.WorkerThreads) +# 1 - (WorldDatabase.WorkerThreads) +# 1 - (CharacterDatabase.WorkerThreads) +# + +LoginDatabase.WorkerThreads = 1 +WorldDatabase.WorkerThreads = 1 +CharacterDatabase.WorkerThreads = 1 + +# +# LoginDatabase.SynchThreads +# WorldDatabase.SynchThreads +# CharacterDatabase.SynchThreads +# Description: The amount of MySQL connections spawned to handle. +# Default: 1 - (LoginDatabase.WorkerThreads) +# 1 - (WorldDatabase.WorkerThreads) +# 1 - (CharacterDatabase.WorkerThreads) +# + +LoginDatabase.SynchThreads = 1 +WorldDatabase.SynchThreads = 1 +CharacterDatabase.SynchThreads = 1 +################################################################################################### + +################################################################################################### +# UPDATE SETTINGS +# +# Updates.EnableDatabases +# Description: A mask that describes which databases shall be updated. +# +# Following flags are available +# DATABASE_LOGIN = 1, // Auth database +# DATABASE_CHARACTER = 2, // Character database +# DATABASE_WORLD = 4, // World database +# +# Default: 7 - (All enabled) +# 4 - (Enable world only) +# 0 - (All disabled) + +Updates.EnableDatabases = 7 + +# +# Updates.AutoSetup +# Description: Auto populate empty databases. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AutoSetup = 1 + +# +# Updates.Redundancy +# Description: Perform data redundancy checks through hashing +# to detect changes on sql updates and reapply it. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.Redundancy = 1 + +# +# Updates.ArchivedRedundancy +# Description: Check hashes of archived updates (slows down startup). +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Updates.ArchivedRedundancy = 0 + +# +# Updates.AllowRehash +# Description: Inserts the current file hash in the database if it is left empty. +# Useful if you want to mark a file as applied but you don't know its hash. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Updates.AllowRehash = 1 + +# +# Updates.CleanDeadRefMaxCount +# Description: Cleans dead/ orphaned references that occur if an update was removed or renamed and edited in one step. +# It only starts the clean up if the count of the missing updates is below or equal the Updates.CleanDeadRefMaxCount value. +# This way prevents erasing of the update history due to wrong source directory state (maybe wrong branch or bad revision). +# Disable this if you want to know if the database is in a possible "dirty state". +# Default: 3 - (Enabled) +# 0 - (Disabled) +# -1 - (Enabled - unlimited) + +Updates.CleanDeadRefMaxCount = 3 +################################################################################################### + +################################################################################################### +# +# LOGGING SYSTEM SETTINGS +# +# Appender config values: Given an appender "name" +# Appender.name +# Description: Defines 'where to log' +# Format: Type,LogLevel,Flags,optional1,optional2,optional3 +# +# Type +# 0 - (None) +# 1 - (Console) +# 2 - (File) +# 3 - (DB) +# +# LogLevel +# 0 - (Disabled) +# 1 - (Fatal) +# 2 - (Error) +# 3 - (Warning) +# 4 - (Info) +# 5 - (Debug) +# 6 - (Trace) +# +# Flags: +# 0 - None +# 1 - Prefix Timestamp to the text +# 2 - Prefix Log Level to the text +# 4 - Prefix Log Filter type to the text +# 8 - Append timestamp to the log file name. Format: YYYY-MM-DD_HH-MM-SS (Only used with Type = 2) +# 16 - Make a backup of existing file before overwrite (Only used with Mode = w) +# +# Colors (read as optional1 if Type = Console) +# Format: "fatal error warn info debug trace" +# 0 - BLACK +# 1 - RED +# 2 - GREEN +# 3 - BROWN +# 4 - BLUE +# 5 - MAGENTA +# 6 - CYAN +# 7 - GREY +# 8 - YELLOW +# 9 - LRED +# 10 - LGREEN +# 11 - LBLUE +# 12 - LMAGENTA +# 13 - LCYAN +# 14 - WHITE +# Example: "1 9 3 6 5 8" +# +# File: Name of the file (read as optional1 if Type = File) +# Allows to use one "%s" to create dynamic files +# +# Mode: Mode to open the file (read as optional2 if Type = File) +# a - (Append) +# w - (Overwrite) +# +# MaxFileSize: Maximum file size of the log file before creating a new log file +# (read as optional3 if Type = File) +# Size is measured in bytes expressed in a 64-bit unsigned integer. +# Maximum value is 4294967295 (4 GB). Leave blank for no limit. +# NOTE: Does not work with dynamic filenames. +# Example: 536870912 (512 MB) +# + +Appender.Console=1,5,0,"1 9 3 6 5 8" +Appender.DBImport=2,5,0,DBImport.log,w + +# Logger config values: Given a logger "name" +# Logger.name +# Description: Defines 'What to log' +# Format: LogLevel,AppenderList +# +# LogLevel +# 0 - (Disabled) +# 1 - (Fatal) +# 2 - (Error) +# 3 - (Warning) +# 4 - (Info) +# 5 - (Debug) +# 6 - (Trace) +# +# AppenderList: List of appenders linked to logger +# (Using spaces as separator). +# + +Logger.root=4,Console DBImport +################################################################################################### |