diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/DataStores/DB2FileLoader.cpp | 74 | ||||
| -rw-r--r-- | src/common/DataStores/DB2FileLoader.h | 7 |
2 files changed, 80 insertions, 1 deletions
diff --git a/src/common/DataStores/DB2FileLoader.cpp b/src/common/DataStores/DB2FileLoader.cpp index 7578eace9b6..204f4bd316b 100644 --- a/src/common/DataStores/DB2FileLoader.cpp +++ b/src/common/DataStores/DB2FileLoader.cpp @@ -44,6 +44,23 @@ uint32 DB2FileLoadInfo::GetStringFieldCount(bool localizedOnly) const return stringFields; } +std::pair<int32, int32> DB2FileLoadInfo::GetFieldIndexByName(char const* fieldName) const +{ + std::size_t ourIndex = Meta->HasIndexFieldInData() ? 0 : 1; + for (uint32 i = 0; i < Meta->FieldCount; ++i) + { + for (uint8 arr = 0; arr < Meta->ArraySizes[i]; ++arr) + { + if (!strcmp(Fields[ourIndex].Name, fieldName)) + return std::make_pair(int32(i), int32(arr)); + + ++ourIndex; + } + } + + return std::make_pair(-1, -1); +} + DB2FileSource::~DB2FileSource() { } @@ -61,6 +78,7 @@ public: virtual uint32 GetRecordCount() const = 0; virtual uint32 GetRecordCopyCount() const = 0; virtual uint32 GetMaxId() const = 0; + virtual DB2FileLoadInfo const* GetLoadInfo() const = 0; private: friend class DB2Record; @@ -91,6 +109,7 @@ public: uint32 GetRecordCount() const override; uint32 GetRecordCopyCount() const override; uint32 GetMaxId() const override; + DB2FileLoadInfo const* GetLoadInfo() const override; private: void FillCommonValues(char** indexTable); @@ -139,12 +158,13 @@ public: bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header) override; char* AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool) override; char* AutoProduceStrings(char* dataTable, uint32 locale) override; - void AutoProduceRecordCopies(uint32 /*records*/, char** /*indexTable*/, char* /*dataTable*/) override { } + void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) override { } DB2Record GetRecord(uint32 recordNumber) const override; DB2RecordCopy GetRecordCopy(uint32 copyNumber) const override; uint32 GetRecordCount() const override; uint32 GetRecordCopyCount() const override; uint32 GetMaxId() const override; + DB2FileLoadInfo const* GetLoadInfo() const override; private: unsigned char const* GetRawRecordData(uint32 recordNumber) const override; @@ -744,6 +764,11 @@ uint32 DB2FileLoaderRegularImpl::GetMaxId() const return maxId; } +DB2FileLoadInfo const* DB2FileLoaderRegularImpl::GetLoadInfo() const +{ + return _loadInfo; +} + DB2FileLoaderSparseImpl::DB2FileLoaderSparseImpl() { fileName = nullptr; @@ -1165,6 +1190,11 @@ uint32 DB2FileLoaderSparseImpl::GetMaxId() const return _header->MaxId; } +DB2FileLoadInfo const* DB2FileLoaderSparseImpl::GetLoadInfo() const +{ + return _loadInfo; +} + DB2Record::DB2Record(DB2FileLoaderImpl const& db2, uint32 recordIndex, std::size_t* fieldOffsets) : _db2(db2), _recordIndex(recordIndex), _recordData(db2.GetRawRecordData(recordIndex)), _fieldOffsets(fieldOffsets) { @@ -1190,31 +1220,73 @@ uint8 DB2Record::GetUInt8(uint32 field, uint32 arrayIndex) const return _db2.RecordGetUInt8(_recordData, field, arrayIndex); } +uint8 DB2Record::GetUInt8(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetUInt8(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + uint16 DB2Record::GetUInt16(uint32 field, uint32 arrayIndex) const { return _db2.RecordGetUInt16(_recordData, field, arrayIndex); } +uint16 DB2Record::GetUInt16(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetUInt16(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + uint32 DB2Record::GetUInt32(uint32 field, uint32 arrayIndex) const { return _db2.RecordGetUInt32(_recordData, field, arrayIndex); } +uint32 DB2Record::GetUInt32(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetUInt32(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + int32 DB2Record::GetInt32(uint32 field, uint32 arrayIndex) const { return _db2.RecordGetInt32(_recordData, field, arrayIndex); } +int32 DB2Record::GetInt32(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetInt32(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + float DB2Record::GetFloat(uint32 field, uint32 arrayIndex) const { return _db2.RecordGetFloat(_recordData, field, arrayIndex); } +float DB2Record::GetFloat(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetFloat(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + char const* DB2Record::GetString(uint32 field, uint32 arrayIndex) const { return _db2.RecordGetString(_recordData, field, arrayIndex); } +char const* DB2Record::GetString(char const* fieldName) const +{ + std::pair<int32, int32> fieldIndex = _db2.GetLoadInfo()->GetFieldIndexByName(fieldName); + ASSERT(fieldIndex.first != -1, "Field with name %s does not exist!", fieldName); + return _db2.RecordGetString(_recordData, uint32(fieldIndex.first), uint32(fieldIndex.second)); +} + void DB2Record::MakePersistent() { _fieldOffsets = _db2.RecordCreateDetachedFieldOffsets(_fieldOffsets); diff --git a/src/common/DataStores/DB2FileLoader.h b/src/common/DataStores/DB2FileLoader.h index 3812fe3cd67..cf34794a7a1 100644 --- a/src/common/DataStores/DB2FileLoader.h +++ b/src/common/DataStores/DB2FileLoader.h @@ -53,6 +53,7 @@ struct TC_COMMON_API DB2FileLoadInfo DB2FileLoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta); uint32 GetStringFieldCount(bool localizedOnly) const; + std::pair<int32/*fieldIndex*/, int32/*arrayIndex*/> GetFieldIndexByName(char const* fieldName) const; DB2FieldMeta const* Fields; std::size_t FieldCount; @@ -88,11 +89,17 @@ public: uint32 GetId() const; uint8 GetUInt8(uint32 field, uint32 arrayIndex) const; + uint8 GetUInt8(char const* fieldName) const; uint16 GetUInt16(uint32 field, uint32 arrayIndex) const; + uint16 GetUInt16(char const* fieldName) const; uint32 GetUInt32(uint32 field, uint32 arrayIndex) const; + uint32 GetUInt32(char const* fieldName) const; int32 GetInt32(uint32 field, uint32 arrayIndex) const; + int32 GetInt32(char const* fieldName) const; float GetFloat(uint32 field, uint32 arrayIndex) const; + float GetFloat(char const* fieldName) const; char const* GetString(uint32 field, uint32 arrayIndex) const; + char const* GetString(char const* fieldName) const; // Creates its own heap allocated copy of _fieldOffsets // by default _fieldOffets point to a shared array inside Loader to avoid heap allocations |
