@ -105,13 +105,7 @@ namespace Emby.Server.Implementations.Data
{
get
{
var cacheSize = _config . Configuration . SqliteCacheSize ;
if ( cacheSize < = 0 )
{
cacheSize = Math . Min ( Environment . ProcessorCount * 50000 , 100000 ) ;
}
return 0 - cacheSize ;
return 20000 ;
}
}
@ -328,6 +322,8 @@ namespace Emby.Server.Implementations.Data
"drop table if exists Images" ,
"drop index if exists idx_Images" ,
"drop index if exists idx_TypeSeriesPresentationUniqueKey" ,
"drop index if exists idx_SeriesPresentationUniqueKey" ,
"drop index if exists idx_TypeSeriesPresentationUniqueKey2" ,
"create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)" ,
"create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)" ,
@ -343,8 +339,9 @@ namespace Emby.Server.Implementations.Data
// series
"create index if not exists idx_TypeSeriesPresentationUniqueKey1 on TypedBaseItems(Type,SeriesPresentationUniqueKey,PresentationUniqueKey,SortName)" ,
// series next up
"create index if not exists idx_SeriesPresentationUniqueKey on TypedBaseItems(SeriesPresentationUniqueKey)" ,
// series counts
// seriesdateplayed sort order
"create index if not exists idx_TypeSeriesPresentationUniqueKey3 on TypedBaseItems(SeriesPresentationUniqueKey,Type,IsFolder,IsVirtualItem)" ,
// live tv programs
"create index if not exists idx_TypeTopParentIdStartDate on TypedBaseItems(Type,TopParentId,StartDate)" ,
@ -373,9 +370,9 @@ namespace Emby.Server.Implementations.Data
//await Vacuum(_connection).ConfigureAwait(false);
}
userDataRepo . Initialize ( WriteLock );
userDataRepo . Initialize ( WriteLock , _connection );
_shrinkMemoryTimer = _timerFactory . Create ( OnShrinkMemoryTimerCallback , null , TimeSpan . FromMinutes ( 1 ) , TimeSpan . FromMinutes ( 30 ) ) ;
_shrinkMemoryTimer = _timerFactory . Create ( OnShrinkMemoryTimerCallback , null , TimeSpan . FromMinutes ( 1 ) , TimeSpan . FromMinutes ( 15 ) ) ;
}
private void OnShrinkMemoryTimerCallback ( object state )
@ -698,12 +695,12 @@ namespace Emby.Server.Implementations.Data
{
var requiresReset = false ;
var statements = PrepareAll ( db , string . Join ( ";" , new string [ ]
var statements = PrepareAll Safe ( db , new string [ ]
{
GetSaveItemCommandText ( ) ,
"delete from AncestorIds where ItemId=@ItemId" ,
"insert into AncestorIds (ItemId, AncestorId, AncestorIdText) values (@ItemId, @AncestorId, @AncestorIdText)"
} ) ) .ToList ( ) ;
} ) .ToList ( ) ;
using ( var saveItemStatement = statements [ 0 ] )
{
@ -1264,9 +1261,10 @@ namespace Emby.Server.Implementations.Data
return GetItem ( row ) ;
}
}
return null ;
}
}
return null ;
}
private BaseItem GetItem ( IReadOnlyList < IResultSetValue > reader )
@ -2079,12 +2077,12 @@ namespace Emby.Server.Implementations.Data
throw new ArgumentNullException ( "id" ) ;
}
var list = new List < ChapterInfo > ( ) ;
using ( WriteLock . Read ( ) )
{
using ( var connection = CreateConnection ( true ) )
{
var list = new List < ChapterInfo > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , "select StartPositionTicks,Name,ImagePath,ImageDateModified from " + ChaptersTableName + " where ItemId = @ItemId order by ChapterIndex asc" ) )
{
statement . TryBind ( "@ItemId" , id ) ;
@ -2094,10 +2092,10 @@ namespace Emby.Server.Implementations.Data
list . Add ( GetChapter ( row ) ) ;
}
}
return list ;
}
}
return list ;
}
/// <summary>
@ -2240,7 +2238,7 @@ namespace Emby.Server.Implementations.Data
if ( query . SimilarTo ! = null & & query . User ! = null )
{
return true ;
//return true ;
}
var sortingFields = query . SortBy . ToList ( ) ;
@ -2369,15 +2367,10 @@ namespace Emby.Server.Implementations.Data
builder . Append ( "+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 10 Then 2 Else 0 End )" ) ;
builder . Append ( "+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 5 Then 2 Else 0 End )" ) ;
//// genres
builder . Append ( "+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type=2 and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and type=2)) * 10)" ) ;
//// tags
builder . Append ( "+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type=4 and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and type=4)) * 10)" ) ;
builder . Append ( "+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type=5 and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and type=5)) * 10)" ) ;
//// genres, tags
builder . Append ( "+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type in (2,3,4,5) and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and Type in (2,3,4,5))) * 10)" ) ;
builder . Append ( "+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type=3 and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and type=3)) * 3)" ) ;
//builder.Append("+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and Type=3 and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId and type=3)) * 3)");
//builder.Append("+ ((Select count(Name) from People where ItemId=Guid and Name in (select Name from People where ItemId=@SimilarItemId)) * 3)");
@ -2475,8 +2468,6 @@ namespace Emby.Server.Implementations.Data
//commandText += GetGroupBy(query);
int count = 0 ;
using ( WriteLock . Read ( ) )
{
using ( var connection = CreateConnection ( true ) )
@ -2493,14 +2484,13 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses ( query , statement ) ;
count = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
var count = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
LogQueryTime ( "GetCount" , commandText , now ) ;
return count ;
}
}
LogQueryTime ( "GetCount" , commandText , now ) ;
}
return count ;
}
public List < BaseItem > GetItemList ( InternalItemsQuery query )
@ -2516,8 +2506,6 @@ namespace Emby.Server.Implementations.Data
var now = DateTime . UtcNow ;
var list = new List < BaseItem > ( ) ;
// Hack for right now since we currently don't support filtering out these duplicates within a query
if ( query . Limit . HasValue & & query . EnableGroupByMetadataKey )
{
@ -2558,53 +2546,59 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
using ( var statement = PrepareStatementSafe ( connection , commandText ) )
return connection . RunInTransaction ( db = >
{
if ( EnableJoinUserData ( query ) )
var list = new List < BaseItem > ( ) ;
using ( var statement = PrepareStatementSafe ( db , commandText ) )
{
statement . TryBind ( "@UserId" , query . User . Id ) ;
}
if ( EnableJoinUserData ( query ) )
{
statement . TryBind ( "@UserId" , query . User . Id ) ;
}
BindSimilarParams ( query , statement ) ;
BindSimilarParams ( query , statement ) ;
// Running this again will bind the params
GetWhereClauses ( query , statement ) ;
// Running this again will bind the params
GetWhereClauses ( query , statement ) ;
foreach ( var row in statement . ExecuteQuery ( ) )
{
var item = GetItem ( row , query ) ;
if ( item ! = null )
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( item ) ;
var item = GetItem ( row , query ) ;
if ( item ! = null )
{
list . Add ( item ) ;
}
}
}
}
}
LogQueryTime ( "GetItemList" , commandText , now ) ;
}
// Hack for right now since we currently don't support filtering out these duplicates within a query
if ( query . EnableGroupByMetadataKey )
{
var limit = query . Limit ? ? int . MaxValue ;
limit - = 4 ;
var newList = new List < BaseItem > ( ) ;
// Hack for right now since we currently don't support filtering out these duplicates within a query
if ( query . EnableGroupByMetadataKey )
{
var limit = query . Limit ? ? int . MaxValue ;
limit - = 4 ;
var newList = new List < BaseItem > ( ) ;
foreach ( var item in list )
{
AddItem ( newList , item ) ;
foreach ( var item in list )
{
AddItem ( newList , item ) ;
if ( newList . Count > = limit )
{
break ;
}
}
if ( newList . Count > = limit )
{
break ;
}
}
list = newList ;
}
list = newList ;
}
LogQueryTime ( "GetItemList" , commandText , now ) ;
return list ;
return list ;
} , ReadTransactionMode ) ;
}
}
}
private void AddItem ( List < BaseItem > items , BaseItem newItem )
@ -2642,7 +2636,7 @@ namespace Emby.Server.Implementations.Data
var slowThreshold = 1000 ;
#if DEBUG
slowThreshold = 50 ;
slowThreshold = 2 ;
# endif
if ( elapsed > = slowThreshold )
@ -2723,7 +2717,6 @@ namespace Emby.Server.Implementations.Data
}
}
var result = new QueryResult < BaseItem > ( ) ;
var isReturningZeroItems = query . Limit . HasValue & & query . Limit < = 0 ;
var statementTexts = new List < string > ( ) ;
@ -2753,9 +2746,10 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
return connection . RunInTransaction ( db = >
{
var statements = PrepareAllSafe ( db , string . Join ( ";" , statementTexts . ToArray ( ) ) )
var result = new QueryResult < BaseItem > ( ) ;
var statements = PrepareAllSafe ( db , statementTexts )
. ToList ( ) ;
if ( ! isReturningZeroItems )
@ -2801,12 +2795,12 @@ namespace Emby.Server.Implementations.Data
}
}
} , ReadTransactionMode ) ;
LogQueryTime ( "GetItems" , commandText , now ) ;
LogQueryTime ( "GetItems" , commandText , now ) ;
result . Items = list . ToArray ( ) ;
return result ;
result . Items = list . ToArray ( ) ;
return result ;
} , ReadTransactionMode ) ;
}
}
}
@ -2967,12 +2961,12 @@ namespace Emby.Server.Implementations.Data
}
}
var list = new List < Guid > ( ) ;
using ( WriteLock . Read ( ) )
{
using ( var connection = CreateConnection ( true ) )
{
var list = new List < Guid > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , commandText ) )
{
if ( EnableJoinUserData ( query ) )
@ -2990,11 +2984,11 @@ namespace Emby.Server.Implementations.Data
list . Add ( row [ 0 ] . ReadGuid ( ) ) ;
}
}
}
LogQueryTime ( "GetItemList" , commandText , now ) ;
LogQueryTime ( "GetItemList" , commandText , now ) ;
return list ;
return list ;
}
}
}
@ -3158,11 +3152,11 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
var result = new QueryResult < Guid > ( ) ;
connection . RunInTransaction ( db = >
return connection . RunInTransaction ( db = >
{
var statements = PrepareAllSafe ( db , string . Join ( ";" , statementTexts . ToArray ( ) ) )
var result = new QueryResult < Guid > ( ) ;
var statements = PrepareAllSafe ( db , statementTexts )
. ToList ( ) ;
if ( ! isReturningZeroItems )
@ -3204,12 +3198,12 @@ namespace Emby.Server.Implementations.Data
}
}
} , ReadTransactionMode ) ;
LogQueryTime ( "GetItemIds" , commandText , now ) ;
LogQueryTime ( "GetItemIds" , commandText , now ) ;
result . Items = list . ToArray ( ) ;
return result ;
result . Items = list . ToArray ( ) ;
return result ;
} , ReadTransactionMode ) ;
}
}
}
@ -4658,26 +4652,23 @@ namespace Emby.Server.Implementations.Data
commandText + = " order by ListOrder" ;
var list = new List < string > ( ) ;
using ( WriteLock . Read ( ) )
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
var list = new List < string > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , commandText ) )
{
using ( var statement = PrepareStatementSafe ( db , commandText ) )
{
// Run this again to bind the params
GetPeopleWhereClauses ( query , statement ) ;
// Run this again to bind the params
GetPeopleWhereClauses ( query , statement ) ;
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( row . GetString ( 0 ) ) ;
}
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( row . GetString ( 0 ) ) ;
}
} , ReadTransactionMode ) ;
}
return list ;
}
return list ;
}
}
@ -4701,29 +4692,26 @@ namespace Emby.Server.Implementations.Data
commandText + = " order by ListOrder" ;
var list = new List < PersonInfo > ( ) ;
using ( WriteLock . Read ( ) )
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
var list = new List < PersonInfo > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , commandText ) )
{
using ( var statement = PrepareStatementSafe ( db , commandText ) )
{
// Run this again to bind the params
GetPeopleWhereClauses ( query , statement ) ;
// Run this again to bind the params
GetPeopleWhereClauses ( query , statement ) ;
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( GetPerson ( row ) ) ;
}
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( GetPerson ( row ) ) ;
}
} , ReadTransactionMode ) ;
}
return list ;
}
}
return list ;
}
private List < string > GetPeopleWhereClauses ( InternalPeopleQuery query , IStatement statement )
@ -4904,8 +4892,6 @@ namespace Emby.Server.Implementations.Data
( "Type=" + itemValueTypes [ 0 ] . ToString ( CultureInfo . InvariantCulture ) ) :
( "Type in (" + string . Join ( "," , itemValueTypes . Select ( i = > i . ToString ( CultureInfo . InvariantCulture ) ) . ToArray ( ) ) + ")" ) ;
var list = new List < string > ( ) ;
var commandText = "Select Value From ItemValues where " + typeClause ;
if ( withItemTypes . Count > 0 )
@ -4925,24 +4911,24 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
var list = new List < string > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , commandText ) )
{
using ( var statement = PrepareStatementSafe ( db , commandText ) )
foreach ( var row in statement . ExecuteQuery ( ) )
{
foreach ( var row in statement . ExecuteQuery ( ) )
if ( ! row . IsDBNull ( 0 ) )
{
if ( ! row . IsDBNull ( 0 ) )
{
list . Add ( row . GetString ( 0 ) ) ;
}
list . Add ( row . GetString ( 0 ) ) ;
}
}
} , ReadTransactionMode ) ;
}
LogQueryTime ( "GetItemValueNames" , commandText , now ) ;
return list ;
}
}
LogQueryTime ( "GetItemValueNames" , commandText , now ) ;
return list ;
}
private QueryResult < Tuple < BaseItem , ItemCounts > > GetItemValues ( InternalItemsQuery query , int [ ] itemValueTypes , string returnType )
@ -5086,9 +5072,6 @@ namespace Emby.Server.Implementations.Data
var isReturningZeroItems = query . Limit . HasValue & & query . Limit < = 0 ;
var list = new List < Tuple < BaseItem , ItemCounts > > ( ) ;
var result = new QueryResult < Tuple < BaseItem , ItemCounts > > ( ) ;
var statementTexts = new List < string > ( ) ;
if ( ! isReturningZeroItems )
{
@ -5107,9 +5090,13 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
return connection . RunInTransaction ( db = >
{
var statements = PrepareAllSafe ( db , string . Join ( ";" , statementTexts . ToArray ( ) ) ) . ToList ( ) ;
var list = new List < Tuple < BaseItem , ItemCounts > > ( ) ;
var result = new QueryResult < Tuple < BaseItem , ItemCounts > > ( ) ;
var statements = PrepareAllSafe ( db , statementTexts )
. ToList ( ) ;
if ( ! isReturningZeroItems )
{
@ -5172,17 +5159,18 @@ namespace Emby.Server.Implementations.Data
LogQueryTime ( "GetItemValues" , commandText , now ) ;
}
}
if ( result . TotalRecordCount = = 0 )
{
result . TotalRecordCount = list . Count ;
}
result . Items = list . ToArray ( ) ;
return result ;
} , ReadTransactionMode ) ;
}
}
if ( result . TotalRecordCount = = 0 )
{
result . TotalRecordCount = list . Count ;
}
result . Items = list . ToArray ( ) ;
return result ;
}
private ItemCounts GetItemCounts ( IReadOnlyList < IResultSetValue > reader , int countStartColumn , List < string > typesToCount )
@ -5395,8 +5383,6 @@ namespace Emby.Server.Implementations.Data
throw new ArgumentNullException ( "query" ) ;
}
var list = new List < MediaStream > ( ) ;
var cmdText = "select " + string . Join ( "," , _mediaStreamSaveColumns ) + " from mediastreams where" ;
cmdText + = " ItemId=@ItemId" ;
@ -5417,32 +5403,31 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
connection . RunInTransaction ( db = >
var list = new List < MediaStream > ( ) ;
using ( var statement = PrepareStatementSafe ( connection , cmdText ) )
{
using ( var statement = PrepareStatementSafe ( db , cmdText ) )
{
statement . TryBind ( "@ItemId" , query . ItemId . ToGuidParamValue ( ) ) ;
statement . TryBind ( "@ItemId" , query . ItemId . ToGuidParamValue ( ) ) ;
if ( query . Type . HasValue )
{
statement . TryBind ( "@StreamType" , query . Type . Value . ToString ( ) ) ;
}
if ( query . Type . HasValue )
{
statement . TryBind ( "@StreamType" , query . Type . Value . ToString ( ) ) ;
}
if ( query . Index . HasValue )
{
statement . TryBind ( "@StreamIndex" , query . Index . Value ) ;
}
if ( query . Index . HasValue )
{
statement . TryBind ( "@StreamIndex" , query . Index . Value ) ;
}
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( GetMediaStream ( row ) ) ;
}
foreach ( var row in statement . ExecuteQuery ( ) )
{
list . Add ( GetMediaStream ( row ) ) ;
}
} , ReadTransactionMode ) ;
}
return list ;
}
}
return list ;
}
public async Task SaveMediaStreams ( Guid id , List < MediaStream > streams , CancellationToken cancellationToken )