WoW Model Viewer
Your premiere tool for viewing, equipping and animating World of Warcraft models.
Loading...
Searching...
No Matches
DB2Reader.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <map>
5#include <string>
6#include <vector>
7#include <unordered_map>
8
9#include "CASCFile.h"
10
15class DB2Reader : public CASCFile
16{
17public:
18 explicit DB2Reader(const std::string& file);
19 ~DB2Reader() override;
20
21 bool open();
22 bool close();
23
24private:
25 friend class DB2Table;
26
27 // ── compression types (same enum values as the on-disk format) ────────
37
38 // ── on-disk structures ───────────────────────────────────────────────
39#pragma pack(push, 1)
40 struct WDCHeader
41 {
42 char magic[4];
43 uint32_t record_count;
44 uint32_t field_count;
45 uint32_t record_size;
47 uint32_t table_hash;
48 uint32_t layout_hash;
49 uint32_t min_id;
50 uint32_t max_id;
51 uint32_t locale;
52 uint16_t flags;
53 uint16_t id_index;
60 uint32_t section_count;
61 };
62
74
87
89 {
90 int16_t size;
91 uint16_t position;
92 };
93
95 {
99 uint32_t storage_type;
100 uint32_t val1;
101 uint32_t val2;
102 uint32_t val3;
103 };
104
106 {
107 uint32_t offset;
108 uint16_t size;
109 };
110
112 {
113 uint32_t newRowId;
114 uint32_t copiedRowId;
115 };
116#pragma pack(pop)
117
118 // ── per-section runtime data ─────────────────────────────────────────
120 {
121 // normalised header values (valid for both WDC2 and WDC3+)
122 uint64_t tactKeyHash = 0;
123 uint32_t fileOffset = 0;
124 uint32_t recordCount = 0;
125 uint32_t stringTableSize = 0;
126 uint32_t offsetRecordsEnd = 0; // WDC3+; for WDC2 = offsetMapOffset
127 uint32_t idListSize = 0;
129 uint32_t offsetMapIdCount = 0; // WDC3+ only
130 uint32_t copyTableCount = 0; // WDC3+ (for WDC2 = copyTableSize / 8)
131
132 bool isNormal = true; // !(flags & 0x01)
133 bool isEncrypted = false;
134
135 // pointers into m_fileData
136 unsigned char* recordDataPtr = nullptr;
137 uint32_t recordDataSize = 0;
138 uint32_t stringTableOffset = 0; // absolute position of this section's string block
139 uint32_t previousStringTableSize = 0; // cumulative string table size of earlier sections
140
141 std::vector<uint32_t> idList;
142 std::vector<OffsetMapEntry> offsetMap;
143 std::map<uint32_t, uint32_t> relationshipMap; // recordIndex -> foreignID
144 };
145
146 // ── reading helpers ──────────────────────────────────────────────────
147 uint64_t readBitpackedValue64(const FieldStorageInfo& info, const unsigned char* recordOffset) const;
148
149 bool readFieldValue(unsigned int sectionIndex, unsigned int recordIndexInSection,
150 unsigned int fieldIndex, unsigned int arrayIndex, unsigned int arraySize,
151 uint32_t recordID, unsigned int& result) const;
152
153 const unsigned char* getRecordOffset(unsigned int sectionIndex, unsigned int recordIndexInSection) const;
154
155 // ── member data ──────────────────────────────────────────────────────
157
159
160 std::vector<FieldStorageInfo> m_fieldStorageInfo;
161 std::map<uint32_t, uint32_t> m_palletBlockOffsets;
162 unsigned char* m_palletData = nullptr;
163 std::map<uint32_t, std::map<uint32_t, uint32_t>> m_commonData;
164
165 std::vector<SectionData> m_sections;
166
167 // flat index that maps a linear recordIndex (0..totalRecords-1) used by the
168 // DBFile iterator to (sectionIndex, recordIndexInSection, recordID).
170 {
171 uint32_t sectionIndex;
172 uint32_t localIndex;
173 uint32_t recordID;
174 };
175 std::vector<RecordLocation> m_recordLocations;
176
177 // recordID -> index in m_recordLocations for O(1) getRow() by ID
178 std::unordered_map<uint32_t, size_t> m_idToRecordIndex;
179
180 // relationship reverse lookup: foreignID -> list of recordIDs
181 std::unordered_map<uint32_t, std::vector<uint32_t>> m_relationshipLookup;
182
183 // copy table: destID -> srcID
184 std::map<uint32_t, uint32_t> m_copyTable;
185
186 // keep the raw file data alive for the lifetime of the reader so that
187 // record-offset pointers remain valid.
188 unsigned char* m_fileData = nullptr;
189 size_t m_fileDataSize = 0;
190
191 std::map<int, int> m_fieldSizes;
192};
GameFile implementation that reads from a CASC storage archive.
Definition CASCFile.h:20
Unified reader for WDC2, WDC3, WDC4 and WDC5 DB2 files.
Definition DB2Reader.h:16
WDCHeader m_header
Definition DB2Reader.h:158
std::map< uint32_t, std::map< uint32_t, uint32_t > > m_commonData
Definition DB2Reader.h:163
unsigned char * m_fileData
Definition DB2Reader.h:188
bool readFieldValue(unsigned int sectionIndex, unsigned int recordIndexInSection, unsigned int fieldIndex, unsigned int arrayIndex, unsigned int arraySize, uint32_t recordID, unsigned int &result) const
std::vector< SectionData > m_sections
Definition DB2Reader.h:165
uint64_t readBitpackedValue64(const FieldStorageInfo &info, const unsigned char *recordOffset) const
std::unordered_map< uint32_t, size_t > m_idToRecordIndex
Definition DB2Reader.h:178
unsigned char * m_palletData
Definition DB2Reader.h:162
const unsigned char * getRecordOffset(unsigned int sectionIndex, unsigned int recordIndexInSection) const
~DB2Reader() override
Definition DB2Reader.cpp:39
std::unordered_map< uint32_t, std::vector< uint32_t > > m_relationshipLookup
Definition DB2Reader.h:181
bool open()
Definition DB2Reader.cpp:55
bool close()
Definition DB2Reader.cpp:47
std::map< uint32_t, uint32_t > m_copyTable
Definition DB2Reader.h:184
std::map< uint32_t, uint32_t > m_palletBlockOffsets
Definition DB2Reader.h:161
size_t m_fileDataSize
Definition DB2Reader.h:189
std::vector< FieldStorageInfo > m_fieldStorageInfo
Definition DB2Reader.h:160
std::map< int, int > m_fieldSizes
Definition DB2Reader.h:191
int m_wdcVersion
Definition DB2Reader.h:156
std::vector< RecordLocation > m_recordLocations
Definition DB2Reader.h:175
@ COMP_BITPACKED_SIGNED
Definition DB2Reader.h:35
@ COMP_BITPACKED_INDEXED_ARRAY
Definition DB2Reader.h:34
@ COMP_BITPACKED
Definition DB2Reader.h:31
@ COMP_BITPACKED_INDEXED
Definition DB2Reader.h:33
@ COMP_COMMON_DATA
Definition DB2Reader.h:32
Provides typed, field-name-based access to records in a WDC DB2 file.
Definition DB2Table.h:50
std::vector< OffsetMapEntry > offsetMap
Definition DB2Reader.h:142
unsigned char * recordDataPtr
Definition DB2Reader.h:136
uint32_t relationshipDataSize
Definition DB2Reader.h:128
std::map< uint32_t, uint32_t > relationshipMap
Definition DB2Reader.h:143
std::vector< uint32_t > idList
Definition DB2Reader.h:141
uint32_t previousStringTableSize
Definition DB2Reader.h:139
uint32_t pallet_data_size
Definition DB2Reader.h:59
uint32_t field_storage_info_size
Definition DB2Reader.h:57
uint32_t lookup_column_count
Definition DB2Reader.h:56
uint32_t bitpacked_data_offset
Definition DB2Reader.h:55
uint32_t common_data_size
Definition DB2Reader.h:58
uint32_t section_count
Definition DB2Reader.h:60
uint32_t total_field_count
Definition DB2Reader.h:54
uint32_t record_count
Definition DB2Reader.h:43
uint32_t string_table_size
Definition DB2Reader.h:46