diff --git a/Aaru.Core/Remote.cs b/Aaru.Core/Remote.cs index 85195d0a7..0a51969da 100644 --- a/Aaru.Core/Remote.cs +++ b/Aaru.Core/Remote.cs @@ -277,9 +277,9 @@ namespace Aaru.Core Start(ctx => { ProgressTask task = ctx.AddTask("Adding known iNES/NES 2.0 headers"); - task.MaxValue = sync.NesHeaders.Count; + task.MaxValue = sync.NesHeaders?.Count ?? 0; - foreach(NesHeaderDto header in sync.NesHeaders) + foreach(NesHeaderDto header in sync.NesHeaders ?? new List()) { task.Increment(1); diff --git a/Aaru.Database/Context.cs b/Aaru.Database/Context.cs index cb5ea84d8..10cecbc99 100644 --- a/Aaru.Database/Context.cs +++ b/Aaru.Database/Context.cs @@ -85,11 +85,14 @@ public sealed class AaruContext : DbContext /// Creates a database context with the database in the specified path /// Path to database file + /// Enable database pooling /// Database context - public static AaruContext Create(string dbPath) + public static AaruContext Create(string dbPath, bool pooling = true) { var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseLazyLoadingProxies().UseSqlite($"Data Source={dbPath}"); + + optionsBuilder.UseLazyLoadingProxies(). + UseSqlite(!pooling ? $"Data Source={dbPath};Pooling=False" : $"Data Source={dbPath}"); return new AaruContext(optionsBuilder.Options); } diff --git a/Aaru.Gui/ViewModels/Windows/SplashWindowViewModel.cs b/Aaru.Gui/ViewModels/Windows/SplashWindowViewModel.cs index 265ce949f..6081e2dba 100644 --- a/Aaru.Gui/ViewModels/Windows/SplashWindowViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/SplashWindowViewModel.cs @@ -121,15 +121,25 @@ namespace Aaru.Gui.ViewModels.Windows Task.Run(() => { - AaruContext ctx; + AaruContext ctx = null; try { - ctx = AaruContext.Create(Settings.Settings.LocalDbPath); + ctx = AaruContext.Create(Settings.Settings.LocalDbPath, false); ctx.Database.Migrate(); } catch(NotSupportedException) { + try + { + ctx?.Database.CloseConnection(); + ctx?.Dispose(); + } + catch(Exception) + { + // Should not ever arrive here, but if it does, keep trying to replace it anyway + } + File.Delete(Settings.Settings.LocalDbPath); ctx = AaruContext.Create(Settings.Settings.LocalDbPath); ctx.Database.EnsureCreated(); @@ -186,7 +196,7 @@ namespace Aaru.Gui.ViewModels.Windows // TODO: Update database } - var mainContext = AaruContext.Create(Settings.Settings.MainDbPath); + var mainContext = AaruContext.Create(Settings.Settings.MainDbPath, false); if(mainContext.Database.GetPendingMigrations().Any()) { @@ -202,6 +212,8 @@ namespace Aaru.Gui.ViewModels.Windows ErrorWriteLine("Exception trying to remove old database version, cannot continue..."); AaruConsole.ErrorWriteLine("Please manually remove file at {0}", Settings.Settings.MainDbPath); + + return; } // TODO: Update database diff --git a/Aaru/Main.cs b/Aaru/Main.cs index 8e9f765ab..24b8b77b9 100644 --- a/Aaru/Main.cs +++ b/Aaru/Main.cs @@ -44,6 +44,7 @@ using Aaru.Commands.Device; using Aaru.Commands.Filesystem; using Aaru.Commands.Image; using Aaru.Commands.Media; +using Aaru.CommonTypes.Enums; using Aaru.Console; using Aaru.Core; using Aaru.Database; @@ -109,15 +110,25 @@ namespace Aaru Settings.Settings.LoadSettings(); - AaruContext ctx; + AaruContext ctx=null; try { - ctx = AaruContext.Create(Settings.Settings.LocalDbPath); + ctx = AaruContext.Create(Settings.Settings.LocalDbPath, false); ctx.Database.Migrate(); } catch(NotSupportedException) { + try + { + ctx?.Database.CloseConnection(); + ctx?.Dispose(); + } + catch(Exception) + { + // Should not ever arrive here, but if it does, keep trying to replace it anyway + } + File.Delete(Settings.Settings.LocalDbPath); ctx = AaruContext.Create(Settings.Settings.LocalDbPath); ctx.Database.EnsureCreated(); @@ -160,7 +171,7 @@ namespace Aaru UpdateCommand.DoUpdate(true); } - var mainContext = AaruContext.Create(Settings.Settings.MainDbPath); + var mainContext = AaruContext.Create(Settings.Settings.MainDbPath, false); if(mainContext.Database.GetPendingMigrations().Any()) { @@ -174,8 +185,12 @@ namespace Aaru { AaruConsole.ErrorWriteLine("Exception trying to remove old database version, cannot continue..."); AaruConsole.ErrorWriteLine("Please manually remove file at {0}", Settings.Settings.MainDbPath); + + return (int)ErrorNumber.CannotRemoveDatabase; } + mainContext.Database.CloseConnection(); + mainContext.Dispose(); UpdateCommand.DoUpdate(true); }