diff --git a/Emby.Server.Implementations/Data/SqliteExtensions.cs b/Emby.Server.Implementations/Data/SqliteExtensions.cs index d9536ae9c5..3dc3cec8e9 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(); + 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 c88bffe045..32cfecfce4 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -139,7 +139,7 @@ // /// Task. // 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.RunQueries(queries); -// _connection.AddColumn(Logger, "AncestorIds", "AncestorIdText", "Text"); +// _connection.RunInTransaction(db => +// { +// var existingColumnNames = GetColumnNames(db, "AncestorIds"); +// AddColumn(db, "AncestorIds", "AncestorIdText", "Text", existingColumnNames); -// _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"); +// existingColumnNames = GetColumnNames(db, "TypedBaseItems"); -// _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"); +// 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); -// _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"); +// 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); -// _connection.AddColumn(Logger, "TypedBaseItems", "ForcedSortName", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsOffline", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "LocationType", "Text"); +// 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); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsSeries", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsLive", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsNews", "BIT"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsPremiere", "BIT"); +// AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsOffline", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "LocationType", "Text", existingColumnNames); -// _connection.AddColumn(Logger, "TypedBaseItems", "EpisodeTitle", "Text"); -// _connection.AddColumn(Logger, "TypedBaseItems", "IsRepeat", "BIT"); +// AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsLive", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsNews", "BIT", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsPremiere", "BIT", existingColumnNames); -// _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"); +// AddColumn(db, "TypedBaseItems", "EpisodeTitle", "Text", existingColumnNames); +// AddColumn(db, "TypedBaseItems", "IsRepeat", "BIT", existingColumnNames); -// _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"); +// 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); -// _connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text"); +// 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); -// _connection.AddColumn(Logger, ChaptersTableName, "ImageDateModified", "DATETIME"); +// 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 d1355ce8f0..5556c45027 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); // } // /// @@ -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) +// } + +// private void SaveUserData(IDatabaseConnection db, Guid userId, string key, UserItemData userData) +// { +// var paramList = new List(); +// 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) // { -// if (transaction != null) -// { -// transaction.Rollback(); -// } - -// throw; +// paramList.Add(userData.LastPlayedDate.Value.ToDateTimeParamValue()); // } -// catch (Exception e) +// else // { -// Logger.ErrorException("Failed to save user data:", e); - -// if (transaction != null) -// { -// transaction.Rollback(); -// } - -// throw; +// paramList.Add(null); // } -// finally -// { -// if (transaction != null) -// { -// transaction.Dispose(); -// } +// paramList.Add(userData.AudioStreamIndex); +// paramList.Add(userData.SubtitleStreamIndex); -// WriteLock.Release(); -// } +// db.Execute(commandText, paramList.ToArray()); // } // /// // /// Persist all user data for the specified user // /// -// /// -// /// -// /// -// /// -// private async Task PersistAllUserData(Guid userId, IEnumerable userData, CancellationToken cancellationToken) +// private async Task PersistAllUserData(Guid userId, List 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()) +// var commandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = ? and userId=?"; + +// var paramList = new List(); +// paramList.Add(key); +// paramList.Add(userId.ToGuidParamValue()); + +// foreach (var row in _connection.Query(commandText, paramList.ToArray())) // { -// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId"; - -// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key; -// 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 ReadRow(row); // } + +// return null; // } // public UserItemData GetUserData(Guid userId, List 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(); -// 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]); // } // /// @@ -378,56 +261,58 @@ // throw new ArgumentNullException("userId"); // } -// using (var cmd = _connection.CreateCommand()) +// var list = new List(); + +// 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(); +// 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; // } // /// // /// Read a row from the specified reader into the provided userData object // /// // /// -// private UserItemData ReadRow(IDataReader reader) +// private UserItemData ReadRow(IReadOnlyList 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; diff --git a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj index f49716eadb..f80513c51f 100644 --- a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj +++ b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj @@ -108,11 +108,11 @@ True - ..\packages\SQLitePCLRaw.core.1.1.0\lib\net45\SQLitePCLRaw.core.dll + ..\packages\SQLitePCLRaw.core.1.1.1-pre20161109081005\lib\net45\SQLitePCLRaw.core.dll True - ..\packages\SQLitePCLRaw.provider.sqlite3.net45.1.1.0\lib\net45\SQLitePCLRaw.provider.sqlite3.dll + ..\packages\SQLitePCLRaw.provider.sqlite3.net45.1.1.1-pre20161109081005\lib\net45\SQLitePCLRaw.provider.sqlite3.dll True diff --git a/MediaBrowser.Server.Mac/MacAppHost.cs b/MediaBrowser.Server.Mac/MacAppHost.cs index 054913d4dd..342829c107 100644 --- a/MediaBrowser.Server.Mac/MacAppHost.cs +++ b/MediaBrowser.Server.Mac/MacAppHost.cs @@ -3,7 +3,8 @@ using System.Collections.Generic; using System.Reflection; using Emby.Server.Core; using Emby.Server.Core.Data; -using Emby.Server.Core.FFMpeg; +using Emby.Server.Implementations; +using Emby.Server.Implementations.FFMpeg; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; diff --git a/MediaBrowser.Server.Mac/Main.cs b/MediaBrowser.Server.Mac/Main.cs index fa9f8ae1f6..cda6f459a9 100644 --- a/MediaBrowser.Server.Mac/Main.cs +++ b/MediaBrowser.Server.Mac/Main.cs @@ -20,6 +20,7 @@ using MonoMac.AppKit; using MonoMac.Foundation; using MonoMac.ObjCRuntime; using Emby.Server.Core; +using Emby.Server.Implementations; using Emby.Common.Implementations.Logging; using Emby.Common.Implementations.EnvironmentInfo; using Emby.Server.Mac.Native; @@ -43,7 +44,7 @@ namespace MediaBrowser.Server.Mac var applicationPath = Assembly.GetEntryAssembly().Location; - var options = new StartupOptions(); + var options = new StartupOptions(Environment.GetCommandLineArgs()); // Allow this to be specified on the command line. var customProgramDataPath = options.GetOption("-programdata"); diff --git a/MediaBrowser.Server.Mac/MenuBarIcon.cs b/MediaBrowser.Server.Mac/MenuBarIcon.cs index 646b5ff690..1b335ce461 100644 --- a/MediaBrowser.Server.Mac/MenuBarIcon.cs +++ b/MediaBrowser.Server.Mac/MenuBarIcon.cs @@ -4,7 +4,7 @@ using MediaBrowser.Model.Logging; using System; using MonoMac.Foundation; using MonoMac.AppKit; -using Emby.Server.Core.Browser; +using Emby.Server.Implementations.Browser; namespace MediaBrowser.Server.Mac { diff --git a/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs b/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs index e713457234..3fb07b8d83 100644 --- a/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs +++ b/MediaBrowser.Server.Mac/Native/MonoFileSystem.cs @@ -6,7 +6,7 @@ namespace Emby.Server.Mac.Native { public class MonoFileSystem : ManagedFileSystem { - public MonoFileSystem(ILogger logger, bool supportsAsyncFileStreams, bool enableManagedInvalidFileNameChars) : base(logger, supportsAsyncFileStreams, enableManagedInvalidFileNameChars, false) + public MonoFileSystem(ILogger logger, bool supportsAsyncFileStreams, bool enableManagedInvalidFileNameChars) : base(logger, supportsAsyncFileStreams, enableManagedInvalidFileNameChars, true) { } diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj index bd21db6cc8..a0dc59cef6 100644 --- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj +++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj @@ -230,6 +230,10 @@ PreserveNewest + + Designer + PreserveNewest + PreserveNewest Designer diff --git a/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config b/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config new file mode 100644 index 0000000000..83a6cd9f38 --- /dev/null +++ b/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file