using System; using System.IO; using EFCoreSecondLevelCacheInterceptor; using MediaBrowser.Common.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace Jellyfin.Server.Implementations.Extensions; /// /// Extensions for the interface. /// public static class ServiceCollectionExtensions { /// /// Adds the interface to the service collection with second level caching enabled. /// /// An instance of the interface. /// The updated service collection. public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection) { serviceCollection.AddEFSecondLevelCache(options => options.UseMemoryCacheProvider() .CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromMinutes(10)) .DisableLogging(true) .UseCacheKeyPrefix("EF_") // Don't cache null values. Remove this optional setting if it's not necessary. .SkipCachingResults(result => result.Value is null || (result.Value is EFTableRows rows && rows.RowsCount == 0))); serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) => { var applicationPaths = serviceProvider.GetRequiredService(); var loggerFactory = serviceProvider.GetRequiredService(); opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}") .AddInterceptors(serviceProvider.GetRequiredService()) .UseLoggerFactory(loggerFactory); }); return serviceCollection; } }