diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-11-19 16:07:42 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-11-19 16:07:42 -0500 |
| commit | d570130e922f0742439329496fd8b2b7a1ec12b5 (patch) | |
| tree | 3419cfc2ea93ab97679baa3d22dd666bc1d6aec7 /Emby.Server.Implementations/Data | |
| parent | 2877da48835cf0127bf505ed6121d29309198f31 (diff) | |
| parent | 2a0280d48dd4271f60e9d59be932d6ba0f38c62c (diff) | |
Merge pull request #2296 from MediaBrowser/dev
Dev
Diffstat (limited to 'Emby.Server.Implementations/Data')
3 files changed, 210 insertions, 295 deletions
diff --git a/Emby.Server.Implementations/Data/SqliteExtensions.cs b/Emby.Server.Implementations/Data/SqliteExtensions.cs index d9536ae9c..3dc3cec8e 100644 --- a/Emby.Server.Implementations/Data/SqliteExtensions.cs +++ b/Emby.Server.Implementations/Data/SqliteExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Globalization; using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; @@ -127,5 +128,14 @@ namespace Emby.Server.Implementations.Data return stream.ToArray(); } } + + public static void Attach(IDatabaseConnection db, string path, string alias) + { + var commandText = string.Format("attach ? as {0};", alias); + var paramList = new List<object>(); + paramList.Add(path); + + db.Execute(commandText, paramList.ToArray()); + } } } diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index c88bffe04..32cfecfce 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -139,7 +139,7 @@ // /// <returns>Task.</returns> // public async Task Initialize(SqliteUserDataRepository userDataRepo) // { -// _connection = await CreateConnection(false).ConfigureAwait(false); +// _connection = CreateConnection(false); // var createMediaStreamsTableCommand // = "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, Title TEXT NULL, TimeBase TEXT NULL, CodecTimeBase TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))"; @@ -168,109 +168,131 @@ // }; -// _connection.RunQueries(queries, Logger); - -// _connection.AddColumn(Logger, "AncestorIds", "AncestorIdText", "Text"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "Path", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "StartDate", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "EndDate", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ChannelId", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsMovie", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsSports", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsKids", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "CommunityRating", "Float"); -// _connection.AddColumn(Logger, "TypedBaseItems", "CustomRating", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IndexNumber", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsLocked", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Name", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "OfficialRating", "Text"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "MediaType", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Overview", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ParentIndexNumber", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "PremiereDate", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ProductionYear", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ParentId", "GUID"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Genres", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SchemaVersion", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SortName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "RunTimeTicks", "BIGINT"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "OfficialRatingDescription", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "HomePageUrl", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "VoteCount", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "DisplayMediaType", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "DateCreated", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "DateModified", "DATETIME"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "ForcedSortName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsOffline", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "LocationType", "Text"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "IsSeries", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsLive", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsNews", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsPremiere", "BIT"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "EpisodeTitle", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsRepeat", "BIT"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "PreferredMetadataLanguage", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "PreferredMetadataCountryCode", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsHD", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ExternalEtag", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "DateLastRefreshed", "DATETIME"); - -// _connection.AddColumn(Logger, "TypedBaseItems", "DateLastSaved", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsInMixedFolder", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "LockedFields", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Studios", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Audio", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ExternalServiceId", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Tags", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsFolder", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "InheritedParentalRatingValue", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "UnratedType", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "TopParentId", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsItemByName", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SourceType", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "TrailerTypes", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "CriticRating", "Float"); -// _connection.AddColumn(Logger, "TypedBaseItems", "CriticRatingSummary", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "InheritedTags", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "CleanName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "PresentationUniqueKey", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SlugName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "OriginalTitle", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "PrimaryVersionId", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "DateLastMediaAdded", "DATETIME"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Album", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsVirtualItem", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SeriesName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "UserDataKey", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SeasonName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SeasonId", "GUID"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SeriesId", "GUID"); -// _connection.AddColumn(Logger, "TypedBaseItems", "SeriesSortName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ExternalSeriesId", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ShortOverview", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Tagline", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Keywords", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ProviderIds", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Images", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ProductionLocations", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ThemeSongIds", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ThemeVideoIds", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "TotalBitrate", "INT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ExtraType", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "Artists", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "AlbumArtists", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "ExternalId", "Text"); - -// _connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text"); - -// _connection.AddColumn(Logger, ChaptersTableName, "ImageDateModified", "DATETIME"); +// _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", "IsSports", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsKids", "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", "SchemaVersion", "INT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames); + +// AddColumn(db, "TypedBaseItems", "OfficialRatingDescription", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "HomePageUrl", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "VoteCount", "INT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "DisplayMediaType", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames); + +// AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsOffline", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "LocationType", "Text", existingColumnNames); + +// AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsLive", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsNews", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsPremiere", "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", "IsHD", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ExternalEtag", "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", "IsItemByName", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "SourceType", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "CriticRating", "Float", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "CriticRatingSummary", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "InheritedTags", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "CleanName", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "SlugName", "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", "SeriesSortName", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ExternalSeriesId", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ShortOverview", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "Tagline", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "Keywords", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ProviderIds", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "Images", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ProductionLocations", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ThemeSongIds", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "ThemeVideoIds", "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); + +// 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); +// }); // string[] postQueries = @@ -334,14 +356,12 @@ // "create index if not exists idx_ItemValues7 on ItemValues(Type,CleanValue,ItemId)" // }; -// _connection.RunQueries(postQueries, Logger); +// _connection.RunQueries(postQueries); // PrepareStatements(); -// new MediaStreamColumns(_connection, Logger).AddColumns(); - -// DataExtensions.Attach(_connection, Path.Combine(_config.ApplicationPaths.DataPath, "userdata_v2.db"), "UserDataDb"); -// await userDataRepo.Initialize(_connection, WriteLock).ConfigureAwait(false); +// SqliteExtensions.Attach(_connection, Path.Combine(_config.ApplicationPaths.DataPath, "userdata_v2.db"), "UserDataDb"); +// userDataRepo.Initialize(_connection, WriteLock); // //await Vacuum(_connection).ConfigureAwait(false); // } diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index d1355ce8f..5556c4502 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -1,8 +1,7 @@ //using System; //using System.Collections.Generic; -//using System.Globalization; //using System.IO; -//using System.Text; +//using System.Linq; //using System.Threading; //using System.Threading.Tasks; //using MediaBrowser.Common.Configuration; @@ -125,7 +124,7 @@ // throw new ArgumentNullException("userId"); // } -// return PersistAllUserData(userId, userData, cancellationToken); +// return PersistAllUserData(userId, userData.ToList(), cancellationToken); // } // /// <summary> @@ -140,141 +139,58 @@ // { // cancellationToken.ThrowIfCancellationRequested(); -// await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); - -// IDbTransaction transaction = null; - -// try +// using (WriteLock.Write()) // { -// transaction = _connection.BeginTransaction(); - -// using (var cmd = _connection.CreateCommand()) +// _connection.RunInTransaction(db => // { -// cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"; - -// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key; -// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; -// cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating; -// cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played; -// cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount; -// cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite; -// cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks; -// cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate; -// cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex; -// cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex; - -// cmd.Transaction = transaction; - -// cmd.ExecuteNonQuery(); -// } - -// transaction.Commit(); +// SaveUserData(db, userId, key, userData); +// }); // } -// catch (OperationCanceledException) -// { -// if (transaction != null) -// { -// transaction.Rollback(); -// } +// } -// throw; -// } -// catch (Exception e) +// private void SaveUserData(IDatabaseConnection db, Guid userId, string key, UserItemData userData) +// { +// var paramList = new List<object>(); +// var commandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (?, ?, ?,?,?,?,?,?,?,?)"; + +// paramList.Add(key); +// paramList.Add(userId.ToGuidParamValue()); +// paramList.Add(userData.Rating); +// paramList.Add(userData.Played); +// paramList.Add(userData.PlayCount); +// paramList.Add(userData.IsFavorite); +// paramList.Add(userData.PlaybackPositionTicks); + +// if (userData.LastPlayedDate.HasValue) // { -// Logger.ErrorException("Failed to save user data:", e); - -// if (transaction != null) -// { -// transaction.Rollback(); -// } - -// throw; +// paramList.Add(userData.LastPlayedDate.Value.ToDateTimeParamValue()); // } -// finally +// else // { -// if (transaction != null) -// { -// transaction.Dispose(); -// } - -// WriteLock.Release(); +// paramList.Add(null); // } +// paramList.Add(userData.AudioStreamIndex); +// paramList.Add(userData.SubtitleStreamIndex); + +// db.Execute(commandText, paramList.ToArray()); // } // /// <summary> // /// Persist all user data for the specified user // /// </summary> -// /// <param name="userId"></param> -// /// <param name="userData"></param> -// /// <param name="cancellationToken"></param> -// /// <returns></returns> -// private async Task PersistAllUserData(Guid userId, IEnumerable<UserItemData> userData, CancellationToken cancellationToken) +// private async Task PersistAllUserData(Guid userId, List<UserItemData> userDataList, CancellationToken cancellationToken) // { // cancellationToken.ThrowIfCancellationRequested(); -// await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); - -// IDbTransaction transaction = null; - -// try +// using (WriteLock.Write()) // { -// transaction = _connection.BeginTransaction(); - -// foreach (var userItemData in userData) +// _connection.RunInTransaction(db => // { -// using (var cmd = _connection.CreateCommand()) +// foreach (var userItemData in userDataList) // { -// cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"; - -// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key; -// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; -// cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating; -// cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played; -// cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount; -// cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite; -// cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks; -// cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate; -// cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex; -// cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex; - -// cmd.Transaction = transaction; - -// cmd.ExecuteNonQuery(); +// SaveUserData(db, userId, userItemData.Key, userItemData); // } - -// cancellationToken.ThrowIfCancellationRequested(); -// } - -// transaction.Commit(); -// } -// catch (OperationCanceledException) -// { -// if (transaction != null) -// { -// transaction.Rollback(); -// } - -// throw; -// } -// catch (Exception e) -// { -// Logger.ErrorException("Failed to save user data:", e); - -// if (transaction != null) -// { -// transaction.Rollback(); -// } - -// throw; -// } -// finally -// { -// if (transaction != null) -// { -// transaction.Dispose(); -// } - -// WriteLock.Release(); +// }); // } // } @@ -300,23 +216,18 @@ // throw new ArgumentNullException("key"); // } -// using (var cmd = _connection.CreateCommand()) -// { -// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId"; +// var commandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = ? and userId=?"; -// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key; -// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; +// var paramList = new List<object>(); +// paramList.Add(key); +// paramList.Add(userId.ToGuidParamValue()); -// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) -// { -// if (reader.Read()) -// { -// return ReadRow(reader); -// } -// } - -// return null; +// foreach (var row in _connection.Query(commandText, paramList.ToArray())) +// { +// return ReadRow(row); // } + +// return null; // } // public UserItemData GetUserData(Guid userId, List<string> keys) @@ -330,40 +241,12 @@ // throw new ArgumentNullException("keys"); // } -// using (var cmd = _connection.CreateCommand()) +// if (keys.Count == 0) // { -// var index = 0; -// var userdataKeys = new List<string>(); -// var builder = new StringBuilder(); -// foreach (var key in keys) -// { -// var paramName = "@Key" + index; -// userdataKeys.Add("Key =" + paramName); -// cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key; -// builder.Append(" WHEN Key=" + paramName + " THEN " + index); -// index++; -// break; -// } - -// var keyText = string.Join(" OR ", userdataKeys.ToArray()); - -// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") "; - -// cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )"; -// cmd.CommandText += " LIMIT 1"; - -// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; - -// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) -// { -// if (reader.Read()) -// { -// return ReadRow(reader); -// } -// } - // return null; // } + +// return GetUserData(userId, keys[0]); // } // /// <summary> @@ -378,56 +261,58 @@ // throw new ArgumentNullException("userId"); // } -// using (var cmd = _connection.CreateCommand()) +// var list = new List<UserItemData>(); + +// using (WriteLock.Read()) // { -// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId"; +// var commandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=?"; -// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; +// var paramList = new List<object>(); +// paramList.Add(userId.ToGuidParamValue()); -// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) +// foreach (var row in _connection.Query(commandText, paramList.ToArray())) // { -// while (reader.Read()) -// { -// yield return ReadRow(reader); -// } +// list.Add(ReadRow(row)); // } // } + +// return list; // } // /// <summary> // /// Read a row from the specified reader into the provided userData object // /// </summary> // /// <param name="reader"></param> -// private UserItemData ReadRow(IDataReader reader) +// private UserItemData ReadRow(IReadOnlyList<IResultSetValue> reader) // { // var userData = new UserItemData(); -// userData.Key = reader.GetString(0); -// userData.UserId = reader.GetGuid(1); +// userData.Key = reader[0].ToString(); +// userData.UserId = reader[1].ReadGuid(); -// if (!reader.IsDBNull(2)) +// if (reader[2].SQLiteType != SQLiteType.Null) // { -// userData.Rating = reader.GetDouble(2); +// userData.Rating = reader[2].ToDouble(); // } -// userData.Played = reader.GetBoolean(3); -// userData.PlayCount = reader.GetInt32(4); -// userData.IsFavorite = reader.GetBoolean(5); -// userData.PlaybackPositionTicks = reader.GetInt64(6); +// userData.Played = reader[3].ToBool(); +// userData.PlayCount = reader[4].ToInt(); +// userData.IsFavorite = reader[5].ToBool(); +// userData.PlaybackPositionTicks = reader[6].ToInt64(); -// if (!reader.IsDBNull(7)) +// if (reader[7].SQLiteType != SQLiteType.Null) // { -// userData.LastPlayedDate = reader.GetDateTime(7).ToUniversalTime(); +// userData.LastPlayedDate = reader[7].ReadDateTime(); // } -// if (!reader.IsDBNull(8)) +// if (reader[8].SQLiteType != SQLiteType.Null) // { -// userData.AudioStreamIndex = reader.GetInt32(8); +// userData.AudioStreamIndex = reader[8].ToInt(); // } -// if (!reader.IsDBNull(9)) +// if (reader[9].SQLiteType != SQLiteType.Null) // { -// userData.SubtitleStreamIndex = reader.GetInt32(9); +// userData.SubtitleStreamIndex = reader[9].ToInt(); // } // return userData; |
