27std::vector<ClientBuild::Info> Builds;
34 auto normalize = [](
uint8 c) ->
char
36 if (!c || std::isprint(c))
41 std::array<char, 5> chars = { char((value >> 24) & 0xFF), char((value >> 16) & 0xFF), char((value >> 8) & 0xFF), char(value & 0xFF),
'\0' };
43 auto firstNonZero = std::ranges::find_if(chars, [](
char c) {
return c !=
'\0'; });
44 if (firstNonZero != chars.end())
47 std::rotate(chars.begin(), firstNonZero, chars.end());
50 std::ranges::transform(chars, chars.begin(), normalize);
58 if (platform.length() >
sizeof(
uint32))
79 if (platformType.length() >
sizeof(
uint32))
96 if (arch.length() >
sizeof(
uint32))
116 if (type.length() >
sizeof(
uint32))
140 if (
QueryResult result =
LoginDatabase.Query(
"SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build FROM build_info ORDER BY build ASC"))
144 Field* fields = result->Fetch();
145 Info& build = Builds.emplace_back();
151 std::ranges::copy(hotfixVersion, build.
HotfixVersion.begin());
157 }
while (result->NextRow());
161 if (
QueryResult result =
LoginDatabase.Query(
"SELECT `build`, `platform`, `arch`, `type`, `key` FROM `build_auth_key`"))
165 Field* fields = result->Fetch();
168 auto buildInfo = std::ranges::find(Builds, build, &
Info::Build);
169 if (buildInfo == Builds.end())
171 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Unknown `build` {} in `build_auth_key` - missing from `build_info`, skipped.", build);
178 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Invalid platform {} for `build` {} in `build_auth_key`, skipped.", platformType, build);
185 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Invalid `arch` {} for `build` {} in `build_auth_key`, skipped.", arch, build);
192 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Invalid `type` {} for `build` {} in `build_auth_key`, skipped.", type, build);
196 AuthKey& buildKey = buildInfo->AuthKeys.emplace_back();
200 }
while (result->NextRow());
206 auto buildInfo = std::ranges::find(Builds, build, &
Info::Build);
207 return buildInfo != Builds.end() ? &*buildInfo :
nullptr;
212 auto buildInfo = std::ranges::lower_bound(Builds, build, {}, &
Info::Build);
213 return buildInfo != Builds.end() ? (buildInfo->MajorVersion * 10000 + buildInfo->MinorVersion * 100 + buildInfo->BugfixVersion) : 0;
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
#define TC_LOG_ERROR(filterType__, message__,...)
Class used to access individual fields of database query result.
std::vector< uint8 > GetBinary() const noexcept
uint32 GetUInt32() const noexcept
std::string_view GetStringView() const noexcept
int32 GetInt32() const noexcept
TC_SHARED_API bool IsValid(std::string_view arch)
constexpr uint32 BetaRelease
constexpr uint32 RetailChina
TC_SHARED_API bool IsValid(std::string_view type)
constexpr uint32 PtrRelease
uint32 GetMinorMajorBugfixVersionForBuild(uint32 build)
constexpr uint32 ToFourCC(std::string_view text)
Info const * GetBuildInfo(uint32 build)
std::array< char, 5 > ToCharArray(uint32 value)
std::array< uint8, Size > Key
static constexpr std::size_t Size
std::array< char, 4 > HotfixVersion