40 lines
2.0 KiB
C#
40 lines
2.0 KiB
C#
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"));
|
|
}
|
|
}
|