aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs91
1 files changed, 58 insertions, 33 deletions
diff --git a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
index b11a3e496..4235f6073 100644
--- a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs
@@ -142,52 +142,77 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
- private async Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
+ private Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
{
- var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
+ return UpdateToLatestSchema(0, 0, null, cancellationToken, progress);
+ }
+
+ private async Task UpdateToLatestSchema(int queryStartIndex, int progressStartIndex, int? totalRecordCount, CancellationToken cancellationToken, IProgress<double> progress)
+ {
+ IEnumerable<BaseItem> items;
+ int numItemsToSave;
+ var pageSize = 2000;
+
+ if (totalRecordCount.HasValue)
{
- IsCurrentSchema = false,
- ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name }
- });
+ var list = _libraryManager.GetItemList(new InternalItemsQuery
+ {
+ IsCurrentSchema = false,
+ ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
+ StartIndex = queryStartIndex,
+ Limit = pageSize
- var numComplete = 0;
- var numItems = itemIds.Count;
+ }).ToList();
+
+ items = list;
+ numItemsToSave = list.Count;
+ }
+ else
+ {
+ var itemsResult = _libraryManager.GetItemsResult(new InternalItemsQuery
+ {
+ IsCurrentSchema = false,
+ ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
+ StartIndex = queryStartIndex,
+ Limit = pageSize
+ });
+
+ totalRecordCount = itemsResult.TotalRecordCount;
+ items = itemsResult.Items;
+ numItemsToSave = itemsResult.Items.Length;
+ }
+
+ var numItems = totalRecordCount.Value;
_logger.Debug("Upgrading schema for {0} items", numItems);
- foreach (var itemId in itemIds)
+ if (numItemsToSave > 0)
{
- cancellationToken.ThrowIfCancellationRequested();
-
- if (itemId != Guid.Empty)
+ try
{
- // Somehow some invalid data got into the db. It probably predates the boundary checking
- var item = _libraryManager.GetItemById(itemId);
-
- if (item != null)
- {
- try
- {
- await _itemRepo.SaveItem(item, cancellationToken).ConfigureAwait(false);
- }
- catch (OperationCanceledException)
- {
- throw;
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error saving item", ex);
- }
- }
+ await _itemRepo.SaveItems(items, cancellationToken).ConfigureAwait(false);
+ }
+ catch (OperationCanceledException)
+ {
+ throw;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error saving item", ex);
}
- numComplete++;
- double percent = numComplete;
+ progressStartIndex += pageSize;
+ double percent = progressStartIndex;
percent /= numItems;
progress.Report(percent * 100);
- }
- progress.Report(100);
+ var newStartIndex = queryStartIndex + (pageSize - numItemsToSave);
+ await UpdateToLatestSchema(newStartIndex, progressStartIndex, totalRecordCount, cancellationToken, progress).ConfigureAwait(false);
+ }
+ else
+ {
+ progress.Report(100);
+ }
}
private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)