using System; using Jellyfin.Server.Implementations; using Jellyfin.Server.Implementations.DatabaseConfiguration; using MediaBrowser.Common.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Npgsql; namespace Jellyfin.Database.Providers.PgSql; /// /// Configures jellyfin to use an Postgres database. /// [JellyfinDatabaseProviderKey("Jellyfin-PgSql")] public sealed class PgSqlDatabaseProvider : IJellyfinDatabaseProvider { private readonly IConfigurationManager _configurationManager; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// Configuration manager to get PgSQL connection data. /// A logger. public PgSqlDatabaseProvider(IConfigurationManager configurationManager, ILogger logger) { _configurationManager = configurationManager; _logger = logger; } /// public IDbContextFactory? DbContextFactory { get; set; } /// public void Initialise(DbContextOptionsBuilder options) { var dbSettings = _configurationManager.GetConfiguration("database"); if (dbSettings.PostgreSql is null) { throw new InvalidOperationException("Selected PgSQL as database provider but did not provide required configuration. Please see docs."); } var connectionBuilder = new NpgsqlConnectionStringBuilder(); connectionBuilder.ApplicationName = "jellyfin"; connectionBuilder.CommandTimeout = dbSettings.PostgreSql.Timeout; connectionBuilder.Database = dbSettings.PostgreSql.DatabaseName; connectionBuilder.Username = dbSettings.PostgreSql.Username; connectionBuilder.Password = dbSettings.PostgreSql.Password; connectionBuilder.Host = dbSettings.PostgreSql.ServerName; connectionBuilder.Port = dbSettings.PostgreSql.Port; var connectionString = connectionBuilder.ToString(); options .UseNpgsql(connectionString, pgSqlOptions => pgSqlOptions.MigrationsAssembly(GetType().Assembly)); } /// public Task RunScheduledOptimisation(CancellationToken cancellationToken) { return Task.CompletedTask; } /// public void OnModelCreating(ModelBuilder modelBuilder) { } /// public Task RunShutdownTask(CancellationToken cancellationToken) { return Task.CompletedTask; } }