mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-03-14 14:16:35 +00:00
Update StyleCop
This commit is contained in:
@@ -120,7 +120,7 @@ namespace Emby.Server.Implementations
|
||||
/// <summary>
|
||||
/// The disposable parts.
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<IDisposable, byte> _disposableParts = new ();
|
||||
private readonly ConcurrentDictionary<IDisposable, byte> _disposableParts = new();
|
||||
|
||||
private readonly IFileSystem _fileSystemManager;
|
||||
private readonly IConfiguration _startupConfig;
|
||||
|
||||
@@ -160,21 +160,22 @@ namespace Emby.Server.Implementations.Data
|
||||
protected bool TableExists(ManagedConnection connection, string name)
|
||||
{
|
||||
return connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
using (var statement = PrepareStatement(db, "select DISTINCT tbl_name from sqlite_master"))
|
||||
db =>
|
||||
{
|
||||
foreach (var row in statement.ExecuteQuery())
|
||||
using (var statement = PrepareStatement(db, "select DISTINCT tbl_name from sqlite_master"))
|
||||
{
|
||||
if (string.Equals(name, row.GetString(0), StringComparison.OrdinalIgnoreCase))
|
||||
foreach (var row in statement.ExecuteQuery())
|
||||
{
|
||||
return true;
|
||||
if (string.Equals(name, row.GetString(0), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}, ReadTransactionMode);
|
||||
return false;
|
||||
},
|
||||
ReadTransactionMode);
|
||||
}
|
||||
|
||||
protected List<string> GetColumnNames(IDatabaseConnection connection, string table)
|
||||
|
||||
@@ -498,109 +498,110 @@ namespace Emby.Server.Implementations.Data
|
||||
connection.RunQueries(queries);
|
||||
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
var existingColumnNames = GetColumnNames(db, "AncestorIds");
|
||||
AddColumn(db, "AncestorIds", "AncestorIdText", "Text", existingColumnNames);
|
||||
db =>
|
||||
{
|
||||
var existingColumnNames = GetColumnNames(db, "AncestorIds");
|
||||
AddColumn(db, "AncestorIds", "AncestorIdText", "Text", existingColumnNames);
|
||||
|
||||
existingColumnNames = GetColumnNames(db, "TypedBaseItems");
|
||||
existingColumnNames = GetColumnNames(db, "TypedBaseItems");
|
||||
|
||||
AddColumn(db, "TypedBaseItems", "Path", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "StartDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "EndDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ChannelId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsMovie", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CommunityRating", "Float", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CustomRating", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IndexNumber", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsLocked", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Name", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OfficialRating", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "MediaType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Overview", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ParentIndexNumber", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PremiereDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProductionYear", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ParentId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Genres", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "EpisodeTitle", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsRepeat", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PreferredMetadataLanguage", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PreferredMetadataCountryCode", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastRefreshed", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastSaved", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsInMixedFolder", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "LockedFields", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Studios", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Audio", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalServiceId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Tags", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsFolder", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "InheritedParentalRatingValue", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "UnratedType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TopParentId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CriticRating", "Float", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CleanName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OriginalTitle", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PrimaryVersionId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastMediaAdded", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Album", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsVirtualItem", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "UserDataKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeasonName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeasonId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalSeriesId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Tagline", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProviderIds", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Images", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProductionLocations", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExtraIds", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TotalBitrate", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExtraType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Artists", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ShowId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OwnerId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Width", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Height", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Size", "BIGINT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Path", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "StartDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "EndDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ChannelId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsMovie", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CommunityRating", "Float", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CustomRating", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IndexNumber", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsLocked", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Name", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OfficialRating", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "MediaType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Overview", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ParentIndexNumber", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PremiereDate", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProductionYear", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ParentId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Genres", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "EpisodeTitle", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsRepeat", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PreferredMetadataLanguage", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PreferredMetadataCountryCode", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastRefreshed", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastSaved", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsInMixedFolder", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "LockedFields", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Studios", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Audio", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalServiceId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Tags", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsFolder", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "InheritedParentalRatingValue", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "UnratedType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TopParentId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CriticRating", "Float", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "CleanName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OriginalTitle", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "PrimaryVersionId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "DateLastMediaAdded", "DATETIME", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Album", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "IsVirtualItem", "BIT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "UserDataKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeasonName", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeasonId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesId", "GUID", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalSeriesId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Tagline", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProviderIds", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Images", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ProductionLocations", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExtraIds", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "TotalBitrate", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExtraType", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Artists", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "ShowId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "OwnerId", "Text", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Width", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Height", "INT", existingColumnNames);
|
||||
AddColumn(db, "TypedBaseItems", "Size", "BIGINT", existingColumnNames);
|
||||
|
||||
existingColumnNames = GetColumnNames(db, "ItemValues");
|
||||
AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
|
||||
existingColumnNames = GetColumnNames(db, "ItemValues");
|
||||
AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
|
||||
|
||||
existingColumnNames = GetColumnNames(db, ChaptersTableName);
|
||||
AddColumn(db, ChaptersTableName, "ImageDateModified", "DATETIME", existingColumnNames);
|
||||
existingColumnNames = GetColumnNames(db, ChaptersTableName);
|
||||
AddColumn(db, ChaptersTableName, "ImageDateModified", "DATETIME", existingColumnNames);
|
||||
|
||||
existingColumnNames = GetColumnNames(db, "MediaStreams");
|
||||
AddColumn(db, "MediaStreams", "IsAvc", "BIT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "TimeBase", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "CodecTimeBase", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "Title", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "NalLengthSize", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "Comment", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "CodecTag", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "PixelFormat", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "BitDepth", "INT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "RefFrames", "INT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "KeyFrames", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "IsAnamorphic", "BIT", existingColumnNames);
|
||||
existingColumnNames = GetColumnNames(db, "MediaStreams");
|
||||
AddColumn(db, "MediaStreams", "IsAvc", "BIT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "TimeBase", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "CodecTimeBase", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "Title", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "NalLengthSize", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "Comment", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "CodecTag", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "PixelFormat", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "BitDepth", "INT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "RefFrames", "INT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "KeyFrames", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "IsAnamorphic", "BIT", existingColumnNames);
|
||||
|
||||
AddColumn(db, "MediaStreams", "ColorPrimaries", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "ColorSpace", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "ColorTransfer", "TEXT", existingColumnNames);
|
||||
}, TransactionMode);
|
||||
AddColumn(db, "MediaStreams", "ColorPrimaries", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "ColorSpace", "TEXT", existingColumnNames);
|
||||
AddColumn(db, "MediaStreams", "ColorTransfer", "TEXT", existingColumnNames);
|
||||
},
|
||||
TransactionMode);
|
||||
|
||||
connection.RunQueries(postQueries);
|
||||
}
|
||||
@@ -636,16 +637,17 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
using (var saveImagesStatement = PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
|
||||
db =>
|
||||
{
|
||||
saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
|
||||
saveImagesStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
|
||||
using (var saveImagesStatement = PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
|
||||
{
|
||||
saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
|
||||
saveImagesStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
|
||||
|
||||
saveImagesStatement.MoveNext();
|
||||
}
|
||||
}, TransactionMode);
|
||||
saveImagesStatement.MoveNext();
|
||||
}
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -686,10 +688,11 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
SaveItemsInTranscation(db, tuples);
|
||||
}, TransactionMode);
|
||||
db =>
|
||||
{
|
||||
SaveItemsInTranscation(db, tuples);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2134,13 +2137,14 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
// First delete chapters
|
||||
db.Execute("delete from " + ChaptersTableName + " where ItemId=@ItemId", idBlob);
|
||||
db =>
|
||||
{
|
||||
// First delete chapters
|
||||
db.Execute("delete from " + ChaptersTableName + " where ItemId=@ItemId", idBlob);
|
||||
|
||||
InsertChapters(idBlob, chapters, db);
|
||||
}, TransactionMode);
|
||||
InsertChapters(idBlob, chapters, db);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2944,69 +2948,70 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection(true))
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
var itemQueryStatement = PrepareStatement(db, itemQuery);
|
||||
var totalRecordCountQueryStatement = PrepareStatement(db, totalRecordCountQuery);
|
||||
|
||||
if (!isReturningZeroItems)
|
||||
db =>
|
||||
{
|
||||
using (var statement = itemQueryStatement)
|
||||
var itemQueryStatement = PrepareStatement(db, itemQuery);
|
||||
var totalRecordCountQueryStatement = PrepareStatement(db, totalRecordCountQuery);
|
||||
|
||||
if (!isReturningZeroItems)
|
||||
{
|
||||
if (EnableJoinUserData(query))
|
||||
using (var statement = itemQueryStatement)
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
var hasEpisodeAttributes = HasEpisodeAttributes(query);
|
||||
var hasServiceName = HasServiceName(query);
|
||||
var hasProgramAttributes = HasProgramAttributes(query);
|
||||
var hasStartDate = HasStartDate(query);
|
||||
var hasTrailerTypes = HasTrailerTypes(query);
|
||||
var hasArtistFields = HasArtistFields(query);
|
||||
var hasSeriesFields = HasSeriesFields(query);
|
||||
|
||||
foreach (var row in statement.ExecuteQuery())
|
||||
{
|
||||
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
|
||||
if (item != null)
|
||||
if (EnableJoinUserData(query))
|
||||
{
|
||||
list.Add(item);
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
var hasEpisodeAttributes = HasEpisodeAttributes(query);
|
||||
var hasServiceName = HasServiceName(query);
|
||||
var hasProgramAttributes = HasProgramAttributes(query);
|
||||
var hasStartDate = HasStartDate(query);
|
||||
var hasTrailerTypes = HasTrailerTypes(query);
|
||||
var hasArtistFields = HasArtistFields(query);
|
||||
var hasSeriesFields = HasSeriesFields(query);
|
||||
|
||||
foreach (var row in statement.ExecuteQuery())
|
||||
{
|
||||
var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
|
||||
if (item != null)
|
||||
{
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogQueryTime("GetItems.ItemQuery", itemQuery, now);
|
||||
}
|
||||
|
||||
LogQueryTime("GetItems.ItemQuery", itemQuery, now);
|
||||
}
|
||||
|
||||
now = DateTime.UtcNow;
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
using (var statement = totalRecordCountQueryStatement)
|
||||
now = DateTime.UtcNow;
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
if (EnableJoinUserData(query))
|
||||
using (var statement = totalRecordCountQueryStatement)
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
if (EnableJoinUserData(query))
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
||||
LogQueryTime("GetItems.TotalRecordCount", totalRecordCountQuery, now);
|
||||
}
|
||||
|
||||
LogQueryTime("GetItems.TotalRecordCount", totalRecordCountQuery, now);
|
||||
}
|
||||
}, ReadTransactionMode);
|
||||
},
|
||||
ReadTransactionMode);
|
||||
}
|
||||
|
||||
result.Items = list;
|
||||
@@ -3363,51 +3368,52 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection(true))
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
var statements = PrepareAll(db, statementTexts);
|
||||
|
||||
if (!isReturningZeroItems)
|
||||
db =>
|
||||
{
|
||||
using (var statement = statements[0])
|
||||
var statements = PrepareAll(db, statementTexts);
|
||||
|
||||
if (!isReturningZeroItems)
|
||||
{
|
||||
if (EnableJoinUserData(query))
|
||||
using (var statement = statements[0])
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
if (EnableJoinUserData(query))
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(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())
|
||||
{
|
||||
list.Add(row[0].ReadGuidFromBlob());
|
||||
foreach (var row in statement.ExecuteQuery())
|
||||
{
|
||||
list.Add(row[0].ReadGuidFromBlob());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
using (var statement = statements[statements.Length - 1])
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
if (EnableJoinUserData(query))
|
||||
using (var statement = statements[statements.Length - 1])
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
if (EnableJoinUserData(query))
|
||||
{
|
||||
statement.TryBind("@UserId", query.User.InternalId);
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
||||
}
|
||||
|
||||
BindSimilarParams(query, statement);
|
||||
BindSearchParams(query, statement);
|
||||
|
||||
// Running this again will bind the params
|
||||
GetWhereClauses(query, statement);
|
||||
|
||||
result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
||||
}
|
||||
}
|
||||
}, ReadTransactionMode);
|
||||
},
|
||||
ReadTransactionMode);
|
||||
}
|
||||
|
||||
LogQueryTime("GetItemIds", commandText, now);
|
||||
@@ -4954,10 +4960,11 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
connection.ExecuteAll(sql);
|
||||
}, TransactionMode);
|
||||
db =>
|
||||
{
|
||||
connection.ExecuteAll(sql);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4988,28 +4995,29 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
var idBlob = id.ToByteArray();
|
||||
db =>
|
||||
{
|
||||
var idBlob = id.ToByteArray();
|
||||
|
||||
// Delete people
|
||||
ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob);
|
||||
// Delete people
|
||||
ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob);
|
||||
|
||||
// Delete chapters
|
||||
ExecuteWithSingleParam(db, "delete from " + ChaptersTableName + " where ItemId=@Id", idBlob);
|
||||
// Delete chapters
|
||||
ExecuteWithSingleParam(db, "delete from " + ChaptersTableName + " where ItemId=@Id", idBlob);
|
||||
|
||||
// Delete media streams
|
||||
ExecuteWithSingleParam(db, "delete from mediastreams where ItemId=@Id", idBlob);
|
||||
// Delete media streams
|
||||
ExecuteWithSingleParam(db, "delete from mediastreams where ItemId=@Id", idBlob);
|
||||
|
||||
// Delete ancestors
|
||||
ExecuteWithSingleParam(db, "delete from AncestorIds where ItemId=@Id", idBlob);
|
||||
// Delete ancestors
|
||||
ExecuteWithSingleParam(db, "delete from AncestorIds where ItemId=@Id", idBlob);
|
||||
|
||||
// Delete item values
|
||||
ExecuteWithSingleParam(db, "delete from ItemValues where ItemId=@Id", idBlob);
|
||||
// Delete item values
|
||||
ExecuteWithSingleParam(db, "delete from ItemValues where ItemId=@Id", idBlob);
|
||||
|
||||
// Delete the item
|
||||
ExecuteWithSingleParam(db, "delete from TypedBaseItems where guid=@Id", idBlob);
|
||||
}, TransactionMode);
|
||||
// Delete the item
|
||||
ExecuteWithSingleParam(db, "delete from TypedBaseItems where guid=@Id", idBlob);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5808,15 +5816,16 @@ AND Type = @InternalPersonType)");
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
var itemIdBlob = itemId.ToByteArray();
|
||||
db =>
|
||||
{
|
||||
var itemIdBlob = itemId.ToByteArray();
|
||||
|
||||
// First delete chapters
|
||||
db.Execute("delete from People where ItemId=@ItemId", itemIdBlob);
|
||||
// First delete chapters
|
||||
db.Execute("delete from People where ItemId=@ItemId", itemIdBlob);
|
||||
|
||||
InsertPeople(itemIdBlob, people, db);
|
||||
}, TransactionMode);
|
||||
InsertPeople(itemIdBlob, people, db);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5974,7 +5983,8 @@ AND Type = @InternalPersonType)");
|
||||
db.Execute("delete from mediastreams where ItemId=@ItemId", itemIdBlob);
|
||||
|
||||
InsertMediaStreams(itemIdBlob, streams, db);
|
||||
}, TransactionMode);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6308,7 +6318,8 @@ AND Type = @InternalPersonType)");
|
||||
db.Execute("delete from mediaattachments where ItemId=@ItemId", itemIdBlob);
|
||||
|
||||
InsertMediaAttachments(itemIdBlob, attachments, db, cancellationToken);
|
||||
}, TransactionMode);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,41 +50,42 @@ namespace Emby.Server.Implementations.Data
|
||||
var users = userDatasTableExists ? null : userManager.Users;
|
||||
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
db.ExecuteAll(string.Join(';', new[]
|
||||
db =>
|
||||
{
|
||||
"create table if not exists UserDatas (key nvarchar not null, userId INT not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null, AudioStreamIndex INT, SubtitleStreamIndex INT)",
|
||||
|
||||
"drop index if exists idx_userdata",
|
||||
"drop index if exists idx_userdata1",
|
||||
"drop index if exists idx_userdata2",
|
||||
"drop index if exists userdataindex1",
|
||||
"drop index if exists userdataindex",
|
||||
"drop index if exists userdataindex3",
|
||||
"drop index if exists userdataindex4",
|
||||
"create unique index if not exists UserDatasIndex1 on UserDatas (key, userId)",
|
||||
"create index if not exists UserDatasIndex2 on UserDatas (key, userId, played)",
|
||||
"create index if not exists UserDatasIndex3 on UserDatas (key, userId, playbackPositionTicks)",
|
||||
"create index if not exists UserDatasIndex4 on UserDatas (key, userId, isFavorite)"
|
||||
}));
|
||||
|
||||
if (userDataTableExists)
|
||||
{
|
||||
var existingColumnNames = GetColumnNames(db, "userdata");
|
||||
|
||||
AddColumn(db, "userdata", "InternalUserId", "int", existingColumnNames);
|
||||
AddColumn(db, "userdata", "AudioStreamIndex", "int", existingColumnNames);
|
||||
AddColumn(db, "userdata", "SubtitleStreamIndex", "int", existingColumnNames);
|
||||
|
||||
if (!userDatasTableExists)
|
||||
db.ExecuteAll(string.Join(';', new[]
|
||||
{
|
||||
ImportUserIds(db, users);
|
||||
"create table if not exists UserDatas (key nvarchar not null, userId INT not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null, AudioStreamIndex INT, SubtitleStreamIndex INT)",
|
||||
|
||||
db.ExecuteAll("INSERT INTO UserDatas (key, userId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex) SELECT key, InternalUserId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex from userdata where InternalUserId not null");
|
||||
"drop index if exists idx_userdata",
|
||||
"drop index if exists idx_userdata1",
|
||||
"drop index if exists idx_userdata2",
|
||||
"drop index if exists userdataindex1",
|
||||
"drop index if exists userdataindex",
|
||||
"drop index if exists userdataindex3",
|
||||
"drop index if exists userdataindex4",
|
||||
"create unique index if not exists UserDatasIndex1 on UserDatas (key, userId)",
|
||||
"create index if not exists UserDatasIndex2 on UserDatas (key, userId, played)",
|
||||
"create index if not exists UserDatasIndex3 on UserDatas (key, userId, playbackPositionTicks)",
|
||||
"create index if not exists UserDatasIndex4 on UserDatas (key, userId, isFavorite)"
|
||||
}));
|
||||
|
||||
if (userDataTableExists)
|
||||
{
|
||||
var existingColumnNames = GetColumnNames(db, "userdata");
|
||||
|
||||
AddColumn(db, "userdata", "InternalUserId", "int", existingColumnNames);
|
||||
AddColumn(db, "userdata", "AudioStreamIndex", "int", existingColumnNames);
|
||||
AddColumn(db, "userdata", "SubtitleStreamIndex", "int", existingColumnNames);
|
||||
|
||||
if (!userDatasTableExists)
|
||||
{
|
||||
ImportUserIds(db, users);
|
||||
|
||||
db.ExecuteAll("INSERT INTO UserDatas (key, userId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex) SELECT key, InternalUserId, rating, played, playCount, isFavorite, playbackPositionTicks, lastPlayedDate, AudioStreamIndex, SubtitleStreamIndex from userdata where InternalUserId not null");
|
||||
}
|
||||
}
|
||||
}
|
||||
}, TransactionMode);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,10 +184,11 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
SaveUserData(db, internalUserId, key, userData);
|
||||
}, TransactionMode);
|
||||
db =>
|
||||
{
|
||||
SaveUserData(db, internalUserId, key, userData);
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,13 +254,14 @@ namespace Emby.Server.Implementations.Data
|
||||
using (var connection = GetConnection())
|
||||
{
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
foreach (var userItemData in userDataList)
|
||||
db =>
|
||||
{
|
||||
SaveUserData(db, internalUserId, userItemData.Key, userItemData);
|
||||
}
|
||||
}, TransactionMode);
|
||||
foreach (var userItemData in userDataList)
|
||||
{
|
||||
SaveUserData(db, internalUserId, userItemData.Key, userItemData);
|
||||
}
|
||||
},
|
||||
TransactionMode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,10 +49,14 @@
|
||||
<NoWarn>AD0001</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Code Analyzers-->
|
||||
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.376" PrivateAssets="All" />
|
||||
<PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -236,7 +236,8 @@ namespace Emby.Server.Implementations.HttpServer
|
||||
{
|
||||
MessageId = Guid.NewGuid(),
|
||||
MessageType = SessionMessageType.KeepAlive
|
||||
}, CancellationToken.None);
|
||||
},
|
||||
CancellationToken.None);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -34,7 +34,6 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
||||
"default"
|
||||
};
|
||||
|
||||
|
||||
public PhotoResolver(IImageProcessor imageProcessor, NamingOptions namingOptions)
|
||||
{
|
||||
_imageProcessor = imageProcessor;
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using Jellyfin.Data.Enums;
|
||||
using MediaBrowser.Controller.Collections;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Movies;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using Jellyfin.Data.Enums;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Emby.Server.Implementations.Library.Validators
|
||||
{
|
||||
|
||||
@@ -30,8 +30,8 @@ namespace Emby.Server.Implementations.QuickConnect
|
||||
/// </summary>
|
||||
private const int Timeout = 10;
|
||||
|
||||
private readonly ConcurrentDictionary<string, QuickConnectResult> _currentRequests = new ();
|
||||
private readonly ConcurrentDictionary<string, (DateTime Timestamp, AuthenticationResult AuthenticationResult)> _authorizedSecrets = new ();
|
||||
private readonly ConcurrentDictionary<string, QuickConnectResult> _currentRequests = new();
|
||||
private readonly ConcurrentDictionary<string, (DateTime Timestamp, AuthenticationResult AuthenticationResult)> _authorizedSecrets = new();
|
||||
|
||||
private readonly IServerConfigurationManager _config;
|
||||
private readonly ILogger<QuickConnectManager> _logger;
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace Emby.Server.Implementations.Session
|
||||
/// <summary>
|
||||
/// The active connections.
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<string, SessionInfo> _activeConnections = new (StringComparer.OrdinalIgnoreCase);
|
||||
private readonly ConcurrentDictionary<string, SessionInfo> _activeConnections = new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
private Timer _idleTimer;
|
||||
|
||||
|
||||
@@ -122,7 +122,8 @@ namespace Emby.Server.Implementations.TV
|
||||
Limit = limit,
|
||||
DtoOptions = new DtoOptions { Fields = new[] { ItemFields.SeriesPresentationUniqueKey }, EnableImages = false },
|
||||
GroupBySeriesPresentationUniqueKey = true
|
||||
}, parentsFolders.ToList())
|
||||
},
|
||||
parentsFolders.ToList())
|
||||
.Cast<Episode>()
|
||||
.Where(episode => !string.IsNullOrEmpty(episode.SeriesPresentationUniqueKey))
|
||||
.Select(GetUniqueSeriesKey);
|
||||
|
||||
Reference in New Issue
Block a user