@ -345,7 +345,10 @@ namespace Emby.Server.Implementations.Data
// items by name
"create index if not exists idx_ItemValues6 on ItemValues(ItemId,Type,CleanValue)" ,
"create index if not exists idx_ItemValues7 on ItemValues(Type,CleanValue,ItemId)"
"create index if not exists idx_ItemValues7 on ItemValues(Type,CleanValue,ItemId)" ,
// Used to update inherited tags
"create index if not exists idx_ItemValues8 on ItemValues(Type, ItemId, Value)" ,
} ;
connection . RunQueries ( postQueries ) ;
@ -1293,16 +1296,13 @@ namespace Emby.Server.Implementations.Data
return false ;
}
if ( _config. Configuration . SkipDeserializationForAudio )
if ( type = = typeof ( Audio ) )
{
if ( type = = typeof ( Audio ) )
{
return false ;
}
if ( type = = typeof ( MusicAlbum ) )
{
return false ;
}
return false ;
}
if ( type = = typeof ( MusicAlbum ) )
{
return false ;
}
return true ;
@ -4695,41 +4695,65 @@ namespace Emby.Server.Implementations.Data
private async Task UpdateInheritedTags ( CancellationToken cancellationToken )
{
var newValues = new List < Tuple < Guid , string >> ( ) ;
var newValues = new List < Tuple < Guid , string [] >> ( ) ;
var commandText = "select Guid,(select group_concat(Tags, '|') from TypedBaseItems where (guid=outer.guid) OR (guid in (Select AncestorId from AncestorIds where ItemId=Outer.guid))) as NewInheritedTags from typedbaseitems as Outer" ;
var commandText = @ "select guid,
( select group_concat ( Value , '|' ) from ItemValues where ( ItemValues . ItemId = Outer . Guid OR ItemValues . ItemId in ( ( Select AncestorId from AncestorIds where AncestorIds . ItemId = Outer . guid ) ) ) and ItemValues . Type = 4 ) NewInheritedTags ,
( select group_concat ( Value , '|' ) from ItemValues where ItemValues . ItemId = Outer . Guid and ItemValues . Type = 6 ) CurrentInheritedTags
from typedbaseitems as Outer
where ( NewInheritedTags < > CurrentInheritedTags or ( NewInheritedTags is null ) < > ( CurrentInheritedTags is null ) )
limit 100 ";
using ( WriteLock . Write ( ) )
{
using ( var connection = CreateConnection ( ) )
{
foreach ( var row in connection . Query ( commandText ) )
connection . RunInTransaction ( db = >
{
var id = row . GetGuid ( 0 ) ;
string value = row . IsDBNull ( 2 ) ? null : row . GetString ( 2 ) ;
foreach ( var row in connection . Query ( commandText ) )
{
var id = row . GetGuid ( 0 ) ;
string value = row . IsDBNull ( 1 ) ? null : row . GetString ( 1 ) ;
newValues . Add ( new Tuple < Guid , string > ( id , value ) ) ;
}
var valuesArray = string . IsNullOrWhiteSpace ( value ) ? new string [ ] { } : value . Split ( new [ ] { '|' } , StringSplitOptions . RemoveEmptyEntries ) ;
Logger . Debug ( "UpdateInheritedTags - {0} rows" , newValues . Count ) ;
if ( newValues . Count = = 0 )
{
return ;
}
newValues . Add ( new Tuple < Guid , string [ ] > ( id , valuesArray ) ) ;
}
// write lock here
using ( var statement = PrepareStatement ( connection , "Update TypedBaseItems set InheritedTags=@InheritedTags where Guid=@Guid" ) )
{
foreach ( var item in newValues )
Logger . Debug ( "UpdateInheritedTags - {0} rows" , newValues . Count ) ;
if ( newValues . Count = = 0 )
{
var paramList = new List < object > ( ) ;
return ;
}
using ( var insertStatement = PrepareStatement ( connection , "insert into ItemValues (ItemId, Type, Value, CleanValue) values (@ItemId, 6, @Value, @CleanValue)" ) )
{
using ( var deleteStatement = PrepareStatement ( connection , "delete from ItemValues where ItemId=@ItemId and Type=6" ) )
{
foreach ( var item in newValues )
{
var guidBlob = item . Item1 . ToGuidBlob ( ) ;
paramList . Add ( item . Item1 ) ;
paramList . Add ( item . Item2 ) ;
deleteStatement . Reset ( ) ;
deleteStatement . TryBind ( "@ItemId" , guidBlob ) ;
deleteStatement . MoveNext ( ) ;
statement . Execute ( paramList . ToArray ( ) ) ;
foreach ( var itemValue in item . Item2 )
{
insertStatement . Reset ( ) ;
insertStatement . TryBind ( "@ItemId" , guidBlob ) ;
insertStatement . TryBind ( "@Value" , itemValue ) ;
insertStatement . TryBind ( "@CleanValue" , GetCleanValue ( itemValue ) ) ;
insertStatement . MoveNext ( ) ;
}
}
}
}
}
} , TransactionMode ) ;
}
}
}
@ -5458,8 +5482,10 @@ namespace Emby.Server.Implementations.Data
CheckDisposed ( ) ;
var guidBlob = itemId . ToGuidBlob ( ) ;
// First delete
db . Execute ( "delete from ItemValues where ItemId=@Id" , itemId . ToGuidBlob ( ) ) ;
db . Execute ( "delete from ItemValues where ItemId=@Id" , guidBlob ) ;
using ( var statement = PrepareStatement ( db , "insert into ItemValues (ItemId, Type, Value, CleanValue) values (@ItemId, @Type, @Value, @CleanValue)" ) )
{
@ -5475,7 +5501,7 @@ namespace Emby.Server.Implementations.Data
statement . Reset ( ) ;
statement . TryBind ( "@ItemId" , itemId. ToGuidBlob ( ) ) ;
statement . TryBind ( "@ItemId" , guidBlob ) ;
statement . TryBind ( "@Type" , pair . Item1 ) ;
statement . TryBind ( "@Value" , itemValue ) ;