fix(database): qualify RD21 saves against pinned MariaDB 12.2.2

This commit is contained in:
cesnimda
2026-10-24 01:47:50 +02:00
parent 0d16a691e0
commit a2c9bda0d1
30 changed files with 2226 additions and 63 deletions
@@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore;
namespace JobTrackerApi.Data;
public static class DatabaseConfiguration
{
public static string GetProvider(IConfiguration configuration) =>
(configuration["Database:Provider"] ?? "mariadb").Trim().ToLowerInvariant() switch
{
"mysql" or "mariadb" => "mariadb",
"sqlite" => "sqlite",
_ => throw new InvalidOperationException("Database:Provider must be mariadb (or mysql) or explicitly sqlite for transitional preservation."),
};
public static string GetConnectionString(IConfiguration configuration, string sqlitePath)
{
var provider = GetProvider(configuration);
var connection = configuration.GetConnectionString("JobTracker");
if (!string.IsNullOrWhiteSpace(connection)) return connection;
if (provider == "sqlite") return $"Data Source={sqlitePath}";
throw new InvalidOperationException("ConnectionStrings:JobTracker is required for MariaDB. SQLite is only used when Database:Provider is explicitly sqlite.");
}
public static void Configure(DbContextOptionsBuilder options, IConfiguration configuration, string sqlitePath)
{
var provider = GetProvider(configuration);
var connection = GetConnectionString(configuration, sqlitePath);
if (provider == "mariadb")
{
var configuredVersion = configuration["Database:ServerVersion"] ?? "12.2.2";
if (!Version.TryParse(configuredVersion, out var version) || version.Major < 1 || version.Build < 0)
throw new InvalidOperationException("Database:ServerVersion must be a MariaDB version in major.minor.patch form.");
// AutoDetect would open a server connection while options are being registered.
options.UseMySql(connection, new MariaDbServerVersion(version), mysql => mysql.MigrationsAssembly("JobTrackerApi"));
}
else
options.UseSqlite(connection, sqlite => sqlite.MigrationsAssembly("JobTrackerApi"));
}
}