AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
DBUpdater< T > Class Template Reference

#include "DBUpdater.h"

Public Types

using Path = std::filesystem::path
 

Public Member Functions

std::string GetConfigEntry ()
 
std::string GetTableName ()
 
std::string GetBaseFilesDirectory ()
 
bool IsEnabled (uint32 const updateMask)
 
std::string GetDBModuleName ()
 
std::string GetConfigEntry ()
 
std::string GetTableName ()
 
std::string GetBaseFilesDirectory ()
 
bool IsEnabled (uint32 const updateMask)
 
std::string GetDBModuleName ()
 
std::string GetConfigEntry ()
 
std::string GetTableName ()
 
std::string GetBaseFilesDirectory ()
 
bool IsEnabled (uint32 const updateMask)
 
std::string GetDBModuleName ()
 

Static Public Member Functions

static std::string GetConfigEntry ()
 
static std::string GetTableName ()
 
static std::string GetBaseFilesDirectory ()
 
static bool IsEnabled (uint32 const updateMask)
 
static BaseLocation GetBaseLocationType ()
 
static bool Create (DatabaseWorkerPool< T > &pool)
 
static bool Update (DatabaseWorkerPool< T > &pool, std::string_view modulesList={})
 
static bool Update (DatabaseWorkerPool< T > &pool, std::vector< std::string > const *setDirectories)
 
static bool Populate (DatabaseWorkerPool< T > &pool)
 
static std::string GetDBModuleName ()
 

Static Private Member Functions

static QueryResult Retrieve (DatabaseWorkerPool< T > &pool, std::string const &query)
 
static void Apply (DatabaseWorkerPool< T > &pool, std::string const &query)
 
static void ApplyFile (DatabaseWorkerPool< T > &pool, Path const &path)
 
static void ApplyFile (DatabaseWorkerPool< T > &pool, std::string const &host, std::string const &user, std::string const &password, std::string const &port_or_socket, std::string const &database, std::string const &ssl, Path const &path)
 

Detailed Description

template<class T>
class DBUpdater< T >

Member Typedef Documentation

◆ Path

template<class T >
using DBUpdater< T >::Path = std::filesystem::path

Member Function Documentation

◆ Apply()

template<class T >
void DBUpdater< T >::Apply ( DatabaseWorkerPool< T > &  pool,
std::string const &  query 
)
staticprivate
440{
441 pool.DirectExecute(query.c_str());
442}
void DirectExecute(std::string_view sql)
Definition DatabaseWorkerPool.cpp:532

References DatabaseWorkerPool< T >::DirectExecute().

Referenced by DBUpdater< T >::Update(), and DBUpdater< T >::Update().

◆ ApplyFile() [1/2]

template<class T >
void DBUpdater< T >::ApplyFile ( DatabaseWorkerPool< T > &  pool,
Path const &  path 
)
staticprivate
446{
449}
static void ApplyFile(DatabaseWorkerPool< T > &pool, Path const &path)
Definition DBUpdater.cpp:445
MySQLConnectionInfo const * GetConnectionInfo() const
Definition DatabaseWorkerPool.h:71
std::string host
Definition MySQLConnection.h:49
std::string port_or_socket
Definition MySQLConnection.h:50
std::string user
Definition MySQLConnection.h:46
std::string database
Definition MySQLConnection.h:48
std::string ssl
Definition MySQLConnection.h:51
std::string password
Definition MySQLConnection.h:47

References DBUpdater< T >::ApplyFile(), MySQLConnectionInfo::database, DatabaseWorkerPool< T >::GetConnectionInfo(), MySQLConnectionInfo::host, MySQLConnectionInfo::password, MySQLConnectionInfo::port_or_socket, MySQLConnectionInfo::ssl, and MySQLConnectionInfo::user.

Referenced by DBUpdater< T >::ApplyFile(), DBUpdater< T >::Create(), DBUpdater< T >::Update(), and DBUpdater< T >::Update().

◆ ApplyFile() [2/2]

