Merge pull request #891 from Bond-009/postsan

Reduce the amount of db calls during the post scan event
This commit is contained in:
Joshua M. Boniface 2019-02-27 00:31:48 -05:00 committed by GitHub
commit aea7edf0fa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -35,64 +35,52 @@ namespace Emby.Server.Implementations.Channels
public static string GetUserDistinctValue(User user) public static string GetUserDistinctValue(User user)
{ {
var channels = user.Policy.EnabledChannels var channels = user.Policy.EnabledChannels
.OrderBy(i => i) .OrderBy(i => i);
.ToList();
return string.Join("|", channels.ToArray()); return string.Join("|", channels);
} }
private void CleanDatabase(CancellationToken cancellationToken) private void CleanDatabase(CancellationToken cancellationToken)
{ {
var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds(); var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds();
var databaseIds = _libraryManager.GetItemIds(new InternalItemsQuery var uninstalledChannels = _libraryManager.GetItemList(new InternalItemsQuery
{ {
IncludeItemTypes = new[] { typeof(Channel).Name } IncludeItemTypes = new[] { typeof(Channel).Name },
ExcludeItemIds = installedChannelIds.ToArray()
}); });
var invalidIds = databaseIds foreach (var channel in uninstalledChannels)
.Except(installedChannelIds)
.ToList();
foreach (var id in invalidIds)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
CleanChannel(id, cancellationToken); CleanChannel((Channel)channel, cancellationToken);
} }
} }
private void CleanChannel(Guid id, CancellationToken cancellationToken) private void CleanChannel(Channel channel, CancellationToken cancellationToken)
{ {
_logger.LogInformation("Cleaning channel {0} from database", id); _logger.LogInformation("Cleaning channel {0} from database", channel.Id);
// Delete all channel items // Delete all channel items
var allIds = _libraryManager.GetItemIds(new InternalItemsQuery var items = _libraryManager.GetItemList(new InternalItemsQuery
{ {
ChannelIds = new[] { id } ChannelIds = new[] { channel.Id }
}); });
foreach (var deleteId in allIds) foreach (var item in items)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
DeleteItem(deleteId); _libraryManager.DeleteItem(item, new DeleteOptions
{
DeleteFileLocation = false
}, false);
} }
// Finally, delete the channel itself // Finally, delete the channel itself
DeleteItem(id); _libraryManager.DeleteItem(channel, new DeleteOptions
}
private void DeleteItem(Guid id)
{
var item = _libraryManager.GetItemById(id);
if (item == null)
{
return;
}
_libraryManager.DeleteItem(item, new DeleteOptions
{ {
DeleteFileLocation = false DeleteFileLocation = false