AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
DBCDatabaseLoader Struct Reference

#include "DBCDatabaseLoader.h"

Public Member Functions

 DBCDatabaseLoader (char const *dbTable, char const *dbcFormatString, std::vector< char * > &stringPool)
 
char * Load (uint32 &records, char **&indexTable)
 

Private Member Functions

char * CloneStringToPool (std::string const &str)
 
 DBCDatabaseLoader (DBCDatabaseLoader const &right)=delete
 
DBCDatabaseLoaderoperator= (DBCDatabaseLoader const &right)=delete
 

Private Attributes

char const * _sqlTableName
 
char const * _dbcFormat
 
int32 _sqlIndexPos
 
uint32 _recordSize
 
std::vector< char * > & _stringPool
 

Detailed Description

Constructor & Destructor Documentation

◆ DBCDatabaseLoader() [1/2]

DBCDatabaseLoader::DBCDatabaseLoader ( char const *  dbTable,
char const *  dbcFormatString,
std::vector< char * > &  stringPool 
)
25 : _sqlTableName(tableName),
26 _dbcFormat(dbcFormatString),
27 _sqlIndexPos(0),
28 _recordSize(0),
29 _stringPool(stringPool)
30{
31 // Get sql index position
32 int32 indexPos = -1;
34 if (indexPos >= 0)
35 _sqlIndexPos = indexPos;
36
38}
std::int32_t int32
Definition Define.h:103
#define ASSERT
Definition Errors.h:68
static uint32 GetFormatRecordSize(char const *format, int32 *index_pos=nullptr)
Definition DBCFileLoader.cpp:128
std::vector< char * > & _stringPool
Definition DBCDatabaseLoader.h:35
uint32 _recordSize
Definition DBCDatabaseLoader.h:34
char const * _dbcFormat
Definition DBCDatabaseLoader.h:32
char const * _sqlTableName
Definition DBCDatabaseLoader.h:31
int32 _sqlIndexPos
Definition DBCDatabaseLoader.h:33

References _dbcFormat, _recordSize, _sqlIndexPos, ASSERT, and DBCFileLoader::GetFormatRecordSize().

◆ DBCDatabaseLoader() [2/2]

DBCDatabaseLoader::DBCDatabaseLoader ( DBCDatabaseLoader const &  right)
privatedelete

Member Function Documentation

◆ CloneStringToPool()

char * DBCDatabaseLoader::CloneStringToPool ( std::string const &  str)
private
139{
140 char* buf = new char[str.size() + 1];
141 memcpy(buf, str.c_str(), str.size() + 1);
142 _stringPool.push_back(buf);
143 return buf;
144}

References _stringPool.

Referenced by Load().

◆ Load()

