123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using System;
- using Jellyfin.Server.Implementations;
- using MediaBrowser.Common.Configuration;
- using Microsoft.Data.Sqlite;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.Extensions.Logging;
- namespace Jellyfin.Database.Providers.SqLite;
- /// <summary>
- /// Configures jellyfin to use an SQLite database.
- /// </summary>
- [JellyfinDatabaseProviderKey("Jellyfin-SQLite")]
- public sealed class SqliteDatabaseProvider : IJellyfinDatabaseProvider
- {
- private readonly IApplicationPaths _applicationPaths;
- private readonly ILogger<SqliteDatabaseProvider> _logger;
- /// <summary>
- /// Initializes a new instance of the <see cref="SqliteDatabaseProvider"/> class.
- /// </summary>
- /// <param name="applicationPaths">Service to construct the fallback when the old data path configuration is used.</param>
- /// <param name="logger">A logger.</param>
- public SqliteDatabaseProvider(IApplicationPaths applicationPaths, ILogger<SqliteDatabaseProvider> logger)
- {
- _applicationPaths = applicationPaths;
- _logger = logger;
- }
- /// <inheritdoc/>
- public IDbContextFactory<JellyfinDbContext>? DbContextFactory { get; set; }
- /// <inheritdoc/>
- public void Initialise(DbContextOptionsBuilder options)
- {
- options.UseSqlite(
- $"Filename={Path.Combine(_applicationPaths.DataPath, "jellyfin.db")};Pooling=false",
- sqLiteOptions => sqLiteOptions.MigrationsAssembly(GetType().Assembly));
- }
- /// <inheritdoc/>
- public async Task RunScheduledOptimisation(CancellationToken cancellationToken)
- {
- var context = await DbContextFactory!.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
- await using (context.ConfigureAwait(false))
- {
- if (context.Database.IsSqlite())
- {
- await context.Database.ExecuteSqlRawAsync("PRAGMA optimize", cancellationToken).ConfigureAwait(false);
- await context.Database.ExecuteSqlRawAsync("VACUUM", cancellationToken).ConfigureAwait(false);
- _logger.LogInformation("jellyfin.db optimized successfully!");
- }
- else
- {
- _logger.LogInformation("This database doesn't support optimization");
- }
- }
- }
- /// <inheritdoc/>
- public void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.SetDefaultDateTimeKind(DateTimeKind.Utc);
- }
- /// <inheritdoc/>
- public async Task RunShutdownTask(CancellationToken cancellationToken)
- {
- // Run before disposing the application
- var context = await DbContextFactory!.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
- await using (context.ConfigureAwait(false))
- {
- await context.Database.ExecuteSqlRawAsync("PRAGMA optimize", cancellationToken).ConfigureAwait(false);
- }
- SqliteConnection.ClearAllPools();
- }
- }
|