template<class T >
void DBUpdater< T >::ApplyFile ( DatabaseWorkerPool< T > &  pool,
std::string const &  host,
std::string const &  user,
std::string const &  password,
std::string const &  port_or_socket,
std::string const &  database,
std::string const &  ssl,
Path const &  path 
)
staticprivate
454{
455 std::string configTempDir = sConfigMgr->GetOption<std::string>("TempDir", "");
456
457 auto tempDir = configTempDir.empty() ? std::filesystem::temp_directory_path().string() : configTempDir;
458
459 tempDir = Acore::String::AddSuffixIfNotExists(tempDir, std::filesystem::path::preferred_separator);
460
461 std::string confFileName = "mysql_ac.conf";
462
463 std::ofstream outfile (tempDir + confFileName);
464
465 outfile << "[client]\npassword = \"" << password << '"' << std::endl;
466
467 outfile.close();
468
469 std::vector<std::string> args;
470 args.reserve(9);
471
472 args.emplace_back("--defaults-extra-file="+tempDir + confFileName+"");
473
474 // CLI Client connection info
475 args.emplace_back("-h" + host);
476 args.emplace_back("-u" + user);
477
478 // Check if we want to connect through ip or socket (Unix only)
479#ifdef _WIN32
480
481 if (host == ".")
482 args.emplace_back("--protocol=PIPE");
483 else
484 args.emplace_back("-P" + port_or_socket);
485
486#else
487
488 if (!std::isdigit(port_or_socket[0]))
489 {
490 // We can't check if host == "." here, because it is named localhost if socket option is enabled
491 args.emplace_back("-P0");
492 args.emplace_back("--protocol=SOCKET");
493 args.emplace_back("-S" + port_or_socket);
494 }
495 else
496 // generic case
497 args.emplace_back("-P" + port_or_socket);
498
499#endif
500
501 // Set the default charset to utf8
502 args.emplace_back("--default-character-set=utf8");
503
504 // Set max allowed packet to 1 GB
505 args.emplace_back("--max-allowed-packet=1GB");
506
507 if (ssl == "ssl")
508 args.emplace_back("--ssl-mode=REQUIRED");
509
510 // Database
511 if (!database.empty())
512 args.emplace_back(database);
513
514 // Invokes a mysql process which doesn't leak credentials to logs
516 "sql.updates", path.generic_string(), true);
517
518 if (ret != EXIT_SUCCESS)
519 {
520 LOG_FATAL("sql.updates", "Applying of file \'{}\' to database \'{}\' failed!" \
521 " If you are a user, please pull the latest revision from the repository. "
522 "Also make sure you have not applied any of the databases with your sql client. "
523 "You cannot use auto-update system and import sql files from AzerothCore repository with your sql client. "
524 "If you are a developer, please fix your sql query.",
525 path.generic_string(), pool.GetConnectionInfo()->database);
526
527 if (!sConfigMgr->isDryRun())
528 {
529 if (uint32 delay = sConfigMgr->GetOption<uint32>("Updates.ExceptionShutdownDelay", 10000))
530 std::this_thread::sleep_for(Milliseconds(delay));
531
532 throw UpdateException("update failed");
533 }
534 }
535}
std::uint32_t uint32
Definition Define.h:107
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:27
#define LOG_FATAL(filterType__,...)
Definition Log.h:141
static std::string GetCorrectedMySQLExecutable()
Definition DBUpdater.cpp:32
Definition DBUpdater.h:39
#define sConfigMgr
Definition Config.h:93
AC_COMMON_API std::string AddSuffixIfNotExists(std::string str, const char suffix)
Util function to add a suffix char. Can be used to add a slash at the end of a path.
Definition StringFormat.cpp:73
int StartProcess(std::string const &executable, std::vector< std::string > const &args, std::string const &logger, std::string input_file, bool secure)
Definition StartProcess.cpp:169

References Acore::String::AddSuffixIfNotExists(), MySQLConnectionInfo::database, DatabaseWorkerPool< T >::GetConnectionInfo(), DBUpdaterUtil::GetCorrectedMySQLExecutable(), LOG_FATAL, sConfigMgr, and Acore::StartProcess().

◆ Create()

