diff --git a/osu.Game/Database/RealmContextFactory.cs b/osu.Game/Database/RealmContextFactory.cs index 411cfc52ee..760b154397 100644 --- a/osu.Game/Database/RealmContextFactory.cs +++ b/osu.Game/Database/RealmContextFactory.cs @@ -96,6 +96,9 @@ public RealmContextFactory(Storage storage, string filename, IDatabaseContextFac Filename += realm_extension; cleanupPendingDeletions(); + + // run after the above operation to ensure realm is already in a good (fully migrated) state. + migrateDataFromEF(); } private void cleanupPendingDeletions() @@ -163,6 +166,54 @@ private RealmConfiguration getConfiguration() }; } + private void migrateDataFromEF() + { + if (efContextFactory == null) + return; + + using (var db = efContextFactory.GetForWrite()) + { + // migrate ruleset settings. can be removed 20220315. + var existingSettings = db.Context.DatabasedSetting; + + // previous entries in EF are removed post migration. + if (!existingSettings.Any()) + return; + + using (var realm = CreateContext()) + using (var transaction = realm.BeginWrite()) + { + // only migrate data if the realm database is empty. + if (!realm.All().Any()) + { + foreach (var dkb in existingSettings) + { + if (dkb.RulesetID == null) + continue; + + string? shortName = getRulesetShortNameFromLegacyID(dkb.RulesetID.Value); + + if (string.IsNullOrEmpty(shortName)) + continue; + + realm.Add(new RealmRulesetSetting + { + Key = dkb.Key, + Value = dkb.StringValue, + // important: this RulesetStore must be the EF one. + RulesetName = shortName, + Variant = dkb.Variant ?? 0, + }); + } + } + + db.Context.RemoveRange(existingSettings); + + transaction.Commit(); + } + } + } + private void onMigration(Migration migration, ulong lastSchemaVersion) { for (ulong i = lastSchemaVersion + 1; i <= schema_version; i++) diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 1890fd7d24..8c35e65dfc 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -262,8 +262,6 @@ List getBeatmapScores(BeatmapSetInfo set) dependencies.Cache(scorePerformanceManager); AddInternal(scorePerformanceManager); - migrateDataToRealm(); - dependencies.Cache(rulesetConfigCache = new RulesetConfigCache(realmFactory, RulesetStore)); var powerStatus = CreateBatteryInfo(); @@ -439,35 +437,6 @@ public void Migrate(string path) private void migrateDataToRealm() { - using (var db = contextFactory.GetForWrite()) - using (var realm = realmFactory.CreateContext()) - using (var transaction = realm.BeginWrite()) - { - // migrate ruleset settings. can be removed 20220315. - var existingSettings = db.Context.DatabasedSetting; - - // only migrate data if the realm database is empty. - if (!realm.All().Any()) - { - foreach (var dkb in existingSettings) - { - if (dkb.RulesetID == null) continue; - - realm.Add(new RealmRulesetSetting - { - Key = dkb.Key, - Value = dkb.StringValue, - // important: this RulesetStore must be the EF one. - RulesetName = RulesetStore.GetRuleset(dkb.RulesetID.Value).ShortName, - Variant = dkb.Variant ?? 0, - }); - } - } - - db.Context.RemoveRange(existingSettings); - - transaction.Commit(); - } } private void onRulesetChanged(ValueChangedEvent r) diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings index 3fac94b243..a96f64cdc3 100644 --- a/osu.sln.DotSettings +++ b/osu.sln.DotSettings @@ -311,6 +311,7 @@ AABB API BPM + EF FPS GC GL