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))
78 if (
QueryResult result =
LoginDatabase.Query(
"SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build FROM build_info ORDER BY build ASC"))
82 Field* fields = result->Fetch();
83 Info& build = Builds.emplace_back();
87 std::string hotfixVersion = fields[3].
GetString();
89 std::ranges::copy(hotfixVersion, build.
HotfixVersion.begin());
95 }
while (result->NextRow());
99 if (
QueryResult result =
LoginDatabase.Query(
"SELECT `build`, `platform`, `executableHash` FROM `build_executable_hash`"))
103 Field* fields = result->Fetch();
106 auto buildInfo = std::ranges::find(Builds, build, &
Info::Build);
107 if (buildInfo == Builds.end())
109 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Unknown `build` {} in `build_executable_hash` - missing from `build_info`, skipped.", build);
116 TC_LOG_ERROR(
"sql.sql",
"ClientBuild::LoadBuildInfo: Invalid platform {} for `build` {} in `build_executable_hash`, skipped.", platform, build);
120 ExecutableHash& buildKey = buildInfo->ExecutableHashes.emplace_back();
124 }
while (result->NextRow());
130 auto buildInfo = std::ranges::find(Builds, build, &
Info::Build);
131 return buildInfo != Builds.end() ? &*buildInfo :
nullptr;
136 auto buildInfo = std::ranges::lower_bound(Builds, build, {}, &
Info::Build);
137 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__,...)
Class used to access individual fields of database query result.
std::string GetString() const
std::vector< uint8 > GetBinary() const
std::string_view GetStringView() const
constexpr uint32 ToFourCC(std::string_view text)
Info const * GetBuildInfo(uint32 build)
std::array< char, 5 > ToCharArray(uint32 value)
uint32 GetMinorMajorBugfixVersionForBuild(uint32 build)
std::array< uint8, Size > Hash
static constexpr std::size_t Size
std::array< char, 4 > HotfixVersion