1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/*
* Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DB2_FILE_LOADER_H
#define DB2_FILE_LOADER_H
#include "Define.h"
#include <string>
#include <vector>
class DB2FileLoaderImpl;
struct DB2FieldMeta;
struct DB2Meta;
#pragma pack(push, 1)
struct DB2Header
{
uint32 Signature;
uint32 RecordCount;
uint32 FieldCount;
uint32 RecordSize;
uint32 StringTableSize;
uint32 TableHash;
uint32 LayoutHash;
uint32 MinId;
uint32 MaxId;
uint32 Locale;
uint32 CopyTableSize;
uint16 Flags;
int16 IndexField;
uint32 TotalFieldCount;
uint32 CommonDataSize;
};
#pragma pack(pop)
struct TC_COMMON_API DB2FileLoadInfo
{
DB2FileLoadInfo();
DB2FileLoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta);
uint32 GetStringFieldCount(bool localizedOnly) const;
DB2FieldMeta const* Fields;
std::size_t FieldCount;
DB2Meta const* Meta;
std::string TypesString;
};
struct TC_COMMON_API DB2FileSource
{
virtual ~DB2FileSource();
///
/**
* Returns true when the source is open for reading
*/
virtual bool IsOpen() const = 0;
// Reads numBytes bytes from source and places them into buffer
// Retu
virtual bool Read(void* buffer, std::size_t numBytes) = 0;
virtual std::size_t GetPosition() const = 0;
virtual char const* GetFileName() const = 0;
};
class TC_COMMON_API DB2Record
{
public:
DB2Record(DB2FileLoaderImpl const& db2, uint32 recordIndex, std::size_t* fieldOffsets);
~DB2Record();
operator bool();
uint32 GetId() const;
uint8 GetUInt8(uint32 field, uint32 arrayIndex) const;
uint16 GetUInt16(uint32 field, uint32 arrayIndex) const;
uint32 GetUInt32(uint32 field, uint32 arrayIndex) const;
int32 GetInt32(uint32 field, uint32 arrayIndex) const;
float GetFloat(uint32 field, uint32 arrayIndex) const;
char const* GetString(uint32 field, uint32 arrayIndex) const;
// Creates its own heap allocated copy of _fieldOffsets
// by default _fieldOffets point to a shared array inside Loader to avoid heap allocations
// meaning that only one instance of DB2Record has valid offsets if the file is sparse
void MakePersistent();
private:
DB2FileLoaderImpl const& _db2;
uint32 _recordIndex;
unsigned char const* _recordData;
std::size_t* _fieldOffsets;
};
#pragma pack(push, 1)
struct DB2RecordCopy
{
uint32 NewRowId = 0;
uint32 SourceRowId = 0;
};
#pragma pack(pop)
class TC_COMMON_API DB2FileLoader
{
public:
DB2FileLoader();
~DB2FileLoader();
bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo);
char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool);
char* AutoProduceStrings(char* dataTable, uint32 locale);
void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable);
uint32 GetCols() const { return _header.TotalFieldCount; }
uint32 GetRecordCount() const;
uint32 GetRecordCopyCount() const;
uint32 GetTableHash() const { return _header.TableHash; }
uint32 GetLayoutHash() const { return _header.LayoutHash; }
uint32 GetMaxId() const;
DB2Record GetRecord(uint32 recordNumber) const;
DB2RecordCopy GetRecordCopy(uint32 copyNumber) const;
private:
DB2FileLoaderImpl* _impl;
DB2Header _header;
};
#endif
|