using System.Reactive.Linq; using InnovEnergy.App.Backend.DataTypes; using InnovEnergy.App.Backend.Relations; using InnovEnergy.Lib.Utils; using SQLite; namespace InnovEnergy.App.Backend.Database; public static partial class Db { internal const String DbPath = "./db.sqlite"; private static SQLiteConnection Connection { get; } = new SQLiteConnection(DbPath); public static TableQuery Sessions => Connection.Table(); public static TableQuery Folders => Connection.Table(); public static TableQuery Installations => Connection.Table(); public static TableQuery Users => Connection.Table(); public static TableQuery User2Folder => Connection.Table(); public static TableQuery User2Installation => Connection.Table(); static Db() { // on startup create/migrate tables Connection.RunInTransaction(() => { Connection.CreateTable(); Connection.CreateTable(); Connection.CreateTable(); Connection.CreateTable(); Connection.CreateTable(); Connection.CreateTable(); }); Observable.Interval(TimeSpan.FromDays(1)) .StartWith(0) // Do it right away (on startup) .Subscribe(Cleanup); // and then daily } private static Boolean RunTransaction(Func func) { var savepoint = Connection.SaveTransactionPoint(); var success = false; try { success = func(); } finally { if (success) Connection.Release(savepoint); else Connection.RollbackTo(savepoint); } return success; } private static void Cleanup(Int64 _) { DeleteS3Keys(); DeleteStaleSessions(); } private static void DeleteStaleSessions() { var deadline = DateTime.Now - Session.MaxAge; Sessions.Delete(s => s.LastSeen < deadline); } private static void DeleteS3Keys() { void DeleteKeys() => Installations.Do(i => i.S3Key = "").ForEach(Update); // TODO Connection.RunInTransaction(DeleteKeys); } }