mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/DataStores: Minor db2 loader cleanup
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include <limits>
|
||||
#include <sstream>
|
||||
#include <system_error>
|
||||
#include <utility>
|
||||
#include <cstring>
|
||||
|
||||
enum class DB2ColumnCompression : uint32
|
||||
@@ -146,14 +147,18 @@ int32 DB2FileLoadInfo::GetFieldIndexByMetaIndex(uint32 metaIndex) const
|
||||
return ourIndex;
|
||||
}
|
||||
|
||||
DB2FileSource::~DB2FileSource()
|
||||
{
|
||||
}
|
||||
DB2FileSource::DB2FileSource() = default;
|
||||
DB2FileSource::~DB2FileSource() = default;
|
||||
|
||||
class DB2FileLoaderImpl
|
||||
{
|
||||
public:
|
||||
virtual ~DB2FileLoaderImpl() { }
|
||||
DB2FileLoaderImpl() = default;
|
||||
DB2FileLoaderImpl(DB2FileLoaderImpl const& other) = delete;
|
||||
DB2FileLoaderImpl(DB2FileLoaderImpl&& other) noexcept = delete;
|
||||
DB2FileLoaderImpl& operator=(DB2FileLoaderImpl const& other) = delete;
|
||||
DB2FileLoaderImpl& operator=(DB2FileLoaderImpl&& other) noexcept = delete;
|
||||
virtual ~DB2FileLoaderImpl() = default;
|
||||
virtual void LoadColumnData(std::unique_ptr<DB2SectionHeader[]> sections, std::unique_ptr<DB2FieldEntry[]> fields, std::unique_ptr<DB2ColumnMeta[]> columnMeta,
|
||||
std::unique_ptr<std::unique_ptr<DB2PalletValue[]>[]> palletValues, std::unique_ptr<std::unique_ptr<DB2PalletValue[]>[]> palletArrayValues,
|
||||
std::unique_ptr<std::unordered_map<uint32, uint32>[]> commonValues) = 0;
|
||||
@@ -186,6 +191,7 @@ private:
|
||||
virtual float RecordGetFloat(uint8 const* record, uint32 field, uint32 arrayIndex) const = 0;
|
||||
virtual char const* RecordGetString(uint8 const* record, uint32 field, uint32 arrayIndex) const = 0;
|
||||
virtual std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const = 0;
|
||||
virtual std::size_t* RecordCopyDetachedFieldOffsets(std::size_t* oldOffsets) const = 0;
|
||||
virtual void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const = 0;
|
||||
};
|
||||
|
||||
@@ -193,6 +199,10 @@ class DB2FileLoaderRegularImpl final : public DB2FileLoaderImpl
|
||||
{
|
||||
public:
|
||||
DB2FileLoaderRegularImpl(char const* fileName, DB2FileLoadInfo const* loadInfo, DB2Header const* header);
|
||||
DB2FileLoaderRegularImpl(DB2FileLoaderRegularImpl const& other) = delete;
|
||||
DB2FileLoaderRegularImpl(DB2FileLoaderRegularImpl&& other) noexcept = delete;
|
||||
DB2FileLoaderRegularImpl& operator=(DB2FileLoaderRegularImpl const& other) = delete;
|
||||
DB2FileLoaderRegularImpl& operator=(DB2FileLoaderRegularImpl&& other) noexcept = delete;
|
||||
~DB2FileLoaderRegularImpl();
|
||||
|
||||
void LoadColumnData(std::unique_ptr<DB2SectionHeader[]> sections, std::unique_ptr<DB2FieldEntry[]> fields, std::unique_ptr<DB2ColumnMeta[]> columnMeta,
|
||||
@@ -232,6 +242,7 @@ private:
|
||||
uint64 RecordGetPackedValue(uint8 const* packedRecordData, uint32 bitWidth, uint32 bitOffset) const;
|
||||
uint16 GetFieldOffset(uint32 field) const;
|
||||
std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const override;
|
||||
std::size_t* RecordCopyDetachedFieldOffsets(std::size_t* oldOffsets) const override;
|
||||
void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const override;
|
||||
|
||||
char const* _fileName;
|
||||
@@ -253,6 +264,10 @@ class DB2FileLoaderSparseImpl final : public DB2FileLoaderImpl
|
||||
{
|
||||
public:
|
||||
DB2FileLoaderSparseImpl(char const* fileName, DB2FileLoadInfo const* loadInfo, DB2Header const* header, DB2FileSource* source);
|
||||
DB2FileLoaderSparseImpl(DB2FileLoaderSparseImpl const& other) = delete;
|
||||
DB2FileLoaderSparseImpl(DB2FileLoaderSparseImpl&& other) noexcept = delete;
|
||||
DB2FileLoaderSparseImpl& operator=(DB2FileLoaderSparseImpl const& other) = delete;
|
||||
DB2FileLoaderSparseImpl& operator=(DB2FileLoaderSparseImpl&& other) noexcept = delete;
|
||||
~DB2FileLoaderSparseImpl();
|
||||
|
||||
void LoadColumnData(std::unique_ptr<DB2SectionHeader[]> sections, std::unique_ptr<DB2FieldEntry[]> fields, std::unique_ptr<DB2ColumnMeta[]> columnMeta,
|
||||
@@ -291,12 +306,10 @@ private:
|
||||
uint16 GetFieldOffset(uint32 field, uint32 arrayIndex) const;
|
||||
uint16 GetFieldSize(uint32 field) const;
|
||||
std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const override;
|
||||
std::size_t* RecordCopyDetachedFieldOffsets(std::size_t* oldOffsets) const override;
|
||||
void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const override;
|
||||
void CalculateAndStoreFieldOffsets(uint8 const* rawRecord) const;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
#pragma pack(pop)
|
||||
|
||||
char const* _fileName;
|
||||
DB2FileLoadInfo const* _loadInfo;
|
||||
DB2Header const* _header;
|
||||
@@ -364,11 +377,9 @@ void DB2FileLoaderRegularImpl::SetAdditionalData(std::vector<uint32> idTable, st
|
||||
_parentIndexes = std::move(parentIndexes);
|
||||
}
|
||||
|
||||
DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl()
|
||||
{
|
||||
}
|
||||
DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl() = default;
|
||||
|
||||
static char const* const nullStr = "";
|
||||
static char const* const EmptyDb2String = "";
|
||||
|
||||
char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& indexTableSize, char**& indexTable)
|
||||
{
|
||||
@@ -411,7 +422,7 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& indexTableSize, char**&
|
||||
uint32 fieldIndex = 0;
|
||||
if (!_loadInfo->Meta->HasIndexFieldInData())
|
||||
{
|
||||
*((uint32*)(&dataTable[offset])) = indexVal;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = indexVal;
|
||||
offset += 4;
|
||||
++fieldIndex;
|
||||
}
|
||||
@@ -423,33 +434,33 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& indexTableSize, char**&
|
||||
switch (_loadInfo->Fields[fieldIndex].Type)
|
||||
{
|
||||
case FT_FLOAT:
|
||||
*((float*)(&dataTable[offset])) = RecordGetFloat(rawRecord, x, z);
|
||||
*reinterpret_cast<float*>(&dataTable[offset]) = RecordGetFloat(rawRecord, x, z);
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_INT:
|
||||
*((uint32*)(&dataTable[offset])) = RecordGetVarInt<uint32>(rawRecord, x, z);
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = RecordGetVarInt<uint32>(rawRecord, x, z);
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_BYTE:
|
||||
*((uint8*)(&dataTable[offset])) = RecordGetUInt8(rawRecord, x, z);
|
||||
*reinterpret_cast<uint8*>(&dataTable[offset]) = RecordGetUInt8(rawRecord, x, z);
|
||||
offset += 1;
|
||||
break;
|
||||
case FT_SHORT:
|
||||
*((uint16*)(&dataTable[offset])) = RecordGetUInt16(rawRecord, x, z);
|
||||
*reinterpret_cast<uint16*>(&dataTable[offset]) = RecordGetUInt16(rawRecord, x, z);
|
||||
offset += 2;
|
||||
break;
|
||||
case FT_LONG:
|
||||
*((uint64*)(&dataTable[offset])) = RecordGetUInt64(rawRecord, x, z);
|
||||
*reinterpret_cast<uint64*>(&dataTable[offset]) = RecordGetUInt64(rawRecord, x, z);
|
||||
offset += 8;
|
||||
break;
|
||||
case FT_STRING:
|
||||
for (char const*& localeStr : ((LocalizedString*)(&dataTable[offset]))->Str)
|
||||
localeStr = nullStr;
|
||||
for (char const*& localeStr : reinterpret_cast<LocalizedString*>(&dataTable[offset])->Str)
|
||||
localeStr = EmptyDb2String;
|
||||
|
||||
offset += sizeof(LocalizedString);
|
||||
break;
|
||||
case FT_STRING_NOT_LOCALIZED:
|
||||
*(char const**)(&dataTable[offset]) = nullStr;
|
||||
*reinterpret_cast<char const**>(&dataTable[offset]) = EmptyDb2String;
|
||||
offset += sizeof(char*);
|
||||
break;
|
||||
default:
|
||||
@@ -468,15 +479,15 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& indexTableSize, char**&
|
||||
switch (_loadInfo->Fields[fieldIndex].Type)
|
||||
{
|
||||
case FT_INT:
|
||||
*((uint32*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = 0;
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_BYTE:
|
||||
*((uint8*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint8*>(&dataTable[offset]) = 0;
|
||||
offset += 1;
|
||||
break;
|
||||
case FT_SHORT:
|
||||
*((uint16*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint16*>(&dataTable[offset]) = 0;
|
||||
offset += 2;
|
||||
break;
|
||||
default:
|
||||
@@ -621,7 +632,7 @@ void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** in
|
||||
{
|
||||
indexTable[copy.NewRowId] = &dataTable[offset];
|
||||
memcpy(indexTable[copy.NewRowId], indexTable[copy.SourceRowId], recordsize);
|
||||
*((uint32*)(&dataTable[offset + idFieldOffset])) = copy.NewRowId;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset + idFieldOffset]) = copy.NewRowId;
|
||||
offset += recordsize;
|
||||
}
|
||||
}
|
||||
@@ -896,6 +907,11 @@ std::size_t* DB2FileLoaderRegularImpl::RecordCreateDetachedFieldOffsets(std::siz
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::size_t* DB2FileLoaderRegularImpl::RecordCopyDetachedFieldOffsets(std::size_t* /*oldOffsets*/) const
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DB2FileLoaderRegularImpl::RecordDestroyFieldOffsets(std::size_t*& /*fieldOffsets*/) const
|
||||
{
|
||||
}
|
||||
@@ -1008,9 +1024,7 @@ DB2FileLoaderSparseImpl::DB2FileLoaderSparseImpl(char const* fileName, DB2FileLo
|
||||
{
|
||||
}
|
||||
|
||||
DB2FileLoaderSparseImpl::~DB2FileLoaderSparseImpl()
|
||||
{
|
||||
}
|
||||
DB2FileLoaderSparseImpl::~DB2FileLoaderSparseImpl() = default;
|
||||
|
||||
void DB2FileLoaderSparseImpl::LoadColumnData(std::unique_ptr<DB2SectionHeader[]> sections, std::unique_ptr<DB2FieldEntry[]> fields, std::unique_ptr<DB2ColumnMeta[]> /*columnMeta*/,
|
||||
std::unique_ptr<std::unique_ptr<DB2PalletValue[]>[]> /*palletValues*/, std::unique_ptr<std::unique_ptr<DB2PalletValue[]>[]> /*palletArrayValues*/,
|
||||
@@ -1105,7 +1119,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& indexTableSize, char**& i
|
||||
uint32 fieldIndex = 0;
|
||||
if (!_loadInfo->Meta->HasIndexFieldInData())
|
||||
{
|
||||
*((uint32*)(&dataTable[offset])) = indexVal;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = indexVal;
|
||||
offset += 4;
|
||||
++fieldIndex;
|
||||
}
|
||||
@@ -1117,33 +1131,33 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& indexTableSize, char**& i
|
||||
switch (_loadInfo->Fields[fieldIndex].Type)
|
||||
{
|
||||
case FT_FLOAT:
|
||||
*((float*)(&dataTable[offset])) = RecordGetFloat(rawRecord, x, z);
|
||||
*reinterpret_cast<float*>(&dataTable[offset]) = RecordGetFloat(rawRecord, x, z);
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_INT:
|
||||
*((uint32*)(&dataTable[offset])) = RecordGetVarInt(rawRecord, x, z, _loadInfo->Fields[fieldIndex].IsSigned);
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = RecordGetVarInt(rawRecord, x, z, _loadInfo->Fields[fieldIndex].IsSigned);
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_BYTE:
|
||||
*((uint8*)(&dataTable[offset])) = RecordGetUInt8(rawRecord, x, z);
|
||||
*reinterpret_cast<uint8*>(&dataTable[offset]) = RecordGetUInt8(rawRecord, x, z);
|
||||
offset += 1;
|
||||
break;
|
||||
case FT_SHORT:
|
||||
*((uint16*)(&dataTable[offset])) = RecordGetUInt16(rawRecord, x, z);
|
||||
*reinterpret_cast<uint16*>(&dataTable[offset]) = RecordGetUInt16(rawRecord, x, z);
|
||||
offset += 2;
|
||||
break;
|
||||
case FT_LONG:
|
||||
*((uint64*)(&dataTable[offset])) = RecordGetUInt64(rawRecord, x, z);
|
||||
*reinterpret_cast<uint64*>(&dataTable[offset]) = RecordGetUInt64(rawRecord, x, z);
|
||||
offset += 8;
|
||||
break;
|
||||
case FT_STRING:
|
||||
for (char const*& localeStr : ((LocalizedString*)(&dataTable[offset]))->Str)
|
||||
localeStr = nullStr;
|
||||
for (char const*& localeStr : reinterpret_cast<LocalizedString*>(&dataTable[offset])->Str)
|
||||
localeStr = EmptyDb2String;
|
||||
|
||||
offset += sizeof(LocalizedString);
|
||||
break;
|
||||
case FT_STRING_NOT_LOCALIZED:
|
||||
*(char const**)(&dataTable[offset]) = nullStr;
|
||||
*reinterpret_cast<char const**>(&dataTable[offset]) = EmptyDb2String;
|
||||
offset += sizeof(char*);
|
||||
break;
|
||||
default:
|
||||
@@ -1162,15 +1176,15 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& indexTableSize, char**& i
|
||||
switch (_loadInfo->Fields[fieldIndex].Type)
|
||||
{
|
||||
case FT_INT:
|
||||
*((uint32*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset]) = 0;
|
||||
offset += 4;
|
||||
break;
|
||||
case FT_BYTE:
|
||||
*((uint8*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint8*>(&dataTable[offset]) = 0;
|
||||
offset += 1;
|
||||
break;
|
||||
case FT_SHORT:
|
||||
*((uint16*)(&dataTable[offset])) = 0;
|
||||
*reinterpret_cast<uint16*>(&dataTable[offset]) = 0;
|
||||
offset += 2;
|
||||
break;
|
||||
default:
|
||||
@@ -1281,7 +1295,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char** indexTable, uint32 inde
|
||||
break;
|
||||
case FT_STRING:
|
||||
{
|
||||
LocalizedString* db2str = (LocalizedString*)(&recordData[offset]);
|
||||
LocalizedString* db2str = reinterpret_cast<LocalizedString*>(&recordData[offset]);
|
||||
db2str->Str[locale] = stringPtr;
|
||||
strcpy(stringPtr, RecordGetString(rawRecord, x, z));
|
||||
stringPtr += strlen(stringPtr) + 1;
|
||||
@@ -1290,7 +1304,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char** indexTable, uint32 inde
|
||||
}
|
||||
case FT_STRING_NOT_LOCALIZED:
|
||||
{
|
||||
char const** db2str = (char const**)(&recordData[offset]);
|
||||
char const** db2str = reinterpret_cast<char const**>(&recordData[offset]);
|
||||
*db2str = stringPtr;
|
||||
strcpy(stringPtr, RecordGetString(rawRecord, x, z));
|
||||
stringPtr += strlen(stringPtr) + 1;
|
||||
@@ -1327,7 +1341,7 @@ void DB2FileLoaderSparseImpl::AutoProduceRecordCopies(uint32 records, char** ind
|
||||
{
|
||||
indexTable[copy.NewRowId] = &dataTable[offset];
|
||||
memcpy(indexTable[copy.NewRowId], indexTable[copy.SourceRowId], recordsize);
|
||||
*((uint32*)(&dataTable[offset + idFieldOffset])) = copy.NewRowId;
|
||||
*reinterpret_cast<uint32*>(&dataTable[offset + idFieldOffset]) = copy.NewRowId;
|
||||
offset += recordsize;
|
||||
}
|
||||
}
|
||||
@@ -1538,6 +1552,17 @@ std::size_t* DB2FileLoaderSparseImpl::RecordCreateDetachedFieldOffsets(std::size
|
||||
return newOffsets;
|
||||
}
|
||||
|
||||
std::size_t* DB2FileLoaderSparseImpl::RecordCopyDetachedFieldOffsets(std::size_t* oldOffsets) const
|
||||
{
|
||||
if (oldOffsets == _fieldAndArrayOffsets.get())
|
||||
return oldOffsets;
|
||||
|
||||
std::size_t size = _loadInfo->Meta->FieldCount + _loadInfo->FieldCount - (!_loadInfo->Meta->HasIndexFieldInData() ? 1 : 0);
|
||||
std::size_t* newOffsets = new std::size_t[size];
|
||||
memcpy(newOffsets, _fieldAndArrayOffsets.get(), size * sizeof(std::size_t));
|
||||
return newOffsets;
|
||||
}
|
||||
|
||||
void DB2FileLoaderSparseImpl::RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const
|
||||
{
|
||||
if (fieldOffsets == _fieldAndArrayOffsets.get())
|
||||
@@ -1617,12 +1642,22 @@ DB2Record::DB2Record(DB2FileLoaderImpl const& db2, uint32 recordIndex, std::size
|
||||
{
|
||||
}
|
||||
|
||||
DB2Record::DB2Record(DB2Record const& other)
|
||||
: _db2(other._db2), _recordIndex(other._recordIndex), _recordData(other._recordData), _fieldOffsets(_db2.RecordCopyDetachedFieldOffsets(other._fieldOffsets))
|
||||
{
|
||||
}
|
||||
|
||||
DB2Record::DB2Record(DB2Record&& other) noexcept
|
||||
: _db2(other._db2), _recordIndex(other._recordIndex), _recordData(other._recordData), _fieldOffsets(std::exchange(other._fieldOffsets, nullptr))
|
||||
{
|
||||
}
|
||||
|
||||
DB2Record::~DB2Record()
|
||||
{
|
||||
_db2.RecordDestroyFieldOffsets(_fieldOffsets);
|
||||
}
|
||||
|
||||
DB2Record::operator bool()
|
||||
DB2Record::operator bool() const
|
||||
{
|
||||
return _recordData != nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user