In-Memory Database with automatic versioning Backups. When starting the server the newest backup is loaded into memory.

This commit is contained in:
Kim 2023-07-13 13:23:05 +02:00
parent 2aae717859
commit 8db786f965
7 changed files with 117 additions and 21 deletions

View File

@ -27,6 +27,7 @@
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.6" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters.Abstractions" Version="7.0.6" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.118" />
</ItemGroup>

View File

@ -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!);
}

View File

@ -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);
}
}

View File

@ -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<SQLiteConnection>)(() =>
{
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<User>();
memoryConnection.CreateTable<DeletedUser>();
memoryConnection.CreateTable<Installation>();
memoryConnection.CreateTable<DeletedInstallation>();
memoryConnection.CreateTable<DeletedFolder>();
memoryConnection.CreateTable<Folder>();
memoryConnection.CreateTable<FolderAccess>();
memoryConnection.CreateTable<InstallationAccess>();
memoryConnection.CreateTable<Session>();
memoryConnection.CreateTable<OrderNumber2Installation>();
foreach (var obj in fileConnection.Table<Session>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<Folder>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<Installation>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<User>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<FolderAccess>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<InstallationAccess>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<OrderNumber2Installation>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<DeletedInstallation>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<DeletedUser>())
{
memoryConnection.Insert(obj);
}
foreach (var obj in fileConnection.Table<DeletedFolder>())
{
memoryConnection.Insert(obj);
}
return memoryConnection;
}))();
public static void BackupDatabase()
{
var filename = "db-" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + ".sqlite";
Connection.Backup("DbBackups/"+filename);
}
public static TableQuery<Session> Sessions => Connection.Table<Session>();
public static TableQuery<Folder> Folders => Connection.Table<Folder>();
public static TableQuery<Installation> Installations => Connection.Table<Installation>();

View File

@ -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;
}
}

View File

@ -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);
}