aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-06-06 23:14:18 +0200
committerShauren <shauren.trinity@gmail.com>2020-06-06 23:40:53 +0200
commitb47c19d5068ef086b519bfaae0a008a5b85c2644 (patch)
tree27ccc8a13fb9d6b109090dc8843c4043dbd468b3 /src/server/shared
parent63fba4751142d7a16d6316e9fb5ad844da088509 (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.cpp18
-rw-r--r--src/server/shared/DataStores/DB2DatabaseLoader.h4
-rw-r--r--src/server/shared/DataStores/DB2Store.cpp27
-rw-r--r--src/server/shared/DataStores/DB2Store.h2
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;
};