char * DBCDatabaseLoader::Load ( uint32 records,
char **&  indexTable 
)
41{
42 std::string query = Acore::StringFormat("SELECT * FROM `{}` ORDER BY `ID` DESC", _sqlTableName);
43
44 // no error if empty set
45 QueryResult result = WorldDatabase.Query(query);
46 if (!result)
47 return nullptr;
48
49 // Check if sql index pos is valid
50 if (int32(result->GetFieldCount() - 1) < _sqlIndexPos)
51 {
52 ASSERT(false, "Invalid index pos for dbc: '{}'", _sqlTableName);
53 return nullptr;
54 }
55
56 // Resize index table
57 // database query *MUST* contain ORDER BY `index_field` DESC clause
58 uint32 indexTableSize = std::max(records, (*result)[_sqlIndexPos].Get<uint32>() + 1);
59 if (indexTableSize > records)
60 {
61 char** tmpIdxTable = new char* [indexTableSize];
62 memset(tmpIdxTable, 0, indexTableSize * sizeof(char*));
63 memcpy(tmpIdxTable, indexTable, records * sizeof(char*));
64 delete[] indexTable;
65 indexTable = tmpIdxTable;
66 }
67
68 std::unique_ptr<char[]> dataTable = std::make_unique<char[]>(result->GetRowCount() * _recordSize);
69 std::unique_ptr<uint32[]> newIndexes = std::make_unique<uint32[]>(result->GetRowCount());
70 uint32 newRecords = 0;
71
72 // Insert sql data into the data array
73 do
74 {
75 Field* fields = result->Fetch();
76 uint32 indexValue = fields[_sqlIndexPos].Get<uint32>();
77 char* dataValue = indexTable[indexValue];
78
79 // If exist in DBC file override from DB
80 newIndexes[newRecords] = indexValue;
81 dataValue = &dataTable[newRecords++ * _recordSize];
82
83 uint32 dataOffset = 0;
84 uint32 sqlColumnNumber = 0;
85 char const* dbcFormat = _dbcFormat;
86
87 for (; (*dbcFormat); ++dbcFormat)
88 {
89 switch (*dbcFormat)
90 {
91 case FT_FLOAT:
92 *reinterpret_cast<float*>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<float>();
93 dataOffset += sizeof(float);
94 break;
95 case FT_IND:
96 case FT_INT:
97 *reinterpret_cast<uint32*>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<uint32>();
98 dataOffset += sizeof(uint32);
99 break;
100 case FT_BYTE:
101 *reinterpret_cast<uint8*>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<uint8>();
102 dataOffset += sizeof(uint8);
103 break;
104 case FT_STRING:
105 *reinterpret_cast<char**>(&dataValue[dataOffset]) = CloneStringToPool(fields[sqlColumnNumber].Get<std::string>());
106 dataOffset += sizeof(char*);
107 break;
108 case FT_SORT:
109 case FT_NA:
110 case FT_NA_BYTE:
111 break;
112 default:
113 ASSERT(false, "Unsupported data type '{}' in table '{}'", *dbcFormat, _sqlTableName);
114 return nullptr;
115 }
116
117 ++sqlColumnNumber;
118 }
119
120 ASSERT(sqlColumnNumber == result->GetFieldCount(), "SQL format string does not match database for table: '{}'", _sqlTableName);
121 ASSERT(dataOffset == _recordSize);
122 } while (result->NextRow());
123
124 ASSERT(newRecords == result->GetRowCount());
125
126 // insert new records to index table
127 for (uint32 i = 0; i < newRecords; ++i)
128 {
129 // cppcheck-suppress autoVariables
130 indexTable[newIndexes[i]] = &dataTable[i * _recordSize];
131 }
132
133 records = indexTableSize;
134
135 return dataTable.release();
136}
@ FT_IND
Definition DBCFileLoader.h:34
@ FT_NA
Definition DBCFileLoader.h:27
@ FT_FLOAT
Definition DBCFileLoader.h:30
@ FT_STRING
Definition DBCFileLoader.h:29
@ FT_SORT
Definition DBCFileLoader.h:33
@ FT_NA_BYTE
Definition DBCFileLoader.h:28
@ FT_INT
Definition DBCFileLoader.h:31
@ FT_BYTE
Definition DBCFileLoader.h:32
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44
char * CloneStringToPool(std::string const &str)
Definition DBCDatabaseLoader.cpp:138

References _dbcFormat, _recordSize, _sqlIndexPos, _sqlTableName, ASSERT, CloneStringToPool(), FT_BYTE, FT_FLOAT, FT_IND, FT_INT, FT_NA, FT_NA_BYTE, FT_SORT, FT_STRING, Field::Get(), Acore::StringFormat(), and WorldDatabase.

◆ operator=()

DBCDatabaseLoader & DBCDatabaseLoader::operator= ( DBCDatabaseLoader const &  right)
privatedelete

Member Data Documentation

◆ _dbcFormat

char const* DBCDatabaseLoader::_dbcFormat
private

Referenced by DBCDatabaseLoader(), and Load().

◆ _recordSize

uint32 DBCDatabaseLoader::_recordSize
private

Referenced by DBCDatabaseLoader(), and Load().

◆ _sqlIndexPos

int32 DBCDatabaseLoader::_sqlIndexPos
private

Referenced by DBCDatabaseLoader(), and Load().

◆ _sqlTableName

char const* DBCDatabaseLoader::_sqlTableName
private

Referenced by Load().

◆ _stringPool

std::vector<char*>& DBCDatabaseLoader::_stringPool
private

Referenced by CloneStringToPool().


The documentation for this struct was generated from the following files: