/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ using System; using System.Collections.Generic; using System.IO; using MessagePack; using UniRx; public interface ILegacyCatalogReader { DatabaseEntry Get(Guid guid); T Get(Guid guid) where T : DatabaseEntry; } public class LegacyCatalogCache : ILegacyCatalogReader { private readonly object addLock = new object(); private List _backingStores = new List(); private readonly Dictionary _entries = new Dictionary(); public void AddBackingStore(CacheBackingStore store) { _backingStores.Add(store); store.EntryAdded.Subscribe(entry => { AddInternal(entry, store); }); } public void PullAllBackingStores() { foreach(var store in _backingStores) store.PullAll(); } private void AddInternal(DatabaseEntry entry, CacheBackingStore source = null) { lock(addLock) { if (entry != null) { _entries[entry.ID] = entry; } } } public DatabaseEntry Get(Guid guid) { DatabaseEntry entry; _entries.TryGetValue(guid, out entry); return entry; } public T Get(Guid guid) where T : DatabaseEntry { return Get(guid) as T; } } public abstract class CacheBackingStore { protected CacheBackingStore() { EntryAdded = new Subject(); } public abstract void PullAll(); public Subject EntryAdded { get; } protected Dictionary Entries = new Dictionary(); } public abstract class SingleFileBackingStore : CacheBackingStore { public FileInfo FileInfo { get; } public abstract DatabaseEntry[] Deserialize(byte[] data); public SingleFileBackingStore(string filePath) { FileInfo = new FileInfo(filePath); } public override void PullAll() { if (!FileInfo.Exists) return; foreach (var entry in Deserialize(File.ReadAllBytes(FileInfo.FullName))) { Entries[entry.ID] = entry; EntryAdded.OnNext(entry); } } } public class SingleFileMessagePackBackingStore : SingleFileBackingStore { public SingleFileMessagePackBackingStore(string filePath) : base(filePath) { RegisterResolver.Register(); } public override DatabaseEntry[] Deserialize(byte[] data) { return MessagePackSerializer.Deserialize(data); } }