using System; using osu.Framework.Platform; namespace osu.Game.Database { /// /// A typed store which supports basic addition, deletion and updating for soft-deletable models. /// /// The databased model. public abstract class MutableDatabaseBackedStore : DatabaseBackedStore where T : class, IHasPrimaryKey, ISoftDelete { public event Action ItemAdded; public event Action ItemRemoved; protected MutableDatabaseBackedStore(IDatabaseContextFactory contextFactory, Storage storage = null) : base(contextFactory, storage) { } public void Add(T item) { using (var usage = ContextFactory.GetForWrite()) { var context = usage.Context; context.Attach(item); } ItemAdded?.Invoke(item); } /// /// Update a in the database. /// /// The item to update. public void Update(T item) { ItemRemoved?.Invoke(item); using (var usage = ContextFactory.GetForWrite()) usage.Context.Update(item); ItemAdded?.Invoke(item); } public bool Delete(T item) { using (ContextFactory.GetForWrite()) { Refresh(ref item); if (item.DeletePending) return false; item.DeletePending = true; } ItemRemoved?.Invoke(item); return true; } public bool Undelete(T item) { using (ContextFactory.GetForWrite()) { Refresh(ref item); if (!item.DeletePending) return false; item.DeletePending = false; } ItemAdded?.Invoke(item); return true; } } }