public SkinManager(Storage storage, RealmAccess realm, GameHost host, IResourceStore <byte[]> resources, AudioManager audio, Scheduler scheduler) : base(storage, realm) { this.audio = audio; this.scheduler = scheduler; this.host = host; this.resources = resources; userFiles = new StorageBackedResourceStore(storage.GetStorageForDirectory("files")); skinImporter = new SkinImporter(storage, realm, this) { PostNotification = obj => PostNotification?.Invoke(obj), }; var defaultSkins = new[] { DefaultLegacySkin = new DefaultLegacySkin(this), DefaultSkin = new DefaultSkin(this), }; // Ensure the default entries are present. realm.Write(r => { foreach (var skin in defaultSkins) { if (r.Find <SkinInfo>(skin.SkinInfo.ID) == null) { r.Add(skin.SkinInfo.Value); } } }); CurrentSkinInfo.ValueChanged += skin => { CurrentSkin.Value = skin.NewValue.PerformRead(GetSkin); }; CurrentSkin.Value = DefaultSkin; CurrentSkin.ValueChanged += skin => { if (!skin.NewValue.SkinInfo.Equals(CurrentSkinInfo.Value)) { throw new InvalidOperationException($"Setting {nameof(CurrentSkin)}'s value directly is not supported. Use {nameof(CurrentSkinInfo)} instead."); } SourceChanged?.Invoke(); }; }
public override void SetUp() { storage = new TemporaryNativeStorage("realm-benchmark"); storage.DeleteDirectory(string.Empty); realm = new RealmAccess(storage, "client"); realm.Run(r => { realm.Write(c => c.Add(TestResources.CreateTestBeatmapSetInfo(rulesets: new[] { new OsuRuleset().RulesetInfo }))); }); updateThread = new UpdateThread(() => { }, null); updateThread.Start(); }
protected override bool PerformSave() { TLookup[] changed; lock (pendingWrites) { changed = pendingWrites.ToArray(); pendingWrites.Clear(); } realm?.Write(r => { foreach (var c in changed) { var setting = r.All <RealmRulesetSetting>().First(s => s.RulesetName == rulesetName && s.Variant == variant && s.Key == c.ToString()); setting.Value = ConfigStore[c].ToString(); } }); return(true); }
public void Cleanup() { Logger.Log(@"Beginning realm file store cleanup"); int totalFiles = 0; int removedFiles = 0; // can potentially be run asynchronously, although we will need to consider operation order for disk deletion vs realm removal. realm.Write(r => { // TODO: consider using a realm native query to avoid iterating all files (https://github.com/realm/realm-dotnet/issues/2659#issuecomment-927823707) var files = r.All <RealmFile>().ToList(); foreach (var file in files) { totalFiles++; if (file.BacklinksCount > 0) { continue; } try { removedFiles++; Storage.Delete(file.GetStoragePath()); r.Remove(file); } catch (Exception e) { Logger.Error(e, $@"Could not delete databased file {file.Hash}"); } } }); Logger.Log($@"Finished realm file store cleanup ({removedFiles} of {totalFiles} deleted)"); }