From a2afcff6df37b550744086859e37512adedb4abe Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:48:09 -0500 Subject: [PATCH] Fallback to host sqlite3 on FreeBSD and Linux also align with upstream --- .../Composition/AssemblyLoader.cs | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Common/Composition/AssemblyLoader.cs b/src/NzbDrone.Common/Composition/AssemblyLoader.cs index 0ff69fb0c..06f65a2e1 100644 --- a/src/NzbDrone.Common/Composition/AssemblyLoader.cs +++ b/src/NzbDrone.Common/Composition/AssemblyLoader.cs @@ -14,7 +14,6 @@ namespace NzbDrone.Common.Composition static AssemblyLoader() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler); - RegisterSQLiteResolver(); } public static IList Load(IList assemblyNames) @@ -23,6 +22,10 @@ namespace NzbDrone.Common.Composition toLoad.Add("Prowlarr.Common"); toLoad.Add(OsInfo.IsWindows ? "Prowlarr.Windows" : "Prowlarr.Mono"); + var toRegisterResolver = new List { "System.Data.SQLite" }; + toRegisterResolver.AddRange(assemblyNames.Intersect(new[] { "Prowlarr.Core" })); + RegisterNativeResolver(toRegisterResolver); + var startupPath = AppDomain.CurrentDomain.BaseDirectory; return toLoad @@ -43,27 +46,46 @@ namespace NzbDrone.Common.Composition return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath); } - public static void RegisterSQLiteResolver() + public static void RegisterNativeResolver(IEnumerable assemblyNames) { - // This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which - // is less likely to exist. - var sqliteAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath( - Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "System.Data.SQLite.dll")); + foreach (var name in assemblyNames) + { + // This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which + // is less likely to exist. + var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath( + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{name}.dll")); - try - { - NativeLibrary.SetDllImportResolver(sqliteAssembly, LoadSqliteNativeLib); - } - catch (InvalidOperationException) - { - // This can only be set once per assembly - // Catch required for NzbDrone.Host tests + try + { + NativeLibrary.SetDllImportResolver(assembly, LoadNativeLib); + } + catch (InvalidOperationException) + { + // This can only be set once per assembly + // Catch required for NzbDrone.Host tests + } } } - private static IntPtr LoadSqliteNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath) + private static IntPtr LoadNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath) { - var mappedName = OsInfo.IsLinux && libraryName == "sqlite3" ? "libsqlite3.so.0" : libraryName; + ArgumentException.ThrowIfNullOrWhiteSpace(libraryName); + + var mappedName = libraryName; + + if (libraryName is "sqlite3" or "e_sqlite3") + { + if (OsInfo.IsLinux) + { + if (NativeLibrary.TryLoad(libraryName, assembly, dllImportSearchPath, out var libHandle)) + { + return libHandle; + } + + mappedName = "libsqlite3.so.0"; + } + } + return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath); } }