diff --git a/csharp/App/Backend/Backend.csproj b/csharp/App/Backend/Backend.csproj index 6959e506d..bf230bd4e 100644 --- a/csharp/App/Backend/Backend.csproj +++ b/csharp/App/Backend/Backend.csproj @@ -27,6 +27,7 @@ + diff --git a/csharp/App/Backend/Controller.cs b/csharp/App/Backend/Controller.cs index f3e80527e..74b45cb9a 100644 --- a/csharp/App/Backend/Controller.cs +++ b/csharp/App/Backend/Controller.cs @@ -20,7 +20,6 @@ public class Controller : ControllerBase if (user is null) { - Console.WriteLine("I have no user"); throw new Exceptions(400,"Null User Exception", "Must provide a user to log in as.", Request.Path.Value!); } diff --git a/csharp/App/Backend/Database/Create.cs b/csharp/App/Backend/Database/Create.cs index 95849acaa..24944ba2b 100644 --- a/csharp/App/Backend/Database/Create.cs +++ b/csharp/App/Backend/Database/Create.cs @@ -7,54 +7,61 @@ namespace InnovEnergy.App.Backend.Database; public static partial class Db { + private static Boolean Insert(Object obj) + { + var success = Connection.Insert(obj) > 0; + if(success) BackupDatabase(); + return success; + } + public static Boolean Create(Installation installation) { // SQLite wrapper is smart and *modifies* t's Id to the one generated (autoincrement) by the insertion - return Connection.Insert(installation) > 0; + return Insert(installation); } public static Boolean Create(DeletedInstallation installation) { - return Connection.Insert(installation) > 0; + return Insert(installation); } public static Boolean Create(Folder folder) { - return Connection.Insert(folder) > 0; + return Insert(folder); } public static Boolean Create(DeletedFolder folder) { - return Connection.Insert(folder) > 0; + return Insert(folder); } public static Boolean Create(User user) { - return Connection.Insert(user) > 0; + return Insert(user); } public static Boolean Create(DeletedUser user) { - return Connection.Insert(user) > 0; + return Insert(user); } public static Boolean Create(Session session) { - return Connection.Insert(session) > 0; + return Insert(session); } public static Boolean Create(InstallationAccess installationAccess) { - return Connection.Insert(installationAccess) > 0; + return Insert(installationAccess); } public static Boolean Create(FolderAccess folderAccess) { - return Connection.Insert(folderAccess) > 0; + return Insert(folderAccess); } public static Boolean Create(OrderNumber2Installation o2i) { - return Connection.Insert(o2i) > 0; + return Insert(o2i); } } \ No newline at end of file diff --git a/csharp/App/Backend/Database/Db.cs b/csharp/App/Backend/Database/Db.cs index ea82f6788..a3918d2cb 100644 --- a/csharp/App/Backend/Database/Db.cs +++ b/csharp/App/Backend/Database/Db.cs @@ -1,12 +1,16 @@ +using System.Data.SQLite; using System.Reactive.Concurrency; using System.Reactive.Linq; +using System.Runtime.InteropServices; using CliWrap; using CliWrap.Buffered; using InnovEnergy.App.Backend.DataTypes; using InnovEnergy.App.Backend.DataTypes.Methods; using InnovEnergy.App.Backend.Relations; using InnovEnergy.Lib.Utils; +using Microsoft.Identity.Client; using SQLite; +using SQLiteConnection = SQLite.SQLiteConnection; namespace InnovEnergy.App.Backend.Database; @@ -16,8 +20,79 @@ public static partial class Db { internal const String DbPath = "./db.sqlite"; - private static SQLiteConnection Connection { get; } = new SQLiteConnection(DbPath); + private static SQLiteConnection Connection { get; } = ((Func)(() => + { + var latestDb = new DirectoryInfo(@"DbBackups").GetFiles() + .OrderBy(f => f.LastWriteTime) + .First().Name; + var fileConnection = new SQLiteConnection("DbBackups/"+latestDb); + + var memoryConnection = new SQLiteConnection(":memory:"); + + // fileConnection.Backup(memoryConnection.DatabasePath); + + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + memoryConnection.CreateTable(); + + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + foreach (var obj in fileConnection.Table()) + { + memoryConnection.Insert(obj); + } + + return memoryConnection; + }))(); + + public static void BackupDatabase() + { + var filename = "db-" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + ".sqlite"; + Connection.Backup("DbBackups/"+filename); + } + public static TableQuery Sessions => Connection.Table(); public static TableQuery Folders => Connection.Table(); public static TableQuery Installations => Connection.Table(); diff --git a/csharp/App/Backend/Database/Delete.cs b/csharp/App/Backend/Database/Delete.cs index 200b63855..a99229584 100644 --- a/csharp/App/Backend/Database/Delete.cs +++ b/csharp/App/Backend/Database/Delete.cs @@ -22,9 +22,10 @@ public static partial class Db Boolean DeleteDescendantFolderAndItsDependencies(Folder f) { FolderAccess .Delete(r => r.FolderId == f.Id); - Installations.Delete(r => r.ParentId == f.Id); - - return Folders.Delete(r => r.Id == f.Id) > 0; + Installations.Delete(r => r.ParentId == f.Id); + var delete = Folders.Delete(r => r.Id == f.Id); + BackupDatabase(); + return delete > 0; } } @@ -35,7 +36,9 @@ public static partial class Db Boolean DeleteInstallationAndItsDependencies() { InstallationAccess.Delete(i => i.InstallationId == installation.Id); - return Installations.Delete(i => i.Id == installation.Id) > 0; + var delete = Installations.Delete(i => i.Id == installation.Id); + BackupDatabase(); + return delete > 0; } } @@ -48,7 +51,9 @@ public static partial class Db FolderAccess .Delete(u => u.UserId == user.Id); InstallationAccess.Delete(u => u.UserId == user.Id); - return Users.Delete(u => u.Id == user.Id) > 0; + var delete = Users.Delete(u => u.Id == user.Id); + BackupDatabase(); + return delete > 0; } } @@ -58,6 +63,8 @@ public static partial class Db // private!! private static Boolean Delete(Session session) { - return Sessions.Delete(s => s.Id == session.Id) > 0; + var delete = Sessions.Delete(s => s.Id == session.Id) > 0; + BackupDatabase(); + return delete; } } \ No newline at end of file diff --git a/csharp/App/Backend/Database/Update.cs b/csharp/App/Backend/Database/Update.cs index a90749a45..094487552 100644 --- a/csharp/App/Backend/Database/Update.cs +++ b/csharp/App/Backend/Database/Update.cs @@ -5,14 +5,21 @@ namespace InnovEnergy.App.Backend.Database; public static partial class Db { + private static Boolean Update(Object obj) + { + var success = Connection.Update(obj) > 0; + if(success) BackupDatabase(); + return success; + } + public static Boolean Update(Folder folder) { - return Connection.Update(folder) > 0; + return Update(obj: folder); } public static Boolean Update(Installation installation) { - return Connection.Update(installation) > 0; + return Update(obj: installation); } public static Boolean Update(User user) @@ -24,7 +31,7 @@ public static partial class Db user.ParentId = originalUser.ParentId; user.Name = originalUser.Name; - return Connection.Update(user) > 0; + return Update(obj: user); } diff --git a/csharp/App/Backend/db.sqlite b/csharp/App/Backend/DbBackups/db.sqlite similarity index 99% rename from csharp/App/Backend/db.sqlite rename to csharp/App/Backend/DbBackups/db.sqlite index 9a363a376..55d2bbbeb 100644 Binary files a/csharp/App/Backend/db.sqlite and b/csharp/App/Backend/DbBackups/db.sqlite differ