@ -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 )