< Summary - Jellyfin

Information
Class: Jellyfin.Database.Providers.Sqlite.PragmaConnectionInterceptor
Assembly: Jellyfin.Database.Providers.Sqlite
File(s): /srv/git/jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/PragmaConnectionInterceptor.cs
Line coverage
93%
Covered lines: 27
Uncovered lines: 2
Coverable lines: 29
Total lines: 108
Line coverage: 93.1%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
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%11100%
ConnectionOpened(...)100%11100%
BuildCommandText()75%8883.33%

File(s)

/srv/git/jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/PragmaConnectionInterceptor.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Data.Common;
 3using System.Globalization;
 4using System.Text;
 5using System.Threading;
 6using System.Threading.Tasks;
 7using Microsoft.EntityFrameworkCore.Diagnostics;
 8using Microsoft.Extensions.Logging;
 9
 10namespace Jellyfin.Database.Providers.Sqlite;
 11
 12/// <summary>
 13/// Injects a series of PRAGMA on each connection starts.
 14/// </summary>
 15public class PragmaConnectionInterceptor : DbConnectionInterceptor
 16{
 17    private readonly ILogger _logger;
 18    private readonly int? _cacheSize;
 19    private readonly string _lockingMode;
 20    private readonly int? _journalSizeLimit;
 21    private readonly int _tempStoreMode;
 22    private readonly int _syncMode;
 23    private readonly IDictionary<string, string> _customPragma;
 24
 25    /// <summary>
 26    /// Initializes a new instance of the <see cref="PragmaConnectionInterceptor"/> class.
 27    /// </summary>
 28    /// <param name="logger">The logger.</param>
 29    /// <param name="cacheSize">Cache size.</param>
 30    /// <param name="lockingMode">Locking mode.</param>
 31    /// <param name="journalSizeLimit">Journal Size.</param>
 32    /// <param name="tempStoreMode">The https://sqlite.org/pragma.html#pragma_temp_store pragma.</param>
 33    /// <param name="syncMode">The https://sqlite.org/pragma.html#pragma_synchronous pragma.</param>
 34    /// <param name="customPragma">A list of custom provided Pragma in the list of CustomOptions starting with "#PRAGMA:
 4235    public PragmaConnectionInterceptor(ILogger logger, int? cacheSize, string lockingMode, int? journalSizeLimit, int te
 36    {
 4237        _logger = logger;
 4238        _cacheSize = cacheSize;
 4239        _lockingMode = lockingMode;
 4240        _journalSizeLimit = journalSizeLimit;
 4241        _tempStoreMode = tempStoreMode;
 4242        _syncMode = syncMode;
 4243        _customPragma = customPragma;
 44
 4245        InitialCommand = BuildCommandText();
 4246        _logger.LogInformation("SQLITE connection pragma command set to: \r\n {PragmaCommand}", InitialCommand);
 4247    }
 48
 49    private string? InitialCommand { get; set; }
 50
 51    /// <inheritdoc/>
 52    public override void ConnectionOpened(DbConnection connection, ConnectionEndEventData eventData)
 53    {
 230154        base.ConnectionOpened(connection, eventData);
 55
 230156        using (var command = connection.CreateCommand())
 57        {
 58#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
 230159            command.CommandText = InitialCommand;
 60#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
 230161            command.ExecuteNonQuery();
 230162        }
 230163    }
 64
 65    /// <inheritdoc/>
 66    public override async Task ConnectionOpenedAsync(DbConnection connection, ConnectionEndEventData eventData, Cancella
 67    {
 68        await base.ConnectionOpenedAsync(connection, eventData, cancellationToken).ConfigureAwait(false);
 69
 70        var command = connection.CreateCommand();
 71        await using (command.ConfigureAwait(false))
 72        {
 73#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
 74            command.CommandText = InitialCommand;
 75#pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
 76            await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
 77        }
 78    }
 79
 80    private string BuildCommandText()
 81    {
 4282        var sb = new StringBuilder();
 4283        if (_cacheSize.HasValue)
 84        {
 085            sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA cache_size={_cacheSize.Value};");
 86        }
 87
 4288        if (!string.IsNullOrWhiteSpace(_lockingMode))
 89        {
 4290            sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA locking_mode={_lockingMode};");
 91        }
 92
 4293        if (_journalSizeLimit.HasValue)
 94        {
 4295            sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA journal_size_limit={_journalSizeLimit};");
 96        }
 97
 4298        sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA synchronous={_syncMode};");
 4299        sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA temp_store={_tempStoreMode};");
 100
 84101        foreach (var item in _customPragma)
 102        {
 0103            sb.AppendLine(CultureInfo.InvariantCulture, $"PRAGMA {item.Key}={item.Value};");
 104        }
 105
 42106        return sb.ToString();
 107    }
 108}