|
@@ -22,13 +22,10 @@ using MediaBrowser.Controller.Persistence;
|
|
using MediaBrowser.Controller.Playlists;
|
|
using MediaBrowser.Controller.Playlists;
|
|
using MediaBrowser.Model.Dto;
|
|
using MediaBrowser.Model.Dto;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Model.Entities;
|
|
-using MediaBrowser.Model.IO;
|
|
|
|
using MediaBrowser.Model.LiveTv;
|
|
using MediaBrowser.Model.LiveTv;
|
|
using MediaBrowser.Model.Querying;
|
|
using MediaBrowser.Model.Querying;
|
|
using MediaBrowser.Model.Reflection;
|
|
using MediaBrowser.Model.Reflection;
|
|
using MediaBrowser.Model.Serialization;
|
|
using MediaBrowser.Model.Serialization;
|
|
-using MediaBrowser.Model.System;
|
|
|
|
-using MediaBrowser.Model.Threading;
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Logging;
|
|
using SQLitePCL.pretty;
|
|
using SQLitePCL.pretty;
|
|
|
|
|
|
@@ -316,8 +313,6 @@ namespace Emby.Server.Implementations.Data
|
|
};
|
|
};
|
|
|
|
|
|
connection.RunQueries(postQueries);
|
|
connection.RunQueries(postQueries);
|
|
-
|
|
|
|
- //await Vacuum(_connection).ConfigureAwait(false);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
userDataRepo.Initialize(WriteLock, _connection, userManager);
|
|
userDataRepo.Initialize(WriteLock, _connection, userManager);
|
|
@@ -623,39 +618,35 @@ namespace Emby.Server.Implementations.Data
|
|
{
|
|
{
|
|
GetSaveItemCommandText(),
|
|
GetSaveItemCommandText(),
|
|
"delete from AncestorIds where ItemId=@ItemId"
|
|
"delete from AncestorIds where ItemId=@ItemId"
|
|
-
|
|
|
|
});
|
|
});
|
|
|
|
|
|
using (var saveItemStatement = statements[0])
|
|
using (var saveItemStatement = statements[0])
|
|
|
|
+ using (var deleteAncestorsStatement = statements[1])
|
|
{
|
|
{
|
|
- using (var deleteAncestorsStatement = statements[1])
|
|
|
|
|
|
+ var requiresReset = false;
|
|
|
|
+ foreach (var tuple in tuples)
|
|
{
|
|
{
|
|
- var requiresReset = false;
|
|
|
|
- foreach (var tuple in tuples)
|
|
|
|
|
|
+ if (requiresReset)
|
|
{
|
|
{
|
|
- if (requiresReset)
|
|
|
|
- {
|
|
|
|
- saveItemStatement.Reset();
|
|
|
|
- }
|
|
|
|
|
|
+ saveItemStatement.Reset();
|
|
|
|
+ }
|
|
|
|
|
|
- var item = tuple.Item1;
|
|
|
|
- var topParent = tuple.Item3;
|
|
|
|
- var userDataKey = tuple.Item4;
|
|
|
|
|
|
+ var item = tuple.Item1;
|
|
|
|
+ var topParent = tuple.Item3;
|
|
|
|
+ var userDataKey = tuple.Item4;
|
|
|
|
|
|
- SaveItem(item, topParent, userDataKey, saveItemStatement);
|
|
|
|
- //logger.LogDebug(_saveItemCommand.CommandText);
|
|
|
|
|
|
+ SaveItem(item, topParent, userDataKey, saveItemStatement);
|
|
|
|
|
|
- var inheritedTags = tuple.Item5;
|
|
|
|
|
|
+ var inheritedTags = tuple.Item5;
|
|
|
|
|
|
- if (item.SupportsAncestors)
|
|
|
|
- {
|
|
|
|
- UpdateAncestors(item.Id, tuple.Item2, db, deleteAncestorsStatement);
|
|
|
|
- }
|
|
|
|
|
|
+ if (item.SupportsAncestors)
|
|
|
|
+ {
|
|
|
|
+ UpdateAncestors(item.Id, tuple.Item2, db, deleteAncestorsStatement);
|
|
|
|
+ }
|
|
|
|
|
|
- UpdateItemValues(item.Id, GetItemValuesToSave(item, inheritedTags), db);
|
|
|
|
|
|
+ UpdateItemValues(item.Id, GetItemValuesToSave(item, inheritedTags), db);
|
|
|
|
|
|
- requiresReset = true;
|
|
|
|
- }
|
|
|
|
|
|
+ requiresReset = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -989,8 +980,7 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
|
|
|
|
string artists = null;
|
|
string artists = null;
|
|
- if (item is IHasArtist hasArtists
|
|
|
|
- && hasArtists.Artists.Length > 0)
|
|
|
|
|
|
+ if (item is IHasArtist hasArtists && hasArtists.Artists.Length > 0)
|
|
{
|
|
{
|
|
artists = string.Join("|", hasArtists.Artists);
|
|
artists = string.Join("|", hasArtists.Artists);
|
|
}
|
|
}
|
|
@@ -1032,7 +1022,8 @@ namespace Emby.Server.Implementations.Data
|
|
StringBuilder str = new StringBuilder();
|
|
StringBuilder str = new StringBuilder();
|
|
foreach (var i in item.ProviderIds)
|
|
foreach (var i in item.ProviderIds)
|
|
{
|
|
{
|
|
- // Ideally we shouldn't need this IsNullOrWhiteSpace check but we're seeing some cases of bad data slip through
|
|
|
|
|
|
+ // Ideally we shouldn't need this IsNullOrWhiteSpace check,
|
|
|
|
+ // but we're seeing some cases of bad data slip through
|
|
if (string.IsNullOrWhiteSpace(i.Value))
|
|
if (string.IsNullOrWhiteSpace(i.Value))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
@@ -1082,7 +1073,7 @@ namespace Emby.Server.Implementations.Data
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
StringBuilder str = new StringBuilder();
|
|
StringBuilder str = new StringBuilder();
|
|
- foreach(var i in images)
|
|
|
|
|
|
+ foreach (var i in images)
|
|
{
|
|
{
|
|
if (string.IsNullOrWhiteSpace(i.Path))
|
|
if (string.IsNullOrWhiteSpace(i.Path))
|
|
{
|
|
{
|
|
@@ -1194,7 +1185,7 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
|
|
|
|
CheckDisposed();
|
|
CheckDisposed();
|
|
- //logger.LogInformation("Retrieving item {0}", id.ToString("N"));
|
|
|
|
|
|
+
|
|
using (WriteLock.Read())
|
|
using (WriteLock.Read())
|
|
{
|
|
{
|
|
using (var connection = CreateConnection(true))
|
|
using (var connection = CreateConnection(true))
|
|
@@ -2253,7 +2244,7 @@ namespace Emby.Server.Implementations.Data
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- return query.IncludeItemTypes.Contains("Episode", StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
|
+ return query.IncludeItemTypes.Contains("Episode", StringComparer.OrdinalIgnoreCase);
|
|
}
|
|
}
|
|
|
|
|
|
private bool HasTrailerTypes(InternalItemsQuery query)
|
|
private bool HasTrailerTypes(InternalItemsQuery query)
|
|
@@ -2411,7 +2402,6 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
if (item.ProductionYear.HasValue)
|
|
if (item.ProductionYear.HasValue)
|
|
{
|
|
{
|
|
- //builder.Append("+ ((ProductionYear=@ItemProductionYear) * 10)");
|
|
|
|
builder.Append("+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 10 Then 10 Else 0 End )");
|
|
builder.Append("+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 10 Then 10 Else 0 End )");
|
|
builder.Append("+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 5 Then 5 Else 0 End )");
|
|
builder.Append("+(Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 5 Then 5 Else 0 End )");
|
|
}
|
|
}
|
|
@@ -2419,12 +2409,6 @@ namespace Emby.Server.Implementations.Data
|
|
//// genres, tags
|
|
//// genres, tags
|
|
builder.Append("+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId)) * 10)");
|
|
builder.Append("+ ((Select count(CleanValue) from ItemValues where ItemId=Guid and CleanValue in (select CleanValue from itemvalues where ItemId=@SimilarItemId)) * 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(Name) from People where ItemId=Guid and Name in (select Name from People where ItemId=@SimilarItemId)) * 3)");
|
|
|
|
-
|
|
|
|
- //builder.Append("(select group_concat((Select Name from People where ItemId=Guid and Name in (Select Name from People where ItemId=@SimilarItemId)), '|'))");
|
|
|
|
-
|
|
|
|
builder.Append(") as SimilarityScore");
|
|
builder.Append(") as SimilarityScore");
|
|
|
|
|
|
list.Add(builder.ToString());
|
|
list.Add(builder.ToString());
|
|
@@ -2572,8 +2556,6 @@ namespace Emby.Server.Implementations.Data
|
|
commandText += " where " + string.Join(" AND ", whereClauses);
|
|
commandText += " where " + string.Join(" AND ", whereClauses);
|
|
}
|
|
}
|
|
|
|
|
|
- //commandText += GetGroupBy(query);
|
|
|
|
-
|
|
|
|
using (WriteLock.Read())
|
|
using (WriteLock.Read())
|
|
{
|
|
{
|
|
using (var connection = CreateConnection(true))
|
|
using (var connection = CreateConnection(true))
|
|
@@ -2949,7 +2931,6 @@ namespace Emby.Server.Implementations.Data
|
|
{
|
|
{
|
|
orderBy.Add(new ValueTuple<string, SortOrder>("SimilarityScore", SortOrder.Descending));
|
|
orderBy.Add(new ValueTuple<string, SortOrder>("SimilarityScore", SortOrder.Descending));
|
|
orderBy.Add(new ValueTuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
|
orderBy.Add(new ValueTuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
|
- //orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if (!string.IsNullOrEmpty(query.SearchTerm))
|
|
if (!string.IsNullOrEmpty(query.SearchTerm))
|
|
@@ -3011,7 +2992,6 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
else if (string.Equals(name, ItemSortBy.IsFavoriteOrLiked, StringComparison.OrdinalIgnoreCase))
|
|
else if (string.Equals(name, ItemSortBy.IsFavoriteOrLiked, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
{
|
|
- // (Select Case When Abs(COALESCE(ProductionYear, 0) - @ItemProductionYear) < 10 Then 2 Else 0 End )
|
|
|
|
return ("(Select Case When IsFavorite is null Then 0 Else IsFavorite End )", true);
|
|
return ("(Select Case When IsFavorite is null Then 0 Else IsFavorite End )", true);
|
|
}
|
|
}
|
|
else if (string.Equals(name, ItemSortBy.IsFolder, StringComparison.OrdinalIgnoreCase))
|
|
else if (string.Equals(name, ItemSortBy.IsFolder, StringComparison.OrdinalIgnoreCase))
|
|
@@ -3384,14 +3364,6 @@ namespace Emby.Server.Implementations.Data
|
|
query.IsVirtualItem = false;
|
|
query.IsVirtualItem = false;
|
|
}
|
|
}
|
|
|
|
|
|
- var whereClauses = new List<string>();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- if (EnableJoinUserData(query))
|
|
|
|
- {
|
|
|
|
- whereClauses.Add("(UserId is null or UserId=@UserId)");
|
|
|
|
- }*/
|
|
|
|
-
|
|
|
|
var minWidth = query.MinWidth;
|
|
var minWidth = query.MinWidth;
|
|
var maxWidth = query.MaxWidth;
|
|
var maxWidth = query.MaxWidth;
|
|
|
|
|
|
@@ -3421,6 +3393,8 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var whereClauses = new List<string>();
|
|
|
|
+
|
|
if (minWidth.HasValue)
|
|
if (minWidth.HasValue)
|
|
{
|
|
{
|
|
whereClauses.Add("Width>=@MinWidth");
|
|
whereClauses.Add("Width>=@MinWidth");
|
|
@@ -3466,43 +3440,6 @@ namespace Emby.Server.Implementations.Data
|
|
var tags = query.Tags.ToList();
|
|
var tags = query.Tags.ToList();
|
|
var excludeTags = query.ExcludeTags.ToList();
|
|
var excludeTags = query.ExcludeTags.ToList();
|
|
|
|
|
|
- //if (!(query.IsMovie ?? true) || !(query.IsSeries ?? true))
|
|
|
|
- //{
|
|
|
|
- // if (query.IsMovie.HasValue)
|
|
|
|
- // {
|
|
|
|
- // var alternateTypes = new List<string>();
|
|
|
|
- // if (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(typeof(Movie).Name))
|
|
|
|
- // {
|
|
|
|
- // alternateTypes.Add(typeof(Movie).FullName);
|
|
|
|
- // }
|
|
|
|
- // if (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(typeof(Trailer).Name))
|
|
|
|
- // {
|
|
|
|
- // alternateTypes.Add(typeof(Trailer).FullName);
|
|
|
|
- // }
|
|
|
|
-
|
|
|
|
- // if (alternateTypes.Count == 0)
|
|
|
|
- // {
|
|
|
|
- // whereClauses.Add("IsMovie=@IsMovie");
|
|
|
|
- // if (statement != null)
|
|
|
|
- // {
|
|
|
|
- // statement.TryBind("@IsMovie", query.IsMovie);
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // else
|
|
|
|
- // {
|
|
|
|
- // whereClauses.Add("(IsMovie is null OR IsMovie=@IsMovie)");
|
|
|
|
- // if (statement != null)
|
|
|
|
- // {
|
|
|
|
- // statement.TryBind("@IsMovie", query.IsMovie);
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- //}
|
|
|
|
- //else
|
|
|
|
- //{
|
|
|
|
-
|
|
|
|
- //}
|
|
|
|
-
|
|
|
|
if (query.IsMovie ?? false)
|
|
if (query.IsMovie ?? false)
|
|
{
|
|
{
|
|
var alternateTypes = new List<string>();
|
|
var alternateTypes = new List<string>();
|
|
@@ -3664,7 +3601,6 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(query.Path))
|
|
if (!string.IsNullOrWhiteSpace(query.Path))
|
|
{
|
|
{
|
|
- //whereClauses.Add("(Path=@Path COLLATE NOCASE)");
|
|
|
|
whereClauses.Add("Path=@Path");
|
|
whereClauses.Add("Path=@Path");
|
|
if (statement != null)
|
|
if (statement != null)
|
|
{
|
|
{
|
|
@@ -3726,18 +3662,6 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- //if (query.MinPlayers.HasValue)
|
|
|
|
- //{
|
|
|
|
- // whereClauses.Add("Players>=@MinPlayers");
|
|
|
|
- // cmd.Parameters.Add(cmd, "@MinPlayers", DbType.Int32).Value = query.MinPlayers.Value;
|
|
|
|
- //}
|
|
|
|
-
|
|
|
|
- //if (query.MaxPlayers.HasValue)
|
|
|
|
- //{
|
|
|
|
- // whereClauses.Add("Players<=@MaxPlayers");
|
|
|
|
- // cmd.Parameters.Add(cmd, "@MaxPlayers", DbType.Int32).Value = query.MaxPlayers.Value;
|
|
|
|
- //}
|
|
|
|
-
|
|
|
|
if (query.IndexNumber.HasValue)
|
|
if (query.IndexNumber.HasValue)
|
|
{
|
|
{
|
|
whereClauses.Add("IndexNumber=@IndexNumber");
|
|
whereClauses.Add("IndexNumber=@IndexNumber");
|
|
@@ -4547,7 +4471,6 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
|
|
|
|
var paramName = "@ExcludeProviderId" + index;
|
|
var paramName = "@ExcludeProviderId" + index;
|
|
- //excludeIds.Add("(COALESCE((select value from ProviderIds where ItemId=Guid and Name = '" + pair.Key + "'), '') <> " + paramName + ")");
|
|
|
|
excludeIds.Add("(ProviderIds is null or ProviderIds not like " + paramName + ")");
|
|
excludeIds.Add("(ProviderIds is null or ProviderIds not like " + paramName + ")");
|
|
if (statement != null)
|
|
if (statement != null)
|
|
{
|
|
{
|
|
@@ -5457,8 +5380,6 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
|
|
|
|
|
itemCountColumnQuery += typeWhereText;
|
|
itemCountColumnQuery += typeWhereText;
|
|
|
|
|
|
- //itemCountColumnQuery += ")";
|
|
|
|
-
|
|
|
|
itemCountColumns = new Dictionary<string, string>()
|
|
itemCountColumns = new Dictionary<string, string>()
|
|
{
|
|
{
|
|
{ "itemTypes", "(" + itemCountColumnQuery + ") as itemTypes"}
|
|
{ "itemTypes", "(" + itemCountColumnQuery + ") as itemTypes"}
|