async Task Upgrade() { var versionFile = await Store.Info(VersionFile); var md = versionFile == null ? new StoreMd { Version = new SemVersion(0) } : await Store.Get <StoreMd>(VersionFile); var upgradeMethods = GetType().GetMethods() .Select(m => (m, a: m.GetCustomAttribute <UpgradeAttribute>())).Where(m => m.a != null) .Select(m => (m.m.Name, Upgrade: new Func <Task>(async() => { Log.Information("Upgrade {Name} - started", m.m.Name); var sw = Stopwatch.StartNew(); await(Task) m.m.Invoke(this, new object[] { }); Log.Information("Upgrade {Name} - completed in {Duration}", m.m.Name, sw.Elapsed.HumanizeShort()); }), Version: SemVersion.Parse(m.a.Version))); var toRun = upgradeMethods .Where(m => m.Version > md.Version || m.Version == md.Version && !md.Ran.Contains(m.Name)) .OrderBy(m => m.Version).ToArray(); foreach (var run in toRun) { await run.Upgrade(); md.Ran.Add(run.Name); md.Version = run.Version; await Save(md); } }
public static async Task <T> GetOrCreate <T>(this ISimpleFileStore store, StringPath path, Func <T> create = null) where T : class, new() { var o = await store.Get <T>(path); if (o == null) { o = create == null ? new T() : create(); await store.Set(path, o); } return(o); }