using System; using System.IO; using EFCoreSecondLevelCacheInterceptor; using MediaBrowser.Common.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; 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. /// Whether second level cache disabled.. /// The updated service collection. public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection, bool disableSecondLevelCache) { if (!disableSecondLevelCache) { serviceCollection.AddEFSecondLevelCache(options => options.UseMemoryCacheProvider() .CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromMinutes(10)) .UseCacheKeyPrefix("EF_") // Don't cache null values. Remove this optional setting if it's not necessary. .SkipCachingResults(result => result.Value is null or EFTableRows { RowsCount: 0 })); } serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) => { var applicationPaths = serviceProvider.GetRequiredService(); var dbOpt = opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}"); if (!disableSecondLevelCache) { dbOpt.AddInterceptors(serviceProvider.GetRequiredService()); } }); return serviceCollection; } }