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* dataValue = indexTable[indexValue];
78
79
80 newIndexes[newRecords] = indexValue;
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 *
reinterpret_cast<char**
>(&dataValue[dataOffset]) =
CloneStringToPool(fields[sqlColumnNumber].Get<std::string>());
106 dataOffset += sizeof(char*);
107 break;
111 break;
112 default:
114 return nullptr;
115 }
116
117 ++sqlColumnNumber;
118 }
119
120 ASSERT(sqlColumnNumber == result->GetFieldCount(),
"SQL format string does not match database for table: '{}'",
_sqlTableName);
122 } while (result->NextRow());
123
124 ASSERT(newRecords == result->GetRowCount());
125
126
127 for (
uint32 i = 0; i < newRecords; ++i)
128 {
129
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