From e083d86d8bee0a1e4911d8849b6aff407cd6892f Mon Sep 17 00:00:00 2001 From: Pat Hartl Date: Mon, 7 Oct 2024 18:52:22 -0500 Subject: [PATCH] Add ability to switch database providers to MySQL or PostgreSQL Ref #108 --- .../LANCommander.Server.Data.MySQL.csproj | 14 ++++++++ ...LANCommander.Server.Data.PostgreSQL.csproj | 14 ++++++++ .../Models/Settings.cs | 8 +++++ LANCommander.Server/Program.cs | 35 ++++++++++++++----- .../UI/Pages/Settings/General.razor | 11 ++++++ LANCommander.sln | 12 +++++++ 6 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 LANCommander.Server.Data.MySQL/LANCommander.Server.Data.MySQL.csproj create mode 100644 LANCommander.Server.Data.PostgreSQL/LANCommander.Server.Data.PostgreSQL.csproj diff --git a/LANCommander.Server.Data.MySQL/LANCommander.Server.Data.MySQL.csproj b/LANCommander.Server.Data.MySQL/LANCommander.Server.Data.MySQL.csproj new file mode 100644 index 00000000..4a1623bd --- /dev/null +++ b/LANCommander.Server.Data.MySQL/LANCommander.Server.Data.MySQL.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/LANCommander.Server.Data.PostgreSQL/LANCommander.Server.Data.PostgreSQL.csproj b/LANCommander.Server.Data.PostgreSQL/LANCommander.Server.Data.PostgreSQL.csproj new file mode 100644 index 00000000..6a41e62b --- /dev/null +++ b/LANCommander.Server.Data.PostgreSQL/LANCommander.Server.Data.PostgreSQL.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/LANCommander.Server.Services/Models/Settings.cs b/LANCommander.Server.Services/Models/Settings.cs index adff52b1..95b2c8d6 100644 --- a/LANCommander.Server.Services/Models/Settings.cs +++ b/LANCommander.Server.Services/Models/Settings.cs @@ -1,5 +1,12 @@ namespace LANCommander.Server.Services.Models { + public enum DatabaseProvider + { + SQLite, + MySQL, + PostgreSQL + } + public enum LANCommanderTheme { Light, @@ -19,6 +26,7 @@ public class Settings { public int Port { get; set; } = 1337; + public DatabaseProvider DatabaseProvider { get; set; } = DatabaseProvider.SQLite; public string DatabaseConnectionString { get; set; } = "Data Source=LANCommander.db;Cache=Shared"; public string IGDBClientId { get; set; } = ""; public string IGDBClientSecret { get; set; } = ""; diff --git a/LANCommander.Server/Program.cs b/LANCommander.Server/Program.cs index 5cb6ba22..6e5f3b1b 100644 --- a/LANCommander.Server/Program.cs +++ b/LANCommander.Server/Program.cs @@ -9,6 +9,8 @@ using System.Text; using Hangfire; using LANCommander.Server.Services.MediaGrabbers; using Microsoft.Data.Sqlite; +using Pomelo.EntityFrameworkCore.MySql; +using Npgsql.EntityFrameworkCore.PostgreSQL; using LANCommander.Server.Extensions; using Microsoft.AspNetCore.Http.Features; using LANCommander.SDK.Enums; @@ -127,7 +129,21 @@ namespace LANCommander.Server builder.Services.AddDbContext(b => { b.UseLazyLoadingProxies(); - b.UseSqlite(settings.DatabaseConnectionString); + + switch (settings.DatabaseProvider) + { + case Services.Models.DatabaseProvider.SQLite: + b.UseSqlite(settings.DatabaseConnectionString); + break; + + case Services.Models.DatabaseProvider.MySQL: + b.UseMySql(settings.DatabaseConnectionString, ServerVersion.AutoDetect(settings.DatabaseConnectionString)); + break; + + case Services.Models.DatabaseProvider.PostgreSQL: + b.UseNpgsql(settings.DatabaseConnectionString); + break; + } }); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); @@ -334,14 +350,17 @@ namespace LANCommander.Server if ((await db.Database.GetPendingMigrationsAsync()).Any()) { - var dataSource = new SqliteConnectionStringBuilder(settings.DatabaseConnectionString).DataSource; - - var backupName = Path.Combine("Backups", $"LANCommander.db.{DateTime.Now.ToString("dd-MM-yyyy-HH.mm.ss.bak")}"); - - if (File.Exists(dataSource)) + if (settings.DatabaseProvider == Services.Models.DatabaseProvider.SQLite) { - Log.Information("Migrations pending, database will be backed up to {BackupName}", backupName); - File.Copy(dataSource, backupName); + var dataSource = new SqliteConnectionStringBuilder(settings.DatabaseConnectionString).DataSource; + + var backupName = Path.Combine("Backups", $"LANCommander.db.{DateTime.Now.ToString("dd-MM-yyyy-HH.mm.ss.bak")}"); + + if (File.Exists(dataSource)) + { + Log.Information("Migrations pending, database will be backed up to {BackupName}", backupName); + File.Copy(dataSource, backupName); + } } await db.Database.MigrateAsync(); diff --git a/LANCommander.Server/UI/Pages/Settings/General.razor b/LANCommander.Server/UI/Pages/Settings/General.razor index 85ab2db4..8609fa29 100644 --- a/LANCommander.Server/UI/Pages/Settings/General.razor +++ b/LANCommander.Server/UI/Pages/Settings/General.razor @@ -13,6 +13,17 @@
+ + + + + + + +