|
@@ -440,122 +440,123 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
connection.RunQueries(queries);
|
|
|
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- var existingColumnNames = GetColumnNames(db, "AncestorIds");
|
|
|
- AddColumn(db, "AncestorIds", "AncestorIdText", "Text", existingColumnNames);
|
|
|
-
|
|
|
- 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", "LUFS", "Float", 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, 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);
|
|
|
-
|
|
|
- AddColumn(db, "MediaStreams", "ColorPrimaries", "TEXT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "ColorSpace", "TEXT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "ColorTransfer", "TEXT", existingColumnNames);
|
|
|
-
|
|
|
- AddColumn(db, "MediaStreams", "DvVersionMajor", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "DvVersionMinor", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "DvProfile", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "DvLevel", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "RpuPresentFlag", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "ElPresentFlag", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "BlPresentFlag", "INT", existingColumnNames);
|
|
|
- AddColumn(db, "MediaStreams", "DvBlSignalCompatibilityId", "INT", existingColumnNames);
|
|
|
-
|
|
|
- AddColumn(db, "MediaStreams", "IsHearingImpaired", "BIT", existingColumnNames);
|
|
|
- });
|
|
|
+ using (var transaction = connection.BeginTransaction())
|
|
|
+ {
|
|
|
+ var existingColumnNames = GetColumnNames(connection, "AncestorIds");
|
|
|
+ AddColumn(connection, "AncestorIds", "AncestorIdText", "Text", existingColumnNames);
|
|
|
+
|
|
|
+ existingColumnNames = GetColumnNames(connection, "TypedBaseItems");
|
|
|
+
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Path", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "StartDate", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "EndDate", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ChannelId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsMovie", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "CommunityRating", "Float", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "CustomRating", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IndexNumber", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsLocked", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Name", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "OfficialRating", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "MediaType", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Overview", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ParentIndexNumber", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "PremiereDate", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ProductionYear", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ParentId", "GUID", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Genres", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SortName", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "EpisodeTitle", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsRepeat", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "PreferredMetadataLanguage", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "PreferredMetadataCountryCode", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "DateLastRefreshed", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "DateLastSaved", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsInMixedFolder", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "LockedFields", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Studios", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Audio", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ExternalServiceId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Tags", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsFolder", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "InheritedParentalRatingValue", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "UnratedType", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "TopParentId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "CriticRating", "Float", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "CleanName", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "OriginalTitle", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "PrimaryVersionId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "DateLastMediaAdded", "DATETIME", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Album", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "LUFS", "Float", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "IsVirtualItem", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SeriesName", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "UserDataKey", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SeasonName", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SeasonId", "GUID", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SeriesId", "GUID", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ExternalSeriesId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Tagline", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ProviderIds", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Images", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ProductionLocations", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ExtraIds", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "TotalBitrate", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ExtraType", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Artists", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "ShowId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "OwnerId", "Text", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Width", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Height", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "TypedBaseItems", "Size", "BIGINT", existingColumnNames);
|
|
|
+
|
|
|
+ existingColumnNames = GetColumnNames(connection, "ItemValues");
|
|
|
+ AddColumn(connection, "ItemValues", "CleanValue", "Text", existingColumnNames);
|
|
|
+
|
|
|
+ existingColumnNames = GetColumnNames(connection, ChaptersTableName);
|
|
|
+ AddColumn(connection, ChaptersTableName, "ImageDateModified", "DATETIME", existingColumnNames);
|
|
|
+
|
|
|
+ existingColumnNames = GetColumnNames(connection, "MediaStreams");
|
|
|
+ AddColumn(connection, "MediaStreams", "IsAvc", "BIT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "TimeBase", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "CodecTimeBase", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "Title", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "NalLengthSize", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "Comment", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "CodecTag", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "PixelFormat", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "BitDepth", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "RefFrames", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "KeyFrames", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "IsAnamorphic", "BIT", existingColumnNames);
|
|
|
+
|
|
|
+ AddColumn(connection, "MediaStreams", "ColorPrimaries", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "ColorSpace", "TEXT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "ColorTransfer", "TEXT", existingColumnNames);
|
|
|
+
|
|
|
+ AddColumn(connection, "MediaStreams", "DvVersionMajor", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "DvVersionMinor", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "DvProfile", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "DvLevel", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "RpuPresentFlag", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "ElPresentFlag", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "BlPresentFlag", "INT", existingColumnNames);
|
|
|
+ AddColumn(connection, "MediaStreams", "DvBlSignalCompatibilityId", "INT", existingColumnNames);
|
|
|
+
|
|
|
+ AddColumn(connection, "MediaStreams", "IsHearingImpaired", "BIT", existingColumnNames);
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
+ }
|
|
|
|
|
|
connection.RunQueries(postQueries);
|
|
|
}
|
|
@@ -567,20 +568,14 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
CheckDisposed();
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- using (var saveImagesStatement = PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
|
|
|
- {
|
|
|
- saveImagesStatement.TryBind("@Id", item.Id);
|
|
|
- saveImagesStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ using var saveImagesStatement = PrepareStatement(connection, "Update TypedBaseItems set Images=@Images where guid=@Id");
|
|
|
+ saveImagesStatement.TryBind("@Id", item.Id);
|
|
|
+ saveImagesStatement.TryBind("@Images", SerializeImages(item.ImageInfos));
|
|
|
|
|
|
- saveImagesStatement.MoveNext();
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+ saveImagesStatement.ExecuteNonQuery();
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -616,14 +611,10 @@ namespace Emby.Server.Implementations.Data
|
|
|
tuples[i] = (item, ancestorIds, topParent, userdataKey, inheritedTags);
|
|
|
}
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- SaveItemsInTransaction(db, tuples);
|
|
|
- });
|
|
|
- }
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ SaveItemsInTransaction(connection, tuples);
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
private void SaveItemsInTransaction(SqliteConnection db, IEnumerable<(BaseItem Item, List<Guid> AncestorIds, BaseItem TopParent, string UserDataKey, List<string> InheritedTags)> tuples)
|
|
@@ -1030,7 +1021,7 @@ namespace Emby.Server.Implementations.Data
|
|
|
saveItemStatement.TryBind("@OwnerId", ownerId);
|
|
|
}
|
|
|
|
|
|
- saveItemStatement.MoveNext();
|
|
|
+ saveItemStatement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
internal static string SerializeProviderIds(Dictionary<string, string> providerIds)
|
|
@@ -2060,19 +2051,15 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
ArgumentNullException.ThrowIfNull(chapters);
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- // First delete chapters
|
|
|
- using var command = db.PrepareStatement($"delete from {ChaptersTableName} where ItemId=@ItemId");
|
|
|
- command.TryBind("@ItemId", id);
|
|
|
- command.ExecuteNonQuery();
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ // First delete chapters
|
|
|
+ using var command = connection.PrepareStatement($"delete from {ChaptersTableName} where ItemId=@ItemId");
|
|
|
+ command.TryBind("@ItemId", id);
|
|
|
+ command.ExecuteNonQuery();
|
|
|
|
|
|
- InsertChapters(id, chapters, db);
|
|
|
- });
|
|
|
- }
|
|
|
+ InsertChapters(id, chapters, connection);
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
private void InsertChapters(Guid idBlob, IReadOnlyList<ChapterInfo> chapters, SqliteConnection db)
|
|
@@ -2115,7 +2102,7 @@ namespace Emby.Server.Implementations.Data
|
|
|
}
|
|
|
|
|
|
// TODO statement.Parameters.Clear();
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
startIndex += limit;
|
|
@@ -2848,68 +2835,65 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
var list = new List<BaseItem>();
|
|
|
var result = new QueryResult<BaseItem>();
|
|
|
- using (var connection = GetConnection(true))
|
|
|
+ using var connection = GetConnection(true);
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ if (!isReturningZeroItems)
|
|
|
{
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
+ using (new QueryTimeLogger(Logger, itemQuery, "GetItems.ItemQuery"))
|
|
|
+ using (var statement = PrepareStatement(connection, itemQuery))
|
|
|
+ {
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
{
|
|
|
- if (!isReturningZeroItems)
|
|
|
+ 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 is not null)
|
|
|
{
|
|
|
- using (new QueryTimeLogger(Logger, itemQuery, "GetItems.ItemQuery"))
|
|
|
- using (var statement = PrepareStatement(db, itemQuery))
|
|
|
- {
|
|
|
- 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);
|
|
|
-
|
|
|
- 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 is not null)
|
|
|
- {
|
|
|
- list.Add(item);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ list.Add(item);
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
- {
|
|
|
- using (new QueryTimeLogger(Logger, totalRecordCountQuery, "GetItems.TotalRecordCount"))
|
|
|
- using (var statement = PrepareStatement(db, totalRecordCountQuery))
|
|
|
- {
|
|
|
- if (EnableJoinUserData(query))
|
|
|
- {
|
|
|
- statement.TryBind("@UserId", query.User.InternalId);
|
|
|
- }
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
+ {
|
|
|
+ using (new QueryTimeLogger(Logger, totalRecordCountQuery, "GetItems.TotalRecordCount"))
|
|
|
+ using (var statement = PrepareStatement(connection, totalRecordCountQuery))
|
|
|
+ {
|
|
|
+ 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);
|
|
|
|
|
|
- result.TotalRecordCount = statement.SelectScalarInt();
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+ result.TotalRecordCount = statement.SelectScalarInt();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ transaction.Commit();
|
|
|
+
|
|
|
result.StartIndex = query.StartIndex ?? 0;
|
|
|
result.Items = list;
|
|
|
return result;
|
|
@@ -4662,28 +4646,18 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
public void UpdateInheritedValues()
|
|
|
{
|
|
|
- string sql = string.Join(
|
|
|
- ';',
|
|
|
- new string[]
|
|
|
- {
|
|
|
- "delete from ItemValues where type = 6",
|
|
|
-
|
|
|
- "insert into ItemValues (ItemId, Type, Value, CleanValue) select ItemId, 6, Value, CleanValue from ItemValues where Type=4",
|
|
|
-
|
|
|
- @"insert into ItemValues (ItemId, Type, Value, CleanValue) select AncestorIds.itemid, 6, ItemValues.Value, ItemValues.CleanValue
|
|
|
+ const string Statements = """
|
|
|
+delete from ItemValues where type = 6;
|
|
|
+insert into ItemValues (ItemId, Type, Value, CleanValue) select ItemId, 6, Value, CleanValue from ItemValues where Type=4;
|
|
|
+insert into ItemValues (ItemId, Type, Value, CleanValue) select AncestorIds.itemid, 6, ItemValues.Value, ItemValues.CleanValue
|
|
|
FROM AncestorIds
|
|
|
LEFT JOIN ItemValues ON (AncestorIds.AncestorId = ItemValues.ItemId)
|
|
|
-where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type = 4 "
|
|
|
- });
|
|
|
-
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- connection.ExecuteAll(sql);
|
|
|
- });
|
|
|
- }
|
|
|
+where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type = 4;
|
|
|
+""";
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ connection.ExecuteAll(Statements);
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
public void DeleteItem(Guid id)
|
|
@@ -4695,42 +4669,36 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
|
|
|
|
|
CheckDisposed();
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- Span<byte> idBlob = stackalloc byte[16];
|
|
|
- id.TryWriteBytes(idBlob);
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ // Delete people
|
|
|
+ ExecuteWithSingleParam(connection, "delete from People where ItemId=@Id", id);
|
|
|
|
|
|
- // Delete people
|
|
|
- ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob);
|
|
|
+ // Delete chapters
|
|
|
+ ExecuteWithSingleParam(connection, "delete from " + ChaptersTableName + " where ItemId=@Id", id);
|
|
|
|
|
|
- // Delete chapters
|
|
|
- ExecuteWithSingleParam(db, "delete from " + ChaptersTableName + " where ItemId=@Id", idBlob);
|
|
|
+ // Delete media streams
|
|
|
+ ExecuteWithSingleParam(connection, "delete from mediastreams where ItemId=@Id", id);
|
|
|
|
|
|
- // Delete media streams
|
|
|
- ExecuteWithSingleParam(db, "delete from mediastreams where ItemId=@Id", idBlob);
|
|
|
+ // Delete ancestors
|
|
|
+ ExecuteWithSingleParam(connection, "delete from AncestorIds where ItemId=@Id", id);
|
|
|
|
|
|
- // Delete ancestors
|
|
|
- ExecuteWithSingleParam(db, "delete from AncestorIds where ItemId=@Id", idBlob);
|
|
|
+ // Delete item values
|
|
|
+ ExecuteWithSingleParam(connection, "delete from ItemValues where ItemId=@Id", id);
|
|
|
|
|
|
- // Delete item values
|
|
|
- ExecuteWithSingleParam(db, "delete from ItemValues where ItemId=@Id", idBlob);
|
|
|
+ // Delete the item
|
|
|
+ ExecuteWithSingleParam(connection, "delete from TypedBaseItems where guid=@Id", id);
|
|
|
|
|
|
- // Delete the item
|
|
|
- ExecuteWithSingleParam(db, "delete from TypedBaseItems where guid=@Id", idBlob);
|
|
|
- });
|
|
|
- }
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
- private void ExecuteWithSingleParam(SqliteConnection db, string query, ReadOnlySpan<byte> value)
|
|
|
+ private void ExecuteWithSingleParam(SqliteConnection db, string query, Guid value)
|
|
|
{
|
|
|
using (var statement = PrepareStatement(db, query))
|
|
|
{
|
|
|
- statement.TryBind("@Id", value.ToArray());
|
|
|
+ statement.TryBind("@Id", value);
|
|
|
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4894,7 +4862,7 @@ AND Type = @InternalPersonType)");
|
|
|
// First delete
|
|
|
// TODO deleteAncestorsStatement.Parameters.Clear();
|
|
|
deleteAncestorsStatement.TryBind("@ItemId", itemId);
|
|
|
- deleteAncestorsStatement.MoveNext();
|
|
|
+ deleteAncestorsStatement.ExecuteNonQuery();
|
|
|
|
|
|
if (ancestorIds.Count == 0)
|
|
|
{
|
|
@@ -4929,7 +4897,7 @@ AND Type = @InternalPersonType)");
|
|
|
}
|
|
|
|
|
|
// TODO statement.Parameters.Clear();
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5238,75 +5206,74 @@ AND Type = @InternalPersonType)");
|
|
|
var result = new QueryResult<(BaseItem, ItemCounts)>();
|
|
|
using (new QueryTimeLogger(Logger, commandText))
|
|
|
using (var connection = GetConnection(true))
|
|
|
+ using (var transaction = connection.BeginTransaction())
|
|
|
{
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
+ if (!isReturningZeroItems)
|
|
|
+ {
|
|
|
+ using (var statement = PrepareStatement(connection, commandText))
|
|
|
{
|
|
|
- if (!isReturningZeroItems)
|
|
|
+ statement.TryBind("@SelectType", returnType);
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
{
|
|
|
- using (var statement = PrepareStatement(db, commandText))
|
|
|
- {
|
|
|
- statement.TryBind("@SelectType", returnType);
|
|
|
- if (EnableJoinUserData(query))
|
|
|
- {
|
|
|
- statement.TryBind("@UserId", query.User.InternalId);
|
|
|
- }
|
|
|
-
|
|
|
- if (typeSubQuery is not null)
|
|
|
- {
|
|
|
- GetWhereClauses(typeSubQuery, null);
|
|
|
- }
|
|
|
-
|
|
|
- BindSimilarParams(query, statement);
|
|
|
- BindSearchParams(query, statement);
|
|
|
- GetWhereClauses(innerQuery, statement);
|
|
|
- GetWhereClauses(outerQuery, statement);
|
|
|
-
|
|
|
- var hasEpisodeAttributes = HasEpisodeAttributes(query);
|
|
|
- var hasProgramAttributes = HasProgramAttributes(query);
|
|
|
- var hasServiceName = HasServiceName(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 is not null)
|
|
|
- {
|
|
|
- var countStartColumn = columns.Count - 1;
|
|
|
-
|
|
|
- list.Add((item, GetItemCounts(row, countStartColumn, typesToCount)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ statement.TryBind("@UserId", query.User.InternalId);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (typeSubQuery is not null)
|
|
|
+ {
|
|
|
+ GetWhereClauses(typeSubQuery, null);
|
|
|
}
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
+ BindSearchParams(query, statement);
|
|
|
+ GetWhereClauses(innerQuery, statement);
|
|
|
+ GetWhereClauses(outerQuery, statement);
|
|
|
+
|
|
|
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
|
|
|
+ var hasProgramAttributes = HasProgramAttributes(query);
|
|
|
+ var hasServiceName = HasServiceName(query);
|
|
|
+ var hasStartDate = HasStartDate(query);
|
|
|
+ var hasTrailerTypes = HasTrailerTypes(query);
|
|
|
+ var hasArtistFields = HasArtistFields(query);
|
|
|
+ var hasSeriesFields = HasSeriesFields(query);
|
|
|
+
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
{
|
|
|
- using (var statement = PrepareStatement(db, countText))
|
|
|
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasServiceName, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
|
|
|
+ if (item is not null)
|
|
|
{
|
|
|
- statement.TryBind("@SelectType", returnType);
|
|
|
- if (EnableJoinUserData(query))
|
|
|
- {
|
|
|
- statement.TryBind("@UserId", query.User.InternalId);
|
|
|
- }
|
|
|
-
|
|
|
- if (typeSubQuery is not null)
|
|
|
- {
|
|
|
- GetWhereClauses(typeSubQuery, null);
|
|
|
- }
|
|
|
-
|
|
|
- BindSimilarParams(query, statement);
|
|
|
- BindSearchParams(query, statement);
|
|
|
- GetWhereClauses(innerQuery, statement);
|
|
|
- GetWhereClauses(outerQuery, statement);
|
|
|
-
|
|
|
- result.TotalRecordCount = statement.SelectScalarInt();
|
|
|
+ var countStartColumn = columns.Count - 1;
|
|
|
+
|
|
|
+ list.Add((item, GetItemCounts(row, countStartColumn, typesToCount)));
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
+ {
|
|
|
+ using (var statement = PrepareStatement(connection, countText))
|
|
|
+ {
|
|
|
+ statement.TryBind("@SelectType", returnType);
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.InternalId);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (typeSubQuery is not null)
|
|
|
+ {
|
|
|
+ GetWhereClauses(typeSubQuery, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
+ BindSearchParams(query, statement);
|
|
|
+ GetWhereClauses(innerQuery, statement);
|
|
|
+ GetWhereClauses(outerQuery, statement);
|
|
|
+
|
|
|
+ result.TotalRecordCount = statement.SelectScalarInt();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
if (result.TotalRecordCount == 0)
|
|
@@ -5464,7 +5431,7 @@ AND Type = @InternalPersonType)");
|
|
|
}
|
|
|
|
|
|
// TODO statement.Parameters.Clear();
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
startIndex += Limit;
|
|
@@ -5483,20 +5450,17 @@ AND Type = @InternalPersonType)");
|
|
|
|
|
|
CheckDisposed();
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- // First delete chapters
|
|
|
- using var command = db.CreateCommand();
|
|
|
- command.CommandText = "delete from People where ItemId=@ItemId";
|
|
|
- command.TryBind("@ItemId", itemId);
|
|
|
- command.ExecuteNonQuery();
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ // First delete chapters
|
|
|
+ using var command = connection.CreateCommand();
|
|
|
+ command.CommandText = "delete from People where ItemId=@ItemId";
|
|
|
+ command.TryBind("@ItemId", itemId);
|
|
|
+ command.ExecuteNonQuery();
|
|
|
|
|
|
- InsertPeople(itemId, people, db);
|
|
|
- });
|
|
|
- }
|
|
|
+ InsertPeople(itemId, people, connection);
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
private void InsertPeople(Guid id, List<PersonInfo> people, SqliteConnection db)
|
|
@@ -5540,7 +5504,7 @@ AND Type = @InternalPersonType)");
|
|
|
listIndex++;
|
|
|
}
|
|
|
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
startIndex += Limit;
|
|
@@ -5636,19 +5600,16 @@ AND Type = @InternalPersonType)");
|
|
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
- using (var connection = GetConnection())
|
|
|
- {
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- // Delete existing mediastreams
|
|
|
- using var command = db.PrepareStatement("delete from mediastreams where ItemId=@ItemId");
|
|
|
- command.TryBind("@ItemId", id);
|
|
|
- command.ExecuteNonQuery();
|
|
|
+ using var connection = GetConnection();
|
|
|
+ using var transaction = connection.BeginTransaction();
|
|
|
+ // Delete existing mediastreams
|
|
|
+ using var command = connection.PrepareStatement("delete from mediastreams where ItemId=@ItemId");
|
|
|
+ command.TryBind("@ItemId", id);
|
|
|
+ command.ExecuteNonQuery();
|
|
|
|
|
|
- InsertMediaStreams(id, streams, db);
|
|
|
- });
|
|
|
- }
|
|
|
+ InsertMediaStreams(id, streams, connection);
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
|
|
|
private void InsertMediaStreams(Guid id, IReadOnlyList<MediaStream> streams, SqliteConnection db)
|
|
@@ -5749,7 +5710,7 @@ AND Type = @InternalPersonType)");
|
|
|
}
|
|
|
|
|
|
// TODO statement.Parameters.Clear();
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
startIndex += Limit;
|
|
@@ -6021,16 +5982,15 @@ AND Type = @InternalPersonType)");
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
using (var connection = GetConnection())
|
|
|
+ using (var transaction = connection.BeginTransaction())
|
|
|
+ using (var command = connection.PrepareStatement("delete from mediaattachments where ItemId=@ItemId"))
|
|
|
{
|
|
|
- connection.RunInTransaction(
|
|
|
- db =>
|
|
|
- {
|
|
|
- using var command = db.PrepareStatement("delete from mediaattachments where ItemId=@ItemId");
|
|
|
- command.TryBind("@ItemId", id);
|
|
|
- command.ExecuteNonQuery();
|
|
|
+ command.TryBind("@ItemId", id);
|
|
|
+ command.ExecuteNonQuery();
|
|
|
|
|
|
- InsertMediaAttachments(id, attachments, db, cancellationToken);
|
|
|
- });
|
|
|
+ InsertMediaAttachments(id, attachments, connection, cancellationToken);
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -6088,7 +6048,7 @@ AND Type = @InternalPersonType)");
|
|
|
}
|
|
|
|
|
|
// TODO statement.Parameters.Clear();
|
|
|
- statement.MoveNext();
|
|
|
+ statement.ExecuteNonQuery();
|
|
|
}
|
|
|
|
|
|
insertText.Length = _mediaAttachmentInsertPrefix.Length;
|