aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-04-27 00:17:25 +0200
committerShauren <shauren.trinity@gmail.com>2023-04-27 00:17:25 +0200
commitf540477fed7a03f4615b818482cd7b4a47759222 (patch)
treed7d1e60f6a9eb89dc34d950665e06ff13fa65f11 /src/server/shared
parent7eb4a67ae7250af4dd174452419f25023c46068f (diff)
Core/DataStores: Optimized DB2Storage::begin to remove searching for lowest id on every call
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/DataStores/DB2DatabaseLoader.cpp8
-rw-r--r--src/server/shared/DataStores/DB2DatabaseLoader.h2
-rw-r--r--src/server/shared/DataStores/DB2Store.cpp7
-rw-r--r--src/server/shared/DataStores/DB2Store.h3
4 files changed, 13 insertions, 7 deletions
diff --git a/src/server/shared/DataStores/DB2DatabaseLoader.cpp b/src/server/shared/DataStores/DB2DatabaseLoader.cpp
index 6513c740809..5b8cea5f0c3 100644
--- a/src/server/shared/DataStores/DB2DatabaseLoader.cpp
+++ b/src/server/shared/DataStores/DB2DatabaseLoader.cpp
@@ -25,7 +25,7 @@
static char const* nullStr = "";
-char* DB2DatabaseLoader::Load(bool custom, uint32& records, char**& indexTable, std::vector<char*>& stringPool)
+char* DB2DatabaseLoader::Load(bool custom, uint32& records, char**& indexTable, std::vector<char*>& stringPool, uint32& minId)
{
// Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format
HotfixDatabasePreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(_loadInfo->Statement);
@@ -170,7 +170,11 @@ char* DB2DatabaseLoader::Load(bool custom, uint32& records, char**& indexTable,
// insert new records to index table
for (uint32 i = 0; i < newRecords; ++i)
- indexTable[newIndexes[i]] = &dataTable[i * recordSize];
+ {
+ uint32 newId = newIndexes[i];
+ indexTable[newId] = &dataTable[i * recordSize];
+ minId = std::min(minId, newId);
+ }
delete[] tempDataTable;
delete[] newIndexes;
diff --git a/src/server/shared/DataStores/DB2DatabaseLoader.h b/src/server/shared/DataStores/DB2DatabaseLoader.h
index 914c38e785c..a36d355d1f0 100644
--- a/src/server/shared/DataStores/DB2DatabaseLoader.h
+++ b/src/server/shared/DataStores/DB2DatabaseLoader.h
@@ -37,7 +37,7 @@ class TC_SHARED_API DB2DatabaseLoader
public:
DB2DatabaseLoader(std::string const& storageName, DB2LoadInfo const* loadInfo) : _storageName(storageName), _loadInfo(loadInfo) { }
- char* Load(bool custom, uint32& records, char**& indexTable, std::vector<char*>& stringPool);
+ char* Load(bool custom, uint32& records, char**& indexTable, std::vector<char*>& stringPool, uint32& minId);
void LoadStrings(bool custom, LocaleConstant locale, uint32 records, char** indexTable, std::vector<char*>& stringPool);
static char* AddString(char const** holder, std::string const& value);
diff --git a/src/server/shared/DataStores/DB2Store.cpp b/src/server/shared/DataStores/DB2Store.cpp
index 382881d2f65..79fbfe4a9db 100644
--- a/src/server/shared/DataStores/DB2Store.cpp
+++ b/src/server/shared/DataStores/DB2Store.cpp
@@ -24,7 +24,7 @@
DB2StorageBase::DB2StorageBase(char const* fileName, DB2LoadInfo const* loadInfo)
: _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(loadInfo), _dataTable(nullptr), _dataTableEx(),
- _indexTable(nullptr), _indexTableSize(0)
+ _indexTable(nullptr), _indexTableSize(0), _minId(0)
{
}
@@ -95,6 +95,7 @@ void DB2StorageBase::Load(std::string const& path, LocaleConstant locale)
_fieldCount = db2.GetCols();
_tableHash = db2.GetTableHash();
_layoutHash = db2.GetLayoutHash();
+ _minId = db2.GetMinId();
// load raw non-string data
_dataTable = db2.AutoProduceData(_indexTableSize, _indexTable);
@@ -127,8 +128,8 @@ void DB2StorageBase::LoadFromDB()
{
DB2DatabaseLoader loader(_fileName, _loadInfo);
- _dataTableEx[0] = loader.Load(false, _indexTableSize, _indexTable, _stringPool);
- _dataTableEx[1] = loader.Load(true, _indexTableSize, _indexTable, _stringPool);
+ _dataTableEx[0] = loader.Load(false, _indexTableSize, _indexTable, _stringPool, _minId);
+ _dataTableEx[1] = loader.Load(true, _indexTableSize, _indexTable, _stringPool, _minId);
_stringPool.shrink_to_fit();
}
diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h
index 52f907cb279..42afd22335f 100644
--- a/src/server/shared/DataStores/DB2Store.h
+++ b/src/server/shared/DataStores/DB2Store.h
@@ -65,6 +65,7 @@ protected:
std::vector<char*> _stringPool;
char** _indexTable;
uint32 _indexTableSize;
+ uint32 _minId;
friend class UnitTestDataLoader;
};
@@ -82,7 +83,7 @@ public:
T const* LookupEntry(uint32 id) const { return (id >= _indexTableSize) ? nullptr : reinterpret_cast<T const*>(_indexTable[id]); }
T const* AssertEntry(uint32 id) const { return ASSERT_NOTNULL(LookupEntry(id)); }
- iterator begin() const { return iterator(reinterpret_cast<T const* const*>(_indexTable), _indexTableSize); }
+ iterator begin() const { return iterator(reinterpret_cast<T const* const*>(_indexTable), _indexTableSize, _minId); }
iterator end() const { return iterator(reinterpret_cast<T const* const*>(_indexTable), _indexTableSize, _indexTableSize); }
};