using System; using System.Collections.Generic; using System.IO; using System.Linq; using MessagePack; public class DatabaseCache { public event Action OnDataUpdateLocal; public event Action OnDataUpdateRemote; public event Action OnDataDeleteLocal; public Action Logger = Console.WriteLine; private readonly Dictionary _entries = new Dictionary(); private readonly Dictionary> _types = new Dictionary>(); private DirectoryInfo _dir; public IEnumerable AllEntries => _entries.Values; public void Add(DatabaseEntry entry, bool remote = false) { if (entry != null) { _entries[entry.ID] = entry; var type = entry.GetType(); var types = type.FindInterfaces((_, __) => true, null).Append(type); foreach (var t in types) { if(!_types.ContainsKey(t)) _types[t] = new Dictionary(); _types[t][entry.ID] = entry; } if(remote) OnDataUpdateRemote?.Invoke(entry); else OnDataUpdateLocal?.Invoke(entry); } } public void AddAll(IEnumerable entries, bool remote = false) { foreach (var entry in entries) { Add(entry, remote); } } public DatabaseEntry Get(Guid guid) { DatabaseEntry entry; _entries.TryGetValue(guid, out entry); return entry; } public T Get(Guid guid) where T : DatabaseEntry { DatabaseEntry entry; _types[typeof(T)].TryGetValue(guid, out entry); return (T) entry; } public IEnumerable GetAll() { return _types[typeof(T)].Values.Cast(); } public void Delete(DatabaseEntry entry) { _entries.Remove(entry.ID); foreach (var type in _types.Values) { type.Remove(entry.ID); } OnDataDeleteLocal?.Invoke(entry); } }