|
@@ -42,10 +42,28 @@ public sealed class SqliteDatabaseProvider : IJellyfinDatabaseProvider
|
|
|
/// <inheritdoc/>
|
|
/// <inheritdoc/>
|
|
|
public void Initialise(DbContextOptionsBuilder options, DatabaseConfigurationOptions databaseConfiguration)
|
|
public void Initialise(DbContextOptionsBuilder options, DatabaseConfigurationOptions databaseConfiguration)
|
|
|
{
|
|
{
|
|
|
|
|
+ static T? GetOption<T>(ICollection<CustomDatabaseOption>? options, string key, Func<string, T> converter, Func<T>? defaultValue = null)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (options is null)
|
|
|
|
|
+ {
|
|
|
|
|
+ return defaultValue is not null ? defaultValue() : default;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var value = options.FirstOrDefault(e => e.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
+ if (value is null)
|
|
|
|
|
+ {
|
|
|
|
|
+ return defaultValue is not null ? defaultValue() : default;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return converter(value.Value);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var customOptions = databaseConfiguration.CustomProviderOptions?.Options;
|
|
|
|
|
+
|
|
|
var sqliteConnectionBuilder = new SqliteConnectionStringBuilder();
|
|
var sqliteConnectionBuilder = new SqliteConnectionStringBuilder();
|
|
|
sqliteConnectionBuilder.DataSource = Path.Combine(_applicationPaths.DataPath, "jellyfin.db");
|
|
sqliteConnectionBuilder.DataSource = Path.Combine(_applicationPaths.DataPath, "jellyfin.db");
|
|
|
- sqliteConnectionBuilder.Cache = Enum.Parse<SqliteCacheMode>(databaseConfiguration.CustomProviderOptions?.Options.FirstOrDefault(e => e.Key.Equals("cache", StringComparison.OrdinalIgnoreCase))?.Value ?? nameof(SqliteCacheMode.Default));
|
|
|
|
|
- sqliteConnectionBuilder.Pooling = (databaseConfiguration.CustomProviderOptions?.Options.FirstOrDefault(e => e.Key.Equals("pooling", StringComparison.OrdinalIgnoreCase))?.Value ?? bool.TrueString).Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
|
|
+ sqliteConnectionBuilder.Cache = GetOption(customOptions, "cache", Enum.Parse<SqliteCacheMode>, () => SqliteCacheMode.Default);
|
|
|
|
|
+ sqliteConnectionBuilder.Pooling = GetOption(customOptions, "pooling", e => e.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase), () => true);
|
|
|
|
|
|
|
|
var connectionString = sqliteConnectionBuilder.ToString();
|
|
var connectionString = sqliteConnectionBuilder.ToString();
|
|
|
|
|
|
|
@@ -58,10 +76,18 @@ public sealed class SqliteDatabaseProvider : IJellyfinDatabaseProvider
|
|
|
sqLiteOptions => sqLiteOptions.MigrationsAssembly(GetType().Assembly))
|
|
sqLiteOptions => sqLiteOptions.MigrationsAssembly(GetType().Assembly))
|
|
|
// TODO: Remove when https://github.com/dotnet/efcore/pull/35873 is merged & released
|
|
// TODO: Remove when https://github.com/dotnet/efcore/pull/35873 is merged & released
|
|
|
.ConfigureWarnings(warnings =>
|
|
.ConfigureWarnings(warnings =>
|
|
|
- warnings.Ignore(RelationalEventId.NonTransactionalMigrationOperationWarning));
|
|
|
|
|
-
|
|
|
|
|
- var enableSensitiveDataLoggingOption = databaseConfiguration.CustomProviderOptions?.Options.FirstOrDefault(e => e.Key.Equals("EnableSensitiveDataLogging", StringComparison.OrdinalIgnoreCase))?.Value;
|
|
|
|
|
- if (!string.IsNullOrEmpty(enableSensitiveDataLoggingOption) && bool.TryParse(enableSensitiveDataLoggingOption, out bool enableSensitiveDataLogging) && enableSensitiveDataLogging)
|
|
|
|
|
|
|
+ warnings.Ignore(RelationalEventId.NonTransactionalMigrationOperationWarning))
|
|
|
|
|
+ .AddInterceptors(new PragmaConnectionInterceptor(
|
|
|
|
|
+ _logger,
|
|
|
|
|
+ GetOption<int?>(customOptions, "cacheSize", e => int.Parse(e, CultureInfo.InvariantCulture)),
|
|
|
|
|
+ GetOption(customOptions, "lockingmode", e => e, () => "NORMAL")!,
|
|
|
|
|
+ GetOption(customOptions, "journalsizelimit", int.Parse, () => 134_217_728),
|
|
|
|
|
+ GetOption(customOptions, "tempstoremode", int.Parse, () => 2),
|
|
|
|
|
+ GetOption(customOptions, "syncmode", int.Parse, () => 1),
|
|
|
|
|
+ customOptions?.Where(e => e.Key.StartsWith("#PRAGMA:", StringComparison.OrdinalIgnoreCase)).ToDictionary(e => e.Key["#PRAGMA:".Length..], e => e.Value) ?? []));
|
|
|
|
|
+
|
|
|
|
|
+ var enableSensitiveDataLogging = GetOption(customOptions, "EnableSensitiveDataLogging", e => e.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase), () => false);
|
|
|
|
|
+ if (enableSensitiveDataLogging)
|
|
|
{
|
|
{
|
|
|
options.EnableSensitiveDataLogging(enableSensitiveDataLogging);
|
|
options.EnableSensitiveDataLogging(enableSensitiveDataLogging);
|
|
|
_logger.LogInformation("EnableSensitiveDataLogging is enabled on SQLite connection");
|
|
_logger.LogInformation("EnableSensitiveDataLogging is enabled on SQLite connection");
|