41{
43
44
46 if (!result)
47 return nullptr;
48
49
51 {
53 return nullptr;
54 }
55
56
57
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());
71
72
73 do
74 {
75 Field* fields = result->Fetch();
77 char* oldDataValue = indexTable[indexValue];
78
79
80 newIndexes[newRecords] = indexValue;
81 char* dataValue = &dataTable[newRecords++ *
_recordSize];
82
84 uint32 sqlColumnNumber = 0;
86
87 for (; (*dbcFormat); ++dbcFormat)
88 {
89 switch (*dbcFormat)
90 {
92 *reinterpret_cast<float*>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<float>();
93 dataOffset += sizeof(float);
94 break;
97 *
reinterpret_cast<uint32*
>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<uint32>();
98 dataOffset +=
sizeof(
uint32);
99 break;
101 *
reinterpret_cast<uint8*
>(&dataValue[dataOffset]) = fields[sqlColumnNumber].Get<uint8>();
102 dataOffset +=
sizeof(
uint8);
103 break;
105
106 if (fields[sqlColumnNumber].Get<std::string>().empty() && oldDataValue)
107 *reinterpret_cast<char**>(&dataValue[dataOffset]) = *reinterpret_cast<char**>(&oldDataValue[dataOffset]);
108 else
109 *
reinterpret_cast<char**
>(&dataValue[dataOffset]) =
CloneStringToPool(fields[sqlColumnNumber].Get<std::string>());
110
111 dataOffset += sizeof(char*);
112 break;
116 break;
117 default:
119 return nullptr;
120 }
121
122 ++sqlColumnNumber;
123 }
124
125 ASSERT(sqlColumnNumber == result->GetFieldCount(),
"SQL format string does not match database for table: '{}'",
_sqlTableName);
127 } while (result->NextRow());
128
129 ASSERT(newRecords == result->GetRowCount());
130
131
132 for (
uint32 i = 0; i < newRecords; ++i)
133 {
134
135 indexTable[newIndexes[i]] = &dataTable[i *
_recordSize];
136 }
137
138 records = indexTableSize;
139
140 return dataTable.release();
141}
@ 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:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:113
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:143