diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-02 15:25:16 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-02 15:25:16 -0400 |
| commit | e2562879d86aafc1063e37bfd353c22309e8e237 (patch) | |
| tree | d5d7479281f85fc47d24d8c95a2ce29a3a146d8b /MediaBrowser.Controller | |
| parent | b4dd8a210629bc74445f106e2379b986af9520c5 (diff) | |
Moved userdata to user manager to resolve concurrency issues. must delete userdata and displaypreferences db files.
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 110 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/DtoBuilder.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/IUserManager.cs | 29 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Persistence/IUserDataRepository.cs | 20 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs | 7 |
6 files changed, 51 insertions, 131 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index d30f11f7d..411190d77 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -797,109 +797,6 @@ namespace MediaBrowser.Controller.Entities } /// <summary> - /// The _user data - /// </summary> - private IEnumerable<UserItemData> _userData; - /// <summary> - /// The _user data initialized - /// </summary> - private bool _userDataInitialized; - /// <summary> - /// The _user data sync lock - /// </summary> - private object _userDataSyncLock = new object(); - /// <summary> - /// Gets the user data. - /// </summary> - /// <value>The user data.</value> - [IgnoreDataMember] - public IEnumerable<UserItemData> UserData - { - get - { - // Call ToList to exhaust the stream because we'll be iterating over this multiple times - LazyInitializer.EnsureInitialized(ref _userData, ref _userDataInitialized, ref _userDataSyncLock, () => Kernel.Instance.UserDataRepository.RetrieveUserData(this).ToList()); - return _userData; - } - private set - { - _userData = value; - - if (value == null) - { - _userDataInitialized = false; - } - } - } - - /// <summary> - /// Gets the user data. - /// </summary> - /// <param name="user">The user.</param> - /// <param name="createIfNull">if set to <c>true</c> [create if null].</param> - /// <returns>UserItemData.</returns> - /// <exception cref="System.ArgumentNullException"></exception> - public UserItemData GetUserData(User user, bool createIfNull) - { - if (user == null) - { - throw new ArgumentNullException(); - } - - if (UserData == null) - { - if (!createIfNull) - { - return null; - } - - AddOrUpdateUserData(user, new UserItemData { UserId = user.Id }); - } - - var data = UserData.FirstOrDefault(u => u.UserId == user.Id); - - if (data == null && createIfNull) - { - data = new UserItemData { UserId = user.Id }; - AddOrUpdateUserData(user, data); - } - - return data; - } - - /// <summary> - /// Adds the or update user data. - /// </summary> - /// <param name="user">The user.</param> - /// <param name="data">The data.</param> - /// <exception cref="System.ArgumentNullException"></exception> - public void AddOrUpdateUserData(User user, UserItemData data) - { - if (user == null) - { - throw new ArgumentNullException(); - } - - if (data == null) - { - throw new ArgumentNullException(); - } - - data.UserId = user.Id; - - if (UserData == null) - { - UserData = new[] { data }; - } - else - { - var list = UserData.Where(u => u.UserId != user.Id).ToList(); - list.Add(data); - UserData = list; - } - } - - /// <summary> /// The _user data id /// </summary> protected Guid _userDataId; //cache this so it doesn't have to be re-constructed on every reference @@ -1205,16 +1102,17 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <param name="user">The user.</param> /// <param name="wasPlayed">if set to <c>true</c> [was played].</param> + /// <param name="userManager">The user manager.</param> /// <returns>Task.</returns> /// <exception cref="System.ArgumentNullException"></exception> - public virtual Task SetPlayedStatus(User user, bool wasPlayed, IUserManager userManager) + public virtual async Task SetPlayedStatus(User user, bool wasPlayed, IUserManager userManager) { if (user == null) { throw new ArgumentNullException(); } - var data = GetUserData(user, true); + var data = await userManager.GetUserData(user.Id, UserDataId).ConfigureAwait(false); if (wasPlayed) { @@ -1237,7 +1135,7 @@ namespace MediaBrowser.Controller.Entities data.Played = wasPlayed; - return userManager.SaveUserDataForItem(user, this, data); + await userManager.SaveUserData(user.Id, UserDataId, data, CancellationToken.None).ConfigureAwait(false); } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index ce4d62925..05ee87def 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -799,6 +799,7 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <param name="user">The user.</param> /// <param name="wasPlayed">if set to <c>true</c> [was played].</param> + /// <param name="userManager">The user manager.</param> /// <returns>Task.</returns> public override async Task SetPlayedStatus(User user, bool wasPlayed, IUserManager userManager) { diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Library/DtoBuilder.cs index 419d3527d..d9244c64c 100644 --- a/MediaBrowser.Controller/Library/DtoBuilder.cs +++ b/MediaBrowser.Controller/Library/DtoBuilder.cs @@ -167,12 +167,9 @@ namespace MediaBrowser.Controller.Library { if (fields.Contains(ItemFields.UserData)) { - var userData = item.GetUserData(user, false); + var userData = await _userManager.GetUserData(user.Id, item.UserDataId).ConfigureAwait(false); - if (userData != null) - { - dto.UserData = GetUserItemDataDto(userData); - } + dto.UserData = GetUserItemDataDto(userData); } if (item.IsFolder && fields.Contains(ItemFields.DisplayPreferences)) @@ -191,7 +188,7 @@ namespace MediaBrowser.Controller.Library // Skip sorting since all we want is a count dto.ChildCount = folder.GetChildren(user).Count(); - SetSpecialCounts(folder, user, dto); + await SetSpecialCounts(folder, user, dto, _userManager).ConfigureAwait(false); } } } @@ -488,7 +485,9 @@ namespace MediaBrowser.Controller.Library /// <param name="folder">The folder.</param> /// <param name="user">The user.</param> /// <param name="dto">The dto.</param> - private static void SetSpecialCounts(Folder folder, User user, BaseItemDto dto) + /// <param name="userManager">The user manager.</param> + /// <returns>Task.</returns> + private static async Task SetSpecialCounts(Folder folder, User user, BaseItemDto dto, IUserManager userManager) { var rcentlyAddedItemCount = 0; var recursiveItemCount = 0; @@ -498,7 +497,7 @@ namespace MediaBrowser.Controller.Library // Loop through each recursive child foreach (var child in folder.GetRecursiveChildren(user).Where(i => !i.IsFolder)) { - var userdata = child.GetUserData(user, false); + var userdata = await userManager.GetUserData(user.Id, child.UserDataId).ConfigureAwait(false); recursiveItemCount++; diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs index 0e93c15cf..8374c6880 100644 --- a/MediaBrowser.Controller/Library/IUserManager.cs +++ b/MediaBrowser.Controller/Library/IUserManager.cs @@ -1,11 +1,11 @@ using MediaBrowser.Common.Events; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Connectivity; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Library { @@ -158,14 +158,6 @@ namespace MediaBrowser.Controller.Library Task OnPlaybackStopped(User user, BaseItem item, long? positionTicks, string clientType, string deviceId, string deviceName); /// <summary> - /// Saves user data for an item - /// </summary> - /// <param name="user">The user.</param> - /// <param name="item">The item.</param> - /// <param name="data">The data.</param> - Task SaveUserDataForItem(User user, BaseItem item, UserItemData data); - - /// <summary> /// Resets the password. /// </summary> /// <param name="user">The user.</param> @@ -181,6 +173,25 @@ namespace MediaBrowser.Controller.Library Task ChangePassword(User user, string newPassword); /// <summary> + /// Saves display preferences for an item + /// </summary> + /// <param name="userId">The user id.</param> + /// <param name="userDataId">The user data id.</param> + /// <param name="userData">The user data.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task SaveUserData(Guid userId, Guid userDataId, UserItemData userData, + CancellationToken cancellationToken); + + /// <summary> + /// Gets the display preferences. + /// </summary> + /// <param name="userId">The user id.</param> + /// <param name="userDataId">The user data id.</param> + /// <returns>Task{DisplayPreferences}.</returns> + Task<UserItemData> GetUserData(Guid userId, Guid userDataId); + + /// <summary> /// Gets the display preferences. /// </summary> /// <param name="userId">The user id.</param> diff --git a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs index 115bd411a..592206faf 100644 --- a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs @@ -1,5 +1,5 @@ using MediaBrowser.Controller.Entities; -using System.Collections.Generic; +using System; using System.Threading; using System.Threading.Tasks; @@ -11,18 +11,22 @@ namespace MediaBrowser.Controller.Persistence public interface IUserDataRepository : IRepository { /// <summary> - /// Saves user data for an item + /// Saves the user data. /// </summary> - /// <param name="item">The item.</param> + /// <param name="userId">The user id.</param> + /// <param name="userDataId">The user data id.</param> + /// <param name="userData">The user data.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - Task SaveUserData(BaseItem item, CancellationToken cancellationToken); + Task SaveUserData(Guid userId, Guid userDataId, UserItemData userData, + CancellationToken cancellationToken); /// <summary> - /// Gets user data for an item + /// Gets the user data. /// </summary> - /// <param name="item">The item.</param> - /// <returns>IEnumerable{UserItemData}.</returns> - IEnumerable<UserItemData> RetrieveUserData(BaseItem item); + /// <param name="userId">The user id.</param> + /// <param name="userDataId">The user data id.</param> + /// <returns>Task{UserItemData}.</returns> + Task<UserItemData> GetUserData(Guid userId, Guid userDataId); } } diff --git a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs index b9da1f6a6..76d84a653 100644 --- a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs +++ b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; namespace MediaBrowser.Controller.Sorting { @@ -12,5 +13,11 @@ namespace MediaBrowser.Controller.Sorting /// </summary> /// <value>The user.</value> User User { get; set; } + + /// <summary> + /// Gets or sets the user manager. + /// </summary> + /// <value>The user manager.</value> + IUserManager UserManager { get; set; } } } |
