| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;using Jellyfin.Server.Implementations;using MediaBrowser.Model.Globalization;using MediaBrowser.Model.Tasks;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Logging;namespace Emby.Server.Implementations.ScheduledTasks.Tasks{    /// <summary>    /// Optimizes Jellyfin's database by issuing a VACUUM command.    /// </summary>    public class OptimizeDatabaseTask : IScheduledTask, IConfigurableScheduledTask    {        private readonly ILogger<OptimizeDatabaseTask> _logger;        private readonly ILocalizationManager _localization;        private readonly IDbContextFactory<JellyfinDbContext> _provider;        /// <summary>        /// Initializes a new instance of the <see cref="OptimizeDatabaseTask" /> class.        /// </summary>        /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>        /// <param name="localization">Instance of the <see cref="ILocalizationManager"/> interface.</param>        /// <param name="provider">Instance of the <see cref="IDbContextFactory{JellyfinDbContext}"/> interface.</param>        public OptimizeDatabaseTask(            ILogger<OptimizeDatabaseTask> logger,            ILocalizationManager localization,            IDbContextFactory<JellyfinDbContext> provider)        {            _logger = logger;            _localization = localization;            _provider = provider;        }        /// <inheritdoc />        public string Name => _localization.GetLocalizedString("TaskOptimizeDatabase");        /// <inheritdoc />        public string Description => _localization.GetLocalizedString("TaskOptimizeDatabaseDescription");        /// <inheritdoc />        public string Category => _localization.GetLocalizedString("TasksMaintenanceCategory");        /// <inheritdoc />        public string Key => "OptimizeDatabaseTask";        /// <inheritdoc />        public bool IsHidden => false;        /// <inheritdoc />        public bool IsEnabled => true;        /// <inheritdoc />        public bool IsLogged => true;        /// <inheritdoc />        public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()        {            return            [                // Every so often                new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks }            ];        }        /// <inheritdoc />        public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)        {            _logger.LogInformation("Optimizing and vacuuming jellyfin.db...");            try            {                var context = await _provider.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");                    }                }            }            catch (Exception e)            {                _logger.LogError(e, "Error while optimizing jellyfin.db");            }        }    }}
 |