mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/DataStores: Allow custom hotfixes (VerifiedBuild <= 0, has loading priority) to coexist with sniffed data (VerifiedBuild > 0)
This commit is contained in:
2364
sql/updates/hotfixes/master/2020_06_06_00_hotfixes.sql
Normal file
2364
sql/updates/hotfixes/master/2020_06_06_00_hotfixes.sql
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -33,10 +33,12 @@ DB2LoadInfo::DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2
|
||||
|
||||
static char const* nullStr = "";
|
||||
|
||||
char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool)
|
||||
char* DB2DatabaseLoader::Load(bool custom, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool)
|
||||
{
|
||||
// Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format
|
||||
PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(_loadInfo->Statement));
|
||||
HotfixDatabasePreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(_loadInfo->Statement);
|
||||
stmt->setBool(0, !custom);
|
||||
PreparedQueryResult result = HotfixDatabase.Query(stmt);
|
||||
if (!result)
|
||||
return nullptr;
|
||||
|
||||
@@ -83,6 +85,9 @@ char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& string
|
||||
|
||||
char* tempDataTable = new char[result->GetRowCount() * recordSize];
|
||||
uint32* newIndexes = new uint32[result->GetRowCount()];
|
||||
if (stringFields)
|
||||
stringPool.reserve(std::max(stringPool.capacity(), stringPool.size() + stringFields * result->GetRowCount() + 1));
|
||||
|
||||
uint32 rec = 0;
|
||||
uint32 newRecords = 0;
|
||||
|
||||
@@ -200,10 +205,11 @@ char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& string
|
||||
return dataTable;
|
||||
}
|
||||
|
||||
void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool)
|
||||
void DB2DatabaseLoader::LoadStrings(bool custom, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool)
|
||||
{
|
||||
HotfixDatabasePreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(HotfixDatabaseStatements(_loadInfo->Statement + 2));
|
||||
stmt->setString(0, localeNames[locale]);
|
||||
stmt->setBool(0, !custom);
|
||||
stmt->setString(1, localeNames[locale]);
|
||||
PreparedQueryResult result = HotfixDatabase.Query(stmt);
|
||||
if (!result)
|
||||
return;
|
||||
@@ -215,6 +221,8 @@ void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexT
|
||||
uint32 fieldCount = _loadInfo->Meta->FieldCount;
|
||||
uint32 recordSize = _loadInfo->Meta->GetRecordSize();
|
||||
|
||||
stringPool.reserve(std::max(stringPool.capacity(), stringPool.size() + stringFields * result->GetRowCount() + 1));
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
@@ -284,8 +292,6 @@ void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexT
|
||||
TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u locale %s!", _storageName.c_str(), indexValue, localeNames[locale]);
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
char* DB2DatabaseLoader::AddString(char const** holder, std::string const& value)
|
||||
|
||||
@@ -37,8 +37,8 @@ class TC_SHARED_API DB2DatabaseLoader
|
||||
public:
|
||||
DB2DatabaseLoader(std::string const& storageName, DB2LoadInfo const* loadInfo) : _storageName(storageName), _loadInfo(loadInfo) { }
|
||||
|
||||
char* Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool);
|
||||
void LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool);
|
||||
char* Load(bool custom, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool);
|
||||
void LoadStrings(bool custom, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool);
|
||||
static char* AddString(char const** holder, std::string const& value);
|
||||
|
||||
private:
|
||||
|
||||
@@ -22,14 +22,15 @@
|
||||
#include "DB2Meta.h"
|
||||
|
||||
DB2StorageBase::DB2StorageBase(char const* fileName, DB2LoadInfo const* loadInfo)
|
||||
: _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(loadInfo), _dataTable(nullptr), _dataTableEx(nullptr), _indexTableSize(0)
|
||||
: _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(loadInfo), _dataTable(nullptr), _dataTableEx(), _indexTableSize(0)
|
||||
{
|
||||
}
|
||||
|
||||
DB2StorageBase::~DB2StorageBase()
|
||||
{
|
||||
delete[] _dataTable;
|
||||
delete[] _dataTableEx;
|
||||
delete[] _dataTableEx[0];
|
||||
delete[] _dataTableEx[1];
|
||||
for (char* strings : _stringPool)
|
||||
delete[] strings;
|
||||
}
|
||||
@@ -135,10 +136,19 @@ bool DB2StorageBase::LoadStringsFrom(std::string const& path, uint32 locale, cha
|
||||
|
||||
void DB2StorageBase::LoadFromDB(char**& indexTable)
|
||||
{
|
||||
char* extraStringHolders = nullptr;
|
||||
_dataTableEx = DB2DatabaseLoader(_fileName, _loadInfo).Load(_indexTableSize, indexTable, extraStringHolders, _stringPool);
|
||||
if (extraStringHolders)
|
||||
_stringPool.push_back(extraStringHolders);
|
||||
DB2DatabaseLoader loader(_fileName, _loadInfo);
|
||||
|
||||
auto loadTable = [&](bool custom)
|
||||
{
|
||||
char* extraStringHolders = nullptr;
|
||||
_dataTableEx[custom ? 1 : 0] = loader.Load(custom, _indexTableSize, indexTable, extraStringHolders, _stringPool);
|
||||
if (extraStringHolders)
|
||||
_stringPool.push_back(extraStringHolders);
|
||||
};
|
||||
|
||||
loadTable(false);
|
||||
loadTable(true);
|
||||
_stringPool.shrink_to_fit();
|
||||
}
|
||||
|
||||
void DB2StorageBase::LoadStringsFromDB(uint32 locale, char** indexTable)
|
||||
@@ -146,5 +156,8 @@ void DB2StorageBase::LoadStringsFromDB(uint32 locale, char** indexTable)
|
||||
if (!_loadInfo->GetStringFieldCount(true))
|
||||
return;
|
||||
|
||||
DB2DatabaseLoader(_fileName, _loadInfo).LoadStrings(locale, _indexTableSize, indexTable, _stringPool);
|
||||
DB2DatabaseLoader loader(_fileName, _loadInfo);
|
||||
loader.LoadStrings(false, locale, _indexTableSize, indexTable, _stringPool);
|
||||
loader.LoadStrings(true, locale, _indexTableSize, indexTable, _stringPool);
|
||||
_stringPool.shrink_to_fit();
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ protected:
|
||||
uint32 _fieldCount;
|
||||
DB2LoadInfo const* _loadInfo;
|
||||
char* _dataTable;
|
||||
char* _dataTableEx;
|
||||
char* _dataTableEx[2];
|
||||
std::vector<char*> _stringPool;
|
||||
uint32 _indexTableSize;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user