From 631aafe68ff8572b5b1b79b34338ef837a3a1bde Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sat, 23 Aug 2025 19:08:43 +0200 Subject: [PATCH] Improved DatabaseMigrations using reflection --- src/Server/Migrations/DatabaseMigrations.cs | 37 ++++++++++++--------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/Server/Migrations/DatabaseMigrations.cs b/src/Server/Migrations/DatabaseMigrations.cs index b7107a2..2d50668 100644 --- a/src/Server/Migrations/DatabaseMigrations.cs +++ b/src/Server/Migrations/DatabaseMigrations.cs @@ -1,6 +1,7 @@ using System.Data.Common; using Server.Exceptions; using Server.Helper; +using System.Reflection; namespace Server.Migrations; @@ -8,24 +9,30 @@ public static class DatabaseMigrations { public static void Migrate(SQLHelper helper) { - int databaseVersion = DatabaseGetVersion(helper); - switch (databaseVersion) + int initialDatabaseVersion = DatabaseGetVersion(helper); + int databaseVersion = initialDatabaseVersion; + + var updateMethods = typeof(DatabaseMigrations) + .GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => m.Name.StartsWith("UpdateFrom") && m.ReturnType == typeof(int)) + .OrderBy(m => int.Parse(m.Name["UpdateFrom".Length..])) + .ToList(); + + foreach (var method in updateMethods) { - case 0: - databaseVersion = Create(helper); - goto case 1; // Here lies a dead braincell. - case 1: - databaseVersion = UpdateFrom1(helper); // TODO: Implement reflection based dynamic invocation. - goto case 2; - case 2: - databaseVersion = UpdateFrom2(helper); - goto case 3; - case 3: - default: - break; + var version = int.Parse(method.Name["UpdateFrom".Length..]); + if (version >= databaseVersion) + { + databaseVersion = (int)method.Invoke(null, new object[] { helper }); + } + } + + if (databaseVersion != initialDatabaseVersion) + { + helper.ExecuteSQLNonQuery("UPDATE settings SET value = @databaseVersion", new() { ["databaseVersion"] = databaseVersion.ToString() }); } - helper.ExecuteSQLNonQuery("UPDATE settings SET value = @databaseVersion", new() { ["databaseVersion"] = databaseVersion.ToString() }); } + public static int DatabaseGetVersion(SQLHelper helper) { DbDataReader reader = helper.ExecuteSQLCommand("show tables", []);