GameDatabase: Check timestamp of discsets.yaml

pull/3539/head^2
Stenzek 2 months ago
parent e35b49d6e5
commit 2b519b1a94
No known key found for this signature in database

@ -40,7 +40,7 @@ namespace GameDatabase {
enum : u32 enum : u32
{ {
GAME_DATABASE_CACHE_SIGNATURE = 0x45434C48, GAME_DATABASE_CACHE_SIGNATURE = 0x45434C48,
GAME_DATABASE_CACHE_VERSION = 30, GAME_DATABASE_CACHE_VERSION = 31,
}; };
static const Entry* GetEntryForId(std::string_view code); static const Entry* GetEntryForId(std::string_view code);
@ -1084,19 +1084,21 @@ bool GameDatabase::LoadFromCache()
} }
BinarySpanReader reader(db_data->cspan()); BinarySpanReader reader(db_data->cspan());
const u64 gamedb_ts = Host::GetResourceFileTimestamp("gamedb.yaml", false).value_or(0); const u64 gamedb_ts = static_cast<u64>(Host::GetResourceFileTimestamp(GAMEDB_YAML_FILENAME, false).value_or(0));
const u64 discsets_ts = static_cast<u64>(Host::GetResourceFileTimestamp(DISCSETS_YAML_FILENAME, false).value_or(0));
u32 signature, version, num_disc_set_entries, num_entries, num_codes; u32 signature, version, num_disc_set_entries, num_entries, num_codes;
u64 file_gamedb_ts; u64 file_gamedb_ts, file_discsets_ts;
if (!reader.ReadU32(&signature) || !reader.ReadU32(&version) || !reader.ReadU64(&file_gamedb_ts) || if (!reader.ReadU32(&signature) || !reader.ReadU32(&version) || !reader.ReadU64(&file_gamedb_ts) ||
!reader.ReadU32(&num_disc_set_entries) || !reader.ReadU32(&num_entries) || !reader.ReadU32(&num_codes) || !reader.ReadU64(&file_discsets_ts) || !reader.ReadU32(&num_disc_set_entries) || !reader.ReadU32(&num_entries) ||
signature != GAME_DATABASE_CACHE_SIGNATURE || version != GAME_DATABASE_CACHE_VERSION) !reader.ReadU32(&num_codes) || signature != GAME_DATABASE_CACHE_SIGNATURE ||
version != GAME_DATABASE_CACHE_VERSION)
{ {
DEV_LOG("Cache header is corrupted or version mismatch."); DEV_LOG("Cache header is corrupted or version mismatch.");
return false; return false;
} }
if (gamedb_ts != file_gamedb_ts) if (gamedb_ts != file_gamedb_ts || discsets_ts != file_discsets_ts)
{ {
DEV_LOG("Cache is out of date, recreating."); DEV_LOG("Cache is out of date, recreating.");
return false; return false;
@ -1204,7 +1206,8 @@ bool GameDatabase::LoadFromCache()
bool GameDatabase::SaveToCache() bool GameDatabase::SaveToCache()
{ {
const u64 gamedb_ts = Host::GetResourceFileTimestamp("gamedb.yaml", false).value_or(0); const u64 gamedb_ts = static_cast<u64>(Host::GetResourceFileTimestamp(GAMEDB_YAML_FILENAME, false).value_or(0));
const u64 discsets_ts = static_cast<u64>(Host::GetResourceFileTimestamp(DISCSETS_YAML_FILENAME, false).value_or(0));
Error error; Error error;
FileSystem::AtomicRenamedFile file = FileSystem::CreateAtomicRenamedFile(GetCacheFile(), &error); FileSystem::AtomicRenamedFile file = FileSystem::CreateAtomicRenamedFile(GetCacheFile(), &error);
@ -1217,7 +1220,8 @@ bool GameDatabase::SaveToCache()
BinaryFileWriter writer(file.get()); BinaryFileWriter writer(file.get());
writer.WriteU32(GAME_DATABASE_CACHE_SIGNATURE); writer.WriteU32(GAME_DATABASE_CACHE_SIGNATURE);
writer.WriteU32(GAME_DATABASE_CACHE_VERSION); writer.WriteU32(GAME_DATABASE_CACHE_VERSION);
writer.WriteU64(static_cast<u64>(gamedb_ts)); writer.WriteU64(gamedb_ts);
writer.WriteU64(discsets_ts);
writer.WriteU32(static_cast<u32>(s_state.disc_sets.size())); writer.WriteU32(static_cast<u32>(s_state.disc_sets.size()));
writer.WriteU32(static_cast<u32>(s_state.entries.size())); writer.WriteU32(static_cast<u32>(s_state.entries.size()));

Loading…
Cancel
Save