JellyfinDbProvider.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using MediaBrowser.Common.Configuration;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Logging;
  8. namespace Jellyfin.Server.Implementations
  9. {
  10. /// <summary>
  11. /// Factory class for generating new <see cref="JellyfinDb"/> instances.
  12. /// </summary>
  13. public class JellyfinDbProvider
  14. {
  15. private readonly IServiceProvider _serviceProvider;
  16. private readonly IApplicationPaths _appPaths;
  17. private readonly ILogger<JellyfinDbProvider> _logger;
  18. /// <summary>
  19. /// Initializes a new instance of the <see cref="JellyfinDbProvider"/> class.
  20. /// </summary>
  21. /// <param name="serviceProvider">The application's service provider.</param>
  22. /// <param name="appPaths">The application paths.</param>
  23. /// <param name="logger">The logger.</param>
  24. public JellyfinDbProvider(IServiceProvider serviceProvider, IApplicationPaths appPaths, ILogger<JellyfinDbProvider> logger)
  25. {
  26. _serviceProvider = serviceProvider;
  27. _appPaths = appPaths;
  28. _logger = logger;
  29. using var jellyfinDb = CreateContext();
  30. if (jellyfinDb.Database.GetPendingMigrations().Any())
  31. {
  32. _logger.LogInformation("There are pending EFCore migrations in the database. Applying... (This may take a while, do not stop Jellyfin)");
  33. jellyfinDb.Database.Migrate();
  34. _logger.LogInformation("EFCore migrations applied successfully");
  35. }
  36. }
  37. /// <summary>
  38. /// Creates a new <see cref="JellyfinDb"/> context.
  39. /// </summary>
  40. /// <returns>The newly created context.</returns>
  41. public JellyfinDb CreateContext()
  42. {
  43. var contextOptions = new DbContextOptionsBuilder<JellyfinDb>().UseSqlite($"Filename={Path.Combine(_appPaths.DataPath, "jellyfin.db")}");
  44. return ActivatorUtilities.CreateInstance<JellyfinDb>(_serviceProvider, contextOptions.Options);
  45. }
  46. }
  47. }