template<class T >
bool DBUpdater< T >::Create ( DatabaseWorkerPool< T > &  pool)
static
175{
176 LOG_WARN("sql.updates", "Database \"{}\" does not exist", pool.GetConnectionInfo()->database);
177
178 const char* disableInteractive = std::getenv("AC_DISABLE_INTERACTIVE");
179
180 if (!sConfigMgr->isDryRun() && (disableInteractive == nullptr || std::strcmp(disableInteractive, "1") != 0))
181 {
182 std::cout << "Do you want to create it? [yes (default) / no]:" << std::endl;
183 std::string answer;
184 std::getline(std::cin, answer);
185 if (!answer.empty() && !(answer.substr(0, 1) == "y"))
186 return false;
187 }
188
189 LOG_INFO("sql.updates", "Creating database \"{}\"...", pool.GetConnectionInfo()->database);
190
191 // Path of temp file
192 static Path const temp("create_table.sql");
193
194 // Create temporary query to use external MySQL CLi
195 std::ofstream file(temp.generic_string());
196 if (!file.is_open())
197 {
198 LOG_FATAL("sql.updates", "Failed to create temporary query file \"{}\"!", temp.generic_string());
199 return false;
200 }
201
202 file << "CREATE DATABASE `" << pool.GetConnectionInfo()->database << "` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci;\n\n";
203 file.close();
204
205 try
206 {
208 pool.GetConnectionInfo()->port_or_socket, "", pool.GetConnectionInfo()->ssl, temp);
209 }
210 catch (UpdateException&)
211 {
212 LOG_FATAL("sql.updates", "Failed to create database {}! Does the user (named in *.conf) have `CREATE`, `ALTER`, `DROP`, `INSERT` and `DELETE` privileges on the MySQL server?", pool.GetConnectionInfo()->database);
213 std::filesystem::remove(temp);
214 return false;
215 }
216
217 LOG_INFO("sql.updates", "Done.");
218 LOG_INFO("sql.updates", " ");
219 std::filesystem::remove(temp);
220 return true;
221}
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_WARN(filterType__,...)
Definition Log.h:149
std::filesystem::path Path
Definition DBUpdater.h:71

References DBUpdater< T >::ApplyFile(), MySQLConnectionInfo::database, DatabaseWorkerPool< T >::GetConnectionInfo(), MySQLConnectionInfo::host, LOG_FATAL, LOG_INFO, LOG_WARN, MySQLConnectionInfo::password, MySQLConnectionInfo::port_or_socket, sConfigMgr, MySQLConnectionInfo::ssl, and MySQLConnectionInfo::user.

◆ GetBaseFilesDirectory() [1/4]

std::string DBUpdater< LoginDatabaseConnection >::GetBaseFilesDirectory ( )
82{
83 return BuiltInConfig::GetSourceDirectory() + "/data/sql/base/db_auth/";
84}
AC_COMMON_API std::string GetSourceDirectory()
Definition BuiltInConfig.cpp:42

References BuiltInConfig::GetSourceDirectory().

◆ GetBaseFilesDirectory() [2/4]

std::string DBUpdater< WorldDatabaseConnection >::GetBaseFilesDirectory ( )
115{
116 return BuiltInConfig::GetSourceDirectory() + "/data/sql/base/db_world/";
117}

References BuiltInConfig::GetSourceDirectory().

◆ GetBaseFilesDirectory() [3/4]

std::string DBUpdater< CharacterDatabaseConnection >::GetBaseFilesDirectory ( )
148{
149 return BuiltInConfig::GetSourceDirectory() + "/data/sql/base/db_characters/";
150}

References BuiltInConfig::GetSourceDirectory().

◆ GetBaseFilesDirectory() [4/4]

template<class T >
static std::string DBUpdater< T >::GetBaseFilesDirectory ( )
static

◆ GetBaseLocationType()

template<class T >
BaseLocation DBUpdater< T >::GetBaseLocationType ( )
static
169{
170 return LOCATION_REPOSITORY;
171}
@ LOCATION_REPOSITORY
Definition DBUpdater.h:52

References LOCATION_REPOSITORY.

◆ GetConfigEntry() [1/4]

std::string DBUpdater< LoginDatabaseConnection >::GetConfigEntry ( )
70{
71 return "Updates.Auth";
72}

◆ GetConfigEntry() [2/4]

std::string DBUpdater< WorldDatabaseConnection >::GetConfigEntry ( )
103{
104 return "Updates.World";
105}

