From b4803c42a5e3ce3744c7d6a6f724c18d39abf3d0 Mon Sep 17 00:00:00 2001 From: Robert McRackan Date: Thu, 2 Sep 2021 14:51:06 -0400 Subject: [PATCH] Streamline GetLibrary_Flat_NoTracking with better context dispose --- ApplicationServices/DbContexts.cs | 7 ++++++ ApplicationServices/LibraryCommands.cs | 18 ++++++++++++++- ApplicationServices/LibraryExporter.cs | 11 +++------- ApplicationServices/SearchEngineCommands.cs | 3 ++- LibationSearchEngine/SearchEngine.cs | 22 ++----------------- .../ProcessorAutomationController.cs | 2 +- LibationWinForms/Dialogs/RemoveBooksDialog.cs | 17 +++++--------- LibationWinForms/ProductsGrid.cs | 3 +-- 8 files changed, 39 insertions(+), 44 deletions(-) diff --git a/ApplicationServices/DbContexts.cs b/ApplicationServices/DbContexts.cs index 76f12478..ff495b64 100644 --- a/ApplicationServices/DbContexts.cs +++ b/ApplicationServices/DbContexts.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using DataLayer; using FileManager; @@ -12,5 +13,11 @@ namespace ApplicationServices public static LibationContext GetContext() => LibationContext.Create(SqliteStorage.ConnectionString); + + public static List GetLibrary_Flat_NoTracking() + { + using var context = GetContext(); + return context.GetLibrary_Flat_NoTracking(); + } } } diff --git a/ApplicationServices/LibraryCommands.cs b/ApplicationServices/LibraryCommands.cs index d990ddff..ff7e0d69 100644 --- a/ApplicationServices/LibraryCommands.cs +++ b/ApplicationServices/LibraryCommands.cs @@ -64,6 +64,7 @@ namespace ApplicationServices LibraryResponseGroups = LibraryOptions.ResponseGroupOptions.ALL_OPTIONS; } } + #region FULL LIBRARY scan and import public static async Task<(int totalCount, int newCount)> ImportAccountAsync(Func loginCallbackFactoryFunc, params Account[] accounts) { @@ -186,6 +187,21 @@ namespace ApplicationServices } #endregion + #region remove books + public static List RemoveBooks(List idsToRemove) + { + using var context = DbContexts.GetContext(); + var libBooks = context.GetLibrary_Flat_NoTracking(); + + var removeLibraryBooks = libBooks.Where(lb => idsToRemove.Contains(lb.Book.AudibleProductId)).ToList(); + context.Library.RemoveRange(removeLibraryBooks); + + context.SaveChanges(); + + return removeLibraryBooks; + } + #endregion + public static LiberatedStatus Liberated_Status(Book book) => book.Audio_Exists ? LiberatedStatus.Liberated : FileManager.AudibleFileStorage.AaxcExists(book.AudibleProductId) ? LiberatedStatus.PartialDownload @@ -201,7 +217,7 @@ namespace ApplicationServices public record LibraryStats(int booksFullyBackedUp, int booksDownloadedOnly, int booksNoProgress, int booksError, int pdfsDownloaded, int pdfsNotDownloaded) { } public static LibraryStats GetCounts() { - var libraryBooks = DbContexts.GetContext().GetLibrary_Flat_NoTracking(); + var libraryBooks = DbContexts.GetLibrary_Flat_NoTracking(); var results = libraryBooks .AsParallel() diff --git a/ApplicationServices/LibraryExporter.cs b/ApplicationServices/LibraryExporter.cs index 22813002..ead979cd 100644 --- a/ApplicationServices/LibraryExporter.cs +++ b/ApplicationServices/LibraryExporter.cs @@ -135,9 +135,7 @@ namespace ApplicationServices { public static void ToCsv(string saveFilePath) { - using var context = DbContexts.GetContext(); - var dtos = context.GetLibrary_Flat_NoTracking().ToDtos(); - + var dtos = DbContexts.GetLibrary_Flat_NoTracking().ToDtos(); if (!dtos.Any()) return; @@ -151,17 +149,14 @@ namespace ApplicationServices public static void ToJson(string saveFilePath) { - using var context = DbContexts.GetContext(); - var dtos = context.GetLibrary_Flat_NoTracking().ToDtos(); - + var dtos = DbContexts.GetLibrary_Flat_NoTracking().ToDtos(); var json = Newtonsoft.Json.JsonConvert.SerializeObject(dtos, Newtonsoft.Json.Formatting.Indented); System.IO.File.WriteAllText(saveFilePath, json); } public static void ToXlsx(string saveFilePath) { - using var context = DbContexts.GetContext(); - var dtos = context.GetLibrary_Flat_NoTracking().ToDtos(); + var dtos = DbContexts.GetLibrary_Flat_NoTracking().ToDtos(); var workbook = new XSSFWorkbook(); var sheet = workbook.CreateSheet("Library"); diff --git a/ApplicationServices/SearchEngineCommands.cs b/ApplicationServices/SearchEngineCommands.cs index dbe4287a..137ecd3c 100644 --- a/ApplicationServices/SearchEngineCommands.cs +++ b/ApplicationServices/SearchEngineCommands.cs @@ -10,7 +10,8 @@ namespace ApplicationServices public static void FullReIndex(SearchEngine engine = null) { engine ??= new SearchEngine(); - engine.CreateNewIndex(DbContexts.GetContext()); + var library = DbContexts.GetLibrary_Flat_NoTracking(); + engine.CreateNewIndex(library); } public static SearchResultSet Search(string searchString) => performSearchEngineFunc_safe(e => diff --git a/LibationSearchEngine/SearchEngine.cs b/LibationSearchEngine/SearchEngine.cs index 22147a46..01fdde9b 100644 --- a/LibationSearchEngine/SearchEngine.cs +++ b/LibationSearchEngine/SearchEngine.cs @@ -197,25 +197,9 @@ namespace LibationSearchEngine #endregion #region create and update index - /// - /// create new. ie: full re-index - /// - /// - public void CreateNewIndex(LibationContext context, bool overwrite = true) + /// create new. ie: full re-index + public void CreateNewIndex(IEnumerable library, bool overwrite = true) { - // 300 titles: 200- 400 ms - // 1021 titles: 1777-2250 ms - var sw = System.Diagnostics.Stopwatch.StartNew(); - var stamps = new List(); - void log() => stamps.Add(sw.ElapsedMilliseconds); - - - log(); - - var library = context.GetLibrary_Flat_NoTracking(); - - log(); - // location of index/create the index using var index = getIndex(); var exists = IndexReader.IndexExists(index); @@ -229,8 +213,6 @@ namespace LibationSearchEngine var doc = createBookIndexDocument(libraryBook); ixWriter.AddDocument(doc); } - - log(); } /// Long running. Use await Task.Run(() => UpdateBook(productId)) diff --git a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs index 6d604184..c2f8482c 100644 --- a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs +++ b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs @@ -304,7 +304,7 @@ An error occurred while trying to process this book. protected override async Task RunAsync() { // support for 'skip this time only' requires state. iterators provide this state for free. therefore: use foreach/iterator here - foreach (var libraryBook in Processable.GetValidLibraryBooks(ApplicationServices.DbContexts.GetContext().GetLibrary_Flat_NoTracking())) + foreach (var libraryBook in Processable.GetValidLibraryBooks(ApplicationServices.DbContexts.GetLibrary_Flat_NoTracking())) { var keepGoing = await ProcessOneAsync(libraryBook, validate: false); if (!keepGoing) diff --git a/LibationWinForms/Dialogs/RemoveBooksDialog.cs b/LibationWinForms/Dialogs/RemoveBooksDialog.cs index 90c3283c..e22bb42a 100644 --- a/LibationWinForms/Dialogs/RemoveBooksDialog.cs +++ b/LibationWinForms/Dialogs/RemoveBooksDialog.cs @@ -26,7 +26,7 @@ namespace LibationWinForms.Dialogs public RemoveBooksDialog(params Account[] accounts) { - _libraryBooks = DbContexts.GetContext().GetLibrary_Flat_NoTracking(); + _libraryBooks = DbContexts.GetLibrary_Flat_NoTracking(); _accounts = accounts; InitializeComponent(); @@ -58,9 +58,9 @@ namespace LibationWinForms.Dialogs return; try { - var rmovedBooks = await LibraryCommands.FindInactiveBooks((account) => new WinformResponder(account), _libraryBooks, _accounts); + var removedBooks = await LibraryCommands.FindInactiveBooks((account) => new WinformResponder(account), _libraryBooks, _accounts); - var removable = _removableGridEntries.Where(rge => rmovedBooks.Any(rb => rb.Book.AudibleProductId == rge.AudibleProductId)); + var removable = _removableGridEntries.Where(rge => removedBooks.Any(rb => rb.Book.AudibleProductId == rge.AudibleProductId)); if (!removable.Any()) return; @@ -104,14 +104,8 @@ namespace LibationWinForms.Dialogs if (result == DialogResult.Yes) { - using var context = DbContexts.GetContext(); - - var libBooks = context.GetLibrary_Flat_NoTracking(); - - var removeLibraryBooks = libBooks.Where(lb => selectedBooks.Any(rge => rge.AudibleProductId == lb.Book.AudibleProductId)).ToList(); - - context.Library.RemoveRange(removeLibraryBooks); - context.SaveChanges(); + var idsToRemove = selectedBooks.Select(rge => rge.AudibleProductId).ToList(); + var removeLibraryBooks = LibraryCommands.RemoveBooks(idsToRemove); foreach (var rEntry in selectedBooks) _removableGridEntries.Remove(rEntry); @@ -121,6 +115,7 @@ namespace LibationWinForms.Dialogs UpdateSelection(); } } + private void UpdateSelection() { var selectedCount = SelectedCount; diff --git a/LibationWinForms/ProductsGrid.cs b/LibationWinForms/ProductsGrid.cs index e92ef9a1..56409792 100644 --- a/LibationWinForms/ProductsGrid.cs +++ b/LibationWinForms/ProductsGrid.cs @@ -116,8 +116,7 @@ namespace LibationWinForms // // transform into sorted GridEntry.s BEFORE binding // - using var context = DbContexts.GetContext(); - var lib = context.GetLibrary_Flat_NoTracking(); + var lib = DbContexts.GetLibrary_Flat_NoTracking(); // if no data. hide all columns. return if (!lib.Any())