// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using System.Collections.Generic; using System.Linq.Expressions; using osu.Framework.Logging; using osu.Framework.Platform; using SQLite.Net; using SQLiteNetExtensions.Extensions; namespace osu.Game.Database { public abstract class DatabaseStore { protected readonly Storage Storage; protected readonly SQLiteConnection Connection; protected DatabaseStore(SQLiteConnection connection, Storage storage = null) { Storage = storage; Connection = connection; try { Prepare(); } catch (Exception e) { Logger.Error(e, $@"Failed to initialise the {GetType()}! Trying again with a clean database..."); Prepare(true); } } /// /// Prepare this database for use. /// protected abstract void Prepare(bool reset = false); /// /// Reset this database to a default state. Undo all changes to database and storage backings. /// public void Reset() => Prepare(true); public TableQuery Query() where T : class { return Connection.Table(); } /// /// This is expensive. Use with caution. /// public List GetAllWithChildren(Expression> filter = null, bool recursive = true) where T : class { return Connection.GetAllWithChildren(filter, recursive); } public T GetChildren(T item, bool recursive = false) { if (item == null) return default(T); Connection.GetChildren(item, recursive); return item; } protected abstract Type[] ValidTypes { get; } } }