< Summary - Jellyfin

Information
Class: Jellyfin.Server.Migrations.Routines.MigrateLibraryDbCompatibilityCheck
Assembly: jellyfin
File(s): /srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/MigrateLibraryDbCompatibilityCheck.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 7
Coverable lines: 7
Total lines: 73
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
CheckMigratableVersion(...)100%210%

File(s)

/srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/MigrateLibraryDbCompatibilityCheck.cs

#LineLine coverage
 1#pragma warning disable RS0030 // Do not use banned APIs
 2
 3using System;
 4using System.IO;
 5using System.Threading;
 6using System.Threading.Tasks;
 7using Jellyfin.Server.ServerSetupApp;
 8using MediaBrowser.Controller;
 9using Microsoft.Data.Sqlite;
 10using Microsoft.Extensions.Logging;
 11
 12namespace Jellyfin.Server.Migrations.Routines;
 13
 14/// <summary>
 15/// The migration routine for checking if the current instance of Jellyfin is compatiable to be upgraded.
 16/// </summary>
 17[JellyfinMigration("2025-04-20T19:30:00", nameof(MigrateLibraryDbCompatibilityCheck))]
 18public class MigrateLibraryDbCompatibilityCheck : IAsyncMigrationRoutine
 19{
 20    private const string DbFilename = "library.db";
 21    private readonly IStartupLogger _logger;
 22    private readonly IServerApplicationPaths _paths;
 23
 24    /// <summary>
 25    /// Initializes a new instance of the <see cref="MigrateLibraryDbCompatibilityCheck"/> class.
 26    /// </summary>
 27    /// <param name="startupLogger">The startup logger.</param>
 28    /// <param name="paths">The Path service.</param>
 29    public MigrateLibraryDbCompatibilityCheck(IStartupLogger startupLogger, IServerApplicationPaths paths)
 30    {
 031        _logger = startupLogger;
 032        _paths = paths;
 033    }
 34
 35    /// <inheritdoc/>
 36    public async Task PerformAsync(CancellationToken cancellationToken)
 37    {
 38        var dataPath = _paths.DataPath;
 39        var libraryDbPath = Path.Combine(dataPath, DbFilename);
 40        if (!File.Exists(libraryDbPath))
 41        {
 42            _logger.LogError("Cannot migrate {LibraryDb} as it does not exist..", libraryDbPath);
 43            return;
 44        }
 45
 46        using var connection = new SqliteConnection($"Filename={libraryDbPath};Mode=ReadOnly");
 47        await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
 48        CheckMigratableVersion(connection);
 49        await connection.CloseAsync().ConfigureAwait(false);
 50    }
 51
 52    private static void CheckMigratableVersion(SqliteConnection connection)
 53    {
 054        CheckColumnExistance(connection, "TypedBaseItems", "lufs");
 055        CheckColumnExistance(connection, "TypedBaseItems", "normalizationgain");
 056        CheckColumnExistance(connection, "mediastreams", "dvversionmajor");
 57
 58        static void CheckColumnExistance(SqliteConnection connection, string table, string column)
 59        {
 60            using (var cmd = connection.CreateCommand())
 61            {
 62#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
 63                cmd.CommandText = $"Select COUNT(1) FROM pragma_table_xinfo('{table}') WHERE lower(name) = '{column}';";
 64#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
 65                var result = cmd.ExecuteScalar()!;
 66                if (!result.Equals(1L))
 67                {
 68                    throw new InvalidOperationException("Your database does not meet the required standard. Only upgrade
 69                }
 70            }
 71        }
 072    }
 73}