◆ GetConfigEntry() [3/4]

std::string DBUpdater< CharacterDatabaseConnection >::GetConfigEntry ( )
136{
137 return "Updates.Character";
138}

◆ GetConfigEntry() [4/4]

template<class T >
static std::string DBUpdater< T >::GetConfigEntry ( )
inlinestatic

◆ GetDBModuleName() [1/4]

std::string DBUpdater< LoginDatabaseConnection >::GetDBModuleName ( )
95{
96 // must be lowercase
97 return "auth";
98}

◆ GetDBModuleName() [2/4]

std::string DBUpdater< WorldDatabaseConnection >::GetDBModuleName ( )
128{
129 // must be lowercase
130 return "world";
131}

◆ GetDBModuleName() [3/4]

std::string DBUpdater< CharacterDatabaseConnection >::GetDBModuleName ( )
161{
162 // must be lowercase
163 return "characters";
164}

◆ GetDBModuleName() [4/4]

template<class T >
static std::string DBUpdater< T >::GetDBModuleName ( )
static

◆ GetTableName() [1/4]

std::string DBUpdater< LoginDatabaseConnection >::GetTableName ( )
76{
77 return "Auth";
78}

◆ GetTableName() [2/4]

std::string DBUpdater< WorldDatabaseConnection >::GetTableName ( )
109{
110 return "World";
111}

◆ GetTableName() [3/4]

std::string DBUpdater< CharacterDatabaseConnection >::GetTableName ( )
142{
143 return "Character";
144}

◆ GetTableName() [4/4]

template<class T >
static std::string DBUpdater< T >::GetTableName ( )
inlinestatic

◆ IsEnabled() [1/4]

bool DBUpdater< LoginDatabaseConnection >::IsEnabled ( uint32 const  updateMask)
88{
89 // This way silences warnings under msvc
90 return (updateMask & DatabaseLoader::DATABASE_LOGIN) ? true : false;
91}
@ DATABASE_LOGIN
Definition DatabaseLoader.h:48

References DatabaseLoader::DATABASE_LOGIN.

◆ IsEnabled() [2/4]

bool DBUpdater< WorldDatabaseConnection >::IsEnabled ( uint32 const  updateMask)
121{
122 // This way silences warnings under msvc
123 return (updateMask & DatabaseLoader::DATABASE_WORLD) ? true : false;
124}
@ DATABASE_WORLD
Definition DatabaseLoader.h:50

References DatabaseLoader::DATABASE_WORLD.

◆ IsEnabled() [3/4]

bool DBUpdater< CharacterDatabaseConnection >::IsEnabled ( uint32 const  updateMask)
154{
155 // This way silences warnings under msvc
156 return (updateMask & DatabaseLoader::DATABASE_CHARACTER) ? true : false;
157}
@ DATABASE_CHARACTER
Definition DatabaseLoader.h:49

References DatabaseLoader::DATABASE_CHARACTER.

◆ IsEnabled() [4/4]

template<class T >
static bool DBUpdater< T >::IsEnabled ( uint32 const  updateMask)
static

◆ Populate()

