aboutsummaryrefslogtreecommitdiff
path: root/src/common/DataStores/DB2FileLoader.cpp
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/common/DataStores/DB2FileLoader.cpp
parent7eb4a67ae7250af4dd174452419f25023c46068f (diff)
Core/DataStores: Optimized DB2Storage::begin to remove searching for lowest id on every call
Diffstat (limited to 'src/common/DataStores/DB2FileLoader.cpp')
-rw-r--r--src/common/DataStores/DB2FileLoader.cpp51
1 files changed, 48 insertions, 3 deletions
diff --git a/src/common/DataStores/DB2FileLoader.cpp b/src/common/DataStores/DB2FileLoader.cpp
index e72c8ff23fb..1997438b774 100644
--- a/src/common/DataStores/DB2FileLoader.cpp
+++ b/src/common/DataStores/DB2FileLoader.cpp
@@ -177,6 +177,7 @@ public:
virtual DB2RecordCopy GetRecordCopy(uint32 copyNumber) const = 0;
virtual uint32 GetRecordCount() const = 0;
virtual uint32 GetRecordCopyCount() const = 0;
+ virtual uint32 GetMinId() const = 0;
virtual uint32 GetMaxId() const = 0;
virtual DB2FileLoadInfo const* GetLoadInfo() const = 0;
virtual DB2SectionHeader& GetSection(uint32 section) const = 0;
@@ -223,6 +224,7 @@ public:
DB2RecordCopy GetRecordCopy(uint32 copyNumber) const override;
uint32 GetRecordCount() const override;
uint32 GetRecordCopyCount() const override;
+ uint32 GetMinId() const override;
uint32 GetMaxId() const override;
DB2FileLoadInfo const* GetLoadInfo() const override;
DB2SectionHeader& GetSection(uint32 section) const override;
@@ -288,6 +290,7 @@ public:
DB2RecordCopy GetRecordCopy(uint32 copyNumber) const override;
uint32 GetRecordCount() const override;
uint32 GetRecordCopyCount() const override;
+ uint32 GetMinId() const override;
uint32 GetMaxId() const override;
DB2FileLoadInfo const* GetLoadInfo() const override;
DB2SectionHeader& GetSection(uint32 section) const override;
@@ -597,11 +600,15 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char** indexTable, uint32 ind
offset += 8;
break;
case FT_STRING:
- reinterpret_cast<LocalizedString*>(&recordData[offset])->Str[locale] = stringPool + (RecordGetString(rawRecord, x, z) - reinterpret_cast<char const*>(_stringTable));
+ if (char const* string = RecordGetString(rawRecord, x, z))
+ reinterpret_cast<LocalizedString*>(&recordData[offset])->Str[locale] = stringPool + (string - reinterpret_cast<char const*>(_stringTable));
+
offset += sizeof(LocalizedString);
break;
case FT_STRING_NOT_LOCALIZED:
- *reinterpret_cast<char**>(&recordData[offset]) = stringPool + (RecordGetString(rawRecord, x, z) - reinterpret_cast<char const*>(_stringTable));
+ if (char const* string = RecordGetString(rawRecord, x, z))
+ *reinterpret_cast<char**>(&recordData[offset]) = stringPool + (string - reinterpret_cast<char const*>(_stringTable));
+
offset += sizeof(char*);
break;
default:
@@ -800,7 +807,7 @@ char const* DB2FileLoaderRegularImpl::RecordGetString(uint8 const* record, uint3
uint32 fieldOffset = GetFieldOffset(field) + sizeof(uint32) * arrayIndex;
uint32 stringOffset = RecordGetVarInt<uint32>(record, field, arrayIndex);
ASSERT(stringOffset < _header->RecordSize * _header->RecordCount + _header->StringTableSize);
- return stringOffset ? reinterpret_cast<char const*>(record + fieldOffset + stringOffset) : EmptyDb2String;
+ return stringOffset ? reinterpret_cast<char const*>(record + fieldOffset + stringOffset) : nullptr;
}
template<typename T>
@@ -927,6 +934,34 @@ void DB2FileLoaderRegularImpl::RecordDestroyFieldOffsets(std::size_t*& /*fieldOf
{
}
+uint32 DB2FileLoaderRegularImpl::GetMinId() const
+{
+ uint32 minId = std::numeric_limits<uint32>::max();
+ for (uint32 row = 0; row < _header->RecordCount; ++row)
+ {
+ unsigned char const* rawRecord = GetRawRecordData(row, nullptr);
+ if (!rawRecord)
+ continue;
+
+ uint32 id = RecordGetId(rawRecord, row);
+ if (id < minId)
+ minId = id;
+ }
+
+ for (uint32 copy = 0; copy < GetRecordCopyCount(); ++copy)
+ {
+ uint32 id = GetRecordCopy(copy).NewRowId;
+ if (id < minId)
+ minId = id;
+ }
+
+ if (minId == std::numeric_limits<uint32>::max())
+ minId = 0;
+
+ ASSERT(minId >= _header->MinId);
+ return minId;
+}
+
uint32 DB2FileLoaderRegularImpl::GetMaxId() const
{
uint32 maxId = 0;
@@ -1617,6 +1652,11 @@ void DB2FileLoaderSparseImpl::CalculateAndStoreFieldOffsets(uint8 const* rawReco
}
}
+uint32 DB2FileLoaderSparseImpl::GetMinId() const
+{
+ return _header->MinId;
+}
+
uint32 DB2FileLoaderSparseImpl::GetMaxId() const
{
return _header->MaxId;
@@ -2076,6 +2116,11 @@ uint32 DB2FileLoader::GetRecordCopyCount() const
return _impl->GetRecordCopyCount();
}
+uint32 DB2FileLoader::GetMinId() const
+{
+ return _impl->GetMinId();
+}
+
uint32 DB2FileLoader::GetMaxId() const
{
return _impl->GetMaxId();