PgSqlDatabaseProvider.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using Jellyfin.Server.Implementations;
  3. using Jellyfin.Server.Implementations.DatabaseConfiguration;
  4. using MediaBrowser.Common.Configuration;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.Extensions.Logging;
  7. using Npgsql;
  8. namespace Jellyfin.Database.Providers.PgSql;
  9. /// <summary>
  10. /// Configures jellyfin to use an Postgres database.
  11. /// </summary>
  12. [JellyfinDatabaseProviderKey("Jellyfin-PgSql")]
  13. public sealed class PgSqlDatabaseProvider : IJellyfinDatabaseProvider
  14. {
  15. private readonly IConfigurationManager _configurationManager;
  16. private readonly ILogger<PgSqlDatabaseProvider> _logger;
  17. /// <summary>
  18. /// Initializes a new instance of the <see cref="PgSqlDatabaseProvider"/> class.
  19. /// </summary>
  20. /// <param name="configurationManager">Configuration manager to get PgSQL connection data.</param>
  21. /// <param name="logger">A logger.</param>
  22. public PgSqlDatabaseProvider(IConfigurationManager configurationManager, ILogger<PgSqlDatabaseProvider> logger)
  23. {
  24. _configurationManager = configurationManager;
  25. _logger = logger;
  26. }
  27. /// <inheritdoc/>
  28. public IDbContextFactory<JellyfinDbContext>? DbContextFactory { get; set; }
  29. /// <inheritdoc/>
  30. public void Initialise(DbContextOptionsBuilder options)
  31. {
  32. var dbSettings = _configurationManager.GetConfiguration<DatabaseConfigurationOptions>("database");
  33. if (dbSettings.PostgreSql is null)
  34. {
  35. throw new InvalidOperationException("Selected PgSQL as database provider but did not provide required configuration. Please see docs.");
  36. }
  37. var connectionBuilder = new NpgsqlConnectionStringBuilder();
  38. connectionBuilder.ApplicationName = "jellyfin";
  39. connectionBuilder.CommandTimeout = dbSettings.PostgreSql.Timeout;
  40. connectionBuilder.Database = dbSettings.PostgreSql.DatabaseName;
  41. connectionBuilder.Username = dbSettings.PostgreSql.Username;
  42. connectionBuilder.Password = dbSettings.PostgreSql.Password;
  43. connectionBuilder.Host = dbSettings.PostgreSql.ServerName;
  44. connectionBuilder.Port = dbSettings.PostgreSql.Port;
  45. var connectionString = connectionBuilder.ToString();
  46. options
  47. .UseNpgsql(connectionString, pgSqlOptions => pgSqlOptions.MigrationsAssembly(GetType().Assembly));
  48. }
  49. /// <inheritdoc/>
  50. public Task RunScheduledOptimisation(CancellationToken cancellationToken)
  51. {
  52. return Task.CompletedTask;
  53. }
  54. /// <inheritdoc/>
  55. public void OnModelCreating(ModelBuilder modelBuilder)
  56. {
  57. }
  58. /// <inheritdoc/>
  59. public Task RunShutdownTask(CancellationToken cancellationToken)
  60. {
  61. return Task.CompletedTask;
  62. }
  63. }