template<class T >
bool DBUpdater< T >::Populate ( DatabaseWorkerPool< T > &  pool)
static
361{
362 {
363 QueryResult const result = Retrieve(pool, "SHOW TABLES");
364 if (result && (result->GetRowCount() > 0))
365 return true;
366 }
367
369 return false;
370
371 LOG_INFO("sql.updates", "Database {} is empty, auto populating it...", DBUpdater<T>::GetTableName());
372
373 std::string const DirPathStr = DBUpdater<T>::GetBaseFilesDirectory();
374
375 Path const DirPath(DirPathStr);
376 if (!std::filesystem::is_directory(DirPath))
377 {
378 LOG_ERROR("sql.updates", ">> Directory \"{}\" not exist", DirPath.generic_string());
379 return false;
380 }
381
382 if (DirPath.empty())
383 {
384 LOG_ERROR("sql.updates", ">> Directory \"{}\" is empty", DirPath.generic_string());
385 return false;
386 }
387
388 std::filesystem::directory_iterator const DirItr;
389 uint32 FilesCount = 0;
390
391 for (std::filesystem::directory_iterator itr(DirPath); itr != DirItr; ++itr)
392 {
393 if (itr->path().extension() == ".sql")
394 FilesCount++;
395 }
396
397 if (!FilesCount)
398 {
399 LOG_ERROR("sql.updates", ">> In directory \"{}\" not exist '*.sql' files", DirPath.generic_string());
400 return false;
401 }
402
403 std::vector<std::filesystem::path> sqlFiles;
404
405 for (const auto &entry : std::filesystem::directory_iterator(DirPath))
406 {
407 if (entry.path().extension() == ".sql")
408 sqlFiles.push_back(entry.path());
409 }
410
411 std::sort(sqlFiles.begin(), sqlFiles.end());
412
413 for (const auto &file : sqlFiles)
414 {
415 LOG_INFO("sql.updates", ">> Applying \'{}\'...", file.filename().generic_string());
416
417 try
418 {
419 ApplyFile(pool, file);
420 }
421 catch (UpdateException&)
422 {
423 return false;
424 }
425 }
426
427 LOG_INFO("sql.updates", ">> Done!");
428 LOG_INFO("sql.updates", " ");
429 return true;
430}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
static bool CheckExecutable()
Definition DBUpdater.cpp:40
Definition DBUpdater.h:69
static QueryResult Retrieve(DatabaseWorkerPool< T > &pool, std::string const &query)
Definition DBUpdater.cpp:433
static std::string GetBaseFilesDirectory()
STL namespace.

References DBUpdaterUtil::CheckExecutable(), DBUpdater< T >::GetBaseFilesDirectory(), LOG_ERROR, and LOG_INFO.

◆ Retrieve()

template<class T >
QueryResult DBUpdater< T >::Retrieve ( DatabaseWorkerPool< T > &  pool,
std::string const &  query 
)
staticprivate
434{
435 return pool.Query(query.c_str());
436}
QueryResult Query(std::string_view sql)
Definition DatabaseWorkerPool.cpp:181

References DatabaseWorkerPool< T >::Query().

Referenced by DBUpdater< T >::Update(), and DBUpdater< T >::Update().

◆ Update() [1/2]

template<class T >
bool DBUpdater< T >::Update ( DatabaseWorkerPool< T > &  pool,
std::string_view  modulesList = {} 
)
static
225{
227 return false;
228
229 LOG_INFO("sql.updates", "Updating {} database...", DBUpdater<T>::GetTableName());
230
231 Path const sourceDirectory(BuiltInConfig::GetSourceDirectory());
232
233 if (!is_directory(sourceDirectory))
234 {
235 LOG_ERROR("sql.updates", "DBUpdater: The given source directory {} does not exist, change the path to the directory where your sql directory exists (for example c:\\source\\azerothcore). Shutting down.",
236 sourceDirectory.generic_string());
237 return false;
238 }
239
240 auto CheckUpdateTable = [&](std::string const& tableName)
241 {
242 auto checkTable = DBUpdater<T>::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName));
243 if (!checkTable)
244 {
245 LOG_WARN("sql.updates", "> Table '{}' not exist! Try add based table", tableName);
246
247 Path const temp(GetBaseFilesDirectory() + tableName + ".sql");
248
249 try
250 {
251 DBUpdater<T>::ApplyFile(pool, temp);
252 }
253 catch (UpdateException&)
254 {
255 LOG_FATAL("sql.updates", "Failed apply file to database {}! Does the user (named in *.conf) have `INSERT` and `DELETE` privileges on the MySQL server?", pool.GetConnectionInfo()->database);
256 return false;
257 }
258
259 return true;
260 }
261
262 return true;
263 };
264
265 if (!CheckUpdateTable("updates") || !CheckUpdateTable("updates_include"))
266 return false;
267
268 UpdateFetcher updateFetcher(sourceDirectory, [&](std::string const & query) { DBUpdater<T>::Apply(pool, query); },
269 [&](Path const & file) { DBUpdater<T>::ApplyFile(pool, file); },
270 [&](std::string const & query) -> QueryResult { return DBUpdater<T>::Retrieve(pool, query); }, DBUpdater<T>::GetDBModuleName(), modulesList);
271
272 UpdateResult result;
273 try
274 {
275 result = updateFetcher.Update(
276 sConfigMgr->GetOption<bool>("Updates.Redundancy", true),
277 sConfigMgr->GetOption<bool>("Updates.AllowRehash", true),
278 sConfigMgr->GetOption<bool>("Updates.ArchivedRedundancy", false),
279 sConfigMgr->GetOption<int32>("Updates.CleanDeadRefMaxCount", 3));
280 }
281 catch (UpdateException&)
282 {
283 return false;
284 }
285
286 std::string const info = Acore::StringFormat("Containing {} new and {} archived updates.", result.recent, result.archived);
287
288 if (!result.updated)
289 LOG_INFO("sql.updates", ">> {} database is up-to-date! {}", DBUpdater<T>::GetTableName(), info);
290 else
291 LOG_INFO("sql.updates", ">> Applied {} {}. {}", result.updated, result.updated == 1 ? "query" : "queries", info);
292
293 LOG_INFO("sql.updates", " ");
294
295 return true;
296}
std::int32_t int32
Definition Define.h:103
static void Apply(DatabaseWorkerPool< T > &pool, std::string const &query)
Definition DBUpdater.cpp:439
static std::string GetDBModuleName()
Definition UpdateFetcher.h:43
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44
Definition UpdateFetcher.h:30

References DBUpdater< T >::Apply(), DBUpdater< T >::ApplyFile(), DBUpdaterUtil::CheckExecutable(), MySQLConnectionInfo::database, DatabaseWorkerPool< T >::GetConnectionInfo(), DBUpdater< T >::GetDBModuleName(), BuiltInConfig::GetSourceDirectory(), LOG_ERROR, LOG_FATAL, LOG_INFO, LOG_WARN, DBUpdater< T >::Retrieve(), sConfigMgr, and Acore::StringFormat().

◆ Update() [2/2]

template<class T >
bool DBUpdater< T >::Update ( DatabaseWorkerPool< T > &  pool,
std::vector< std::string > const *  setDirectories 
)
static
300{
302 {
303 return false;
304 }
305
306 Path const sourceDirectory(BuiltInConfig::GetSourceDirectory());
307 if (!is_directory(sourceDirectory))
308 {
309 return false;
310 }
311
312 auto CheckUpdateTable = [&](std::string const& tableName)
313 {
314 auto checkTable = DBUpdater<T>::Retrieve(pool, Acore::StringFormat("SHOW TABLES LIKE '{}'", tableName));
315 if (!checkTable)
316 {
317 Path const temp(GetBaseFilesDirectory() + tableName + ".sql");
318 try
319 {
320 DBUpdater<T>::ApplyFile(pool, temp);
321 }
322 catch (UpdateException&)
323 {
324 return false;
325 }
326
327 return true;
328 }
329
330 return true;
331 };
332
333 if (!CheckUpdateTable("updates") || !CheckUpdateTable("updates_include"))
334 {
335 return false;
336 }
337
338 UpdateFetcher updateFetcher(sourceDirectory, [&](std::string const & query) { DBUpdater<T>::Apply(pool, query); },
339 [&](Path const & file) { DBUpdater<T>::ApplyFile(pool, file); },
340 [&](std::string const & query) -> QueryResult { return DBUpdater<T>::Retrieve(pool, query); }, DBUpdater<T>::GetDBModuleName(), setDirectories);
341
342 UpdateResult result;
343 try
344 {
345 result = updateFetcher.Update(
346 sConfigMgr->GetOption<bool>("Updates.Redundancy", true),
347 sConfigMgr->GetOption<bool>("Updates.AllowRehash", true),
348 sConfigMgr->GetOption<bool>("Updates.ArchivedRedundancy", false),
349 sConfigMgr->GetOption<int32>("Updates.CleanDeadRefMaxCount", 3));
350 }
351 catch (UpdateException&)
352 {
353 return false;
354 }
355
356 return true;
357}

References DBUpdater< T >::Apply(), DBUpdater< T >::ApplyFile(), DBUpdaterUtil::CheckExecutable(), DBUpdater< T >::GetDBModuleName(), BuiltInConfig::GetSourceDirectory(), DBUpdater< T >::Retrieve(), sConfigMgr, and Acore::StringFormat().


The documentation for this class was generated from the following files: