diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-06-06 23:14:18 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-06-06 23:40:53 +0200 |
| commit | b47c19d5068ef086b519bfaae0a008a5b85c2644 (patch) | |
| tree | 27ccc8a13fb9d6b109090dc8843c4043dbd468b3 /src/server/shared | |
| parent | 63fba4751142d7a16d6316e9fb5ad844da088509 (diff) | |
Core/DataStores: Allow custom hotfixes (VerifiedBuild <= 0, has loading priority) to coexist with sniffed data (VerifiedBuild > 0)
Diffstat (limited to 'src/server/shared')
| -rw-r--r-- | src/server/shared/DataStores/DB2DatabaseLoader.cpp | 18 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2DatabaseLoader.h | 4 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2Store.cpp | 27 | ||||
| -rw-r--r-- | src/server/shared/DataStores/DB2Store.h | 2 |
4 files changed, 35 insertions, 16 deletions
diff --git a/src/server/shared/DataStores/DB2DatabaseLoader.cpp b/src/server/shared/DataStores/DB2DatabaseLoader.cpp index a449428a5fd..9386f7726bf 100644 --- a/src/server/shared/DataStores/DB2DatabaseLoader.cpp +++ b/src/server/shared/DataStores/DB2DatabaseLoader.cpp @@ -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) diff --git a/src/server/shared/DataStores/DB2DatabaseLoader.h b/src/server/shared/DataStores/DB2DatabaseLoader.h index ba9d71f960d..7038bbcb770 100644 --- a/src/server/shared/DataStores/DB2DatabaseLoader.h +++ b/src/server/shared/DataStores/DB2DatabaseLoader.h @@ -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: diff --git a/src/server/shared/DataStores/DB2Store.cpp b/src/server/shared/DataStores/DB2Store.cpp index 2f310ce97d8..8445f4177bb 100644 --- a/src/server/shared/DataStores/DB2Store.cpp +++ b/src/server/shared/DataStores/DB2Store.cpp @@ -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(); } diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index fd9a773ff2a..3c479aa3d0c 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -62,7 +62,7 @@ protected: uint32 _fieldCount; DB2LoadInfo const* _loadInfo; char* _dataTable; - char* _dataTableEx; + char* _dataTableEx[2]; std::vector<char*> _stringPool; uint32 _indexTableSize; }; |
