From 6bc263052d2b60abfd9023aed0640a37655b6e87 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 20 Jun 2013 12:44:24 -0400 Subject: move child definitions to db --- MediaBrowser.Controller/Entities/BaseItem.cs | 1 + .../Entities/ChildDefinition.cs | 22 ++++++++ MediaBrowser.Controller/Entities/Folder.cs | 60 +++++++++++----------- .../MediaBrowser.Controller.csproj | 1 + .../Persistence/IDisplayPreferencesRepository.cs | 6 +++ .../Persistence/IItemRepository.cs | 22 ++++++++ MediaBrowser.Controller/Persistence/IRepository.cs | 6 --- .../Persistence/IUserDataRepository.cs | 6 +++ .../Persistence/IUserRepository.cs | 6 +++ 9 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/ChildDefinition.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index cfabbbadb..0d7c1862a 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -143,6 +143,7 @@ namespace MediaBrowser.Controller.Entities public static IServerConfigurationManager ConfigurationManager { get; set; } public static IProviderManager ProviderManager { get; set; } public static ILocalizationManager LocalizationManager { get; set; } + public static IItemRepository ItemRepository { get; set; } /// /// Returns a that represents this instance. diff --git a/MediaBrowser.Controller/Entities/ChildDefinition.cs b/MediaBrowser.Controller/Entities/ChildDefinition.cs new file mode 100644 index 000000000..e8d68b5ea --- /dev/null +++ b/MediaBrowser.Controller/Entities/ChildDefinition.cs @@ -0,0 +1,22 @@ +using System; + +namespace MediaBrowser.Controller.Entities +{ + /// + /// Class ChildDefinition + /// + public class ChildDefinition + { + /// + /// Gets or sets the item id. + /// + /// The item id. + public Guid ItemId { get; set; } + + /// + /// Gets or sets the type. + /// + /// The type. + public string Type { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index de965221b..762209f70 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -22,14 +22,7 @@ namespace MediaBrowser.Controller.Entities /// public class Folder : BaseItem { - private static TypeMapper _typeMapper = new TypeMapper(); - - public Folder() - { - ChildDefinitions = new ConcurrentDictionary(); - } - - public ConcurrentDictionary ChildDefinitions { get; set; } + private static readonly TypeMapper _typeMapper = new TypeMapper(); /// /// Gets a value indicating whether this instance is folder. @@ -118,14 +111,19 @@ namespace MediaBrowser.Controller.Entities item.DateModified = DateTime.Now; } - if (!_children.TryAdd(item.Id, item) || !ChildDefinitions.TryAdd(item.Id, item.GetType().FullName)) + if (!_children.TryAdd(item.Id, item)) { throw new InvalidOperationException("Unable to add " + item.Name); } await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); - await LibraryManager.UpdateItem(this, cancellationToken).ConfigureAwait(false); + await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition + { + ItemId = i.Id, + Type = i.GetType().FullName + + }), cancellationToken).ConfigureAwait(false); } /// @@ -153,18 +151,22 @@ namespace MediaBrowser.Controller.Entities public Task RemoveChild(BaseItem item, CancellationToken cancellationToken) { BaseItem removed; - string removedType; - if (!_children.TryRemove(item.Id, out removed) || !ChildDefinitions.TryRemove(item.Id, out removedType)) + if (!_children.TryRemove(item.Id, out removed)) { throw new InvalidOperationException("Unable to remove " + item.Name); } item.Parent = null; - + LibraryManager.ReportItemRemoved(item); - return LibraryManager.UpdateItem(this, cancellationToken); + return ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition + { + ItemId = i.Id, + Type = i.GetType().FullName + + }), cancellationToken); } #region Indexing @@ -297,7 +299,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => i != null) .Select(a => new IndexFolder(us, a, songs.Where(i => string.Equals(i.Artist, a.Name, StringComparison.OrdinalIgnoreCase) - ), currentIndexName)).Concat(indexFolders); + ), currentIndexName)).Concat(indexFolders); } return indexFolders; @@ -495,7 +497,7 @@ namespace MediaBrowser.Controller.Entities /// Gets or sets the actual children. /// /// The actual children. - protected virtual ConcurrentDictionary ActualChildren + protected virtual ConcurrentDictionary ActualChildren { get { @@ -558,10 +560,10 @@ namespace MediaBrowser.Controller.Entities /// We want this sychronous. /// /// ConcurrentBag{BaseItem}. - protected virtual ConcurrentDictionary LoadChildren() + protected virtual ConcurrentDictionary LoadChildren() { //just load our children from the repo - the library will be validated and maintained in other processes - return new ConcurrentDictionary(GetCachedChildren().ToDictionary(i => i.Id)); + return new ConcurrentDictionary(GetCachedChildren().ToDictionary(i => i.Id)); } /// @@ -709,9 +711,6 @@ namespace MediaBrowser.Controller.Entities } else { - string removedType; - ChildDefinitions.TryRemove(item.Id, out removedType); - LibraryManager.ReportItemRemoved(item); } } @@ -726,13 +725,16 @@ namespace MediaBrowser.Controller.Entities } else { - ChildDefinitions.TryAdd(item.Id, item.GetType().FullName); - Logger.Debug("** " + item.Name + " Added to library."); } } - await LibraryManager.UpdateItem(this, CancellationToken.None).ConfigureAwait(false); + await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition + { + ItemId = i.Id, + Type = i.GetType().FullName + + }), cancellationToken).ConfigureAwait(false); //force the indexes to rebuild next time IndexCache.Clear(); @@ -804,7 +806,7 @@ namespace MediaBrowser.Controller.Entities { lock (percentages) { - percentages[child.Id] = p/100; + percentages[child.Id] = p / 100; var percent = percentages.Values.Sum(); percent /= list.Count; @@ -862,7 +864,7 @@ namespace MediaBrowser.Controller.Entities /// IEnumerable{BaseItem}. protected IEnumerable GetCachedChildren() { - var items = ChildDefinitions.ToList().Select(RetrieveChild).Where(i => i != null).ToList(); + var items = ItemRepository.GetChildren(Id).Select(RetrieveChild).Where(i => i != null).ToList(); foreach (var item in items) { @@ -877,9 +879,9 @@ namespace MediaBrowser.Controller.Entities /// /// The child. /// BaseItem. - private BaseItem RetrieveChild(KeyValuePair child) + private BaseItem RetrieveChild(ChildDefinition child) { - var type = child.Value; + var type = child.Type; var itemType = _typeMapper.GetType(type); @@ -889,7 +891,7 @@ namespace MediaBrowser.Controller.Entities return null; } - var item = LibraryManager.RetrieveItem(child.Key, itemType); + var item = LibraryManager.RetrieveItem(child.ItemId, itemType); return item is IByReferenceItem ? LibraryManager.GetOrAddByReferenceItem(item) : item; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index f49221ce8..bea2e9e69 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -74,6 +74,7 @@ + diff --git a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs index 4d7345f48..ecd8c1136 100644 --- a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs +++ b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs @@ -10,6 +10,12 @@ namespace MediaBrowser.Controller.Persistence /// public interface IDisplayPreferencesRepository : IRepository { + /// + /// Opens the connection to the repository + /// + /// Task. + Task Initialize(); + /// /// Saves display preferences for an item /// diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index 534e64a3f..2331ec32f 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -13,6 +13,12 @@ namespace MediaBrowser.Controller.Persistence /// public interface IItemRepository : IRepository { + /// + /// Opens the connection to the repository + /// + /// Task. + Task Initialize(); + /// /// Saves an item /// @@ -75,6 +81,22 @@ namespace MediaBrowser.Controller.Persistence /// The cancellation token. /// Task. Task SaveChapters(Guid id, IEnumerable chapters, CancellationToken cancellationToken); + + /// + /// Gets the children. + /// + /// The parent id. + /// IEnumerable{ChildDefinition}. + IEnumerable GetChildren(Guid parentId); + + /// + /// Saves the children. + /// + /// The parent id. + /// The children. + /// The cancellation token. + /// Task. + Task SaveChildren(Guid parentId, IEnumerable children, CancellationToken cancellationToken); } /// diff --git a/MediaBrowser.Controller/Persistence/IRepository.cs b/MediaBrowser.Controller/Persistence/IRepository.cs index 2d051aa82..f6367c384 100644 --- a/MediaBrowser.Controller/Persistence/IRepository.cs +++ b/MediaBrowser.Controller/Persistence/IRepository.cs @@ -8,12 +8,6 @@ namespace MediaBrowser.Controller.Persistence /// public interface IRepository : IDisposable { - /// - /// Opens the connection to the repository - /// - /// Task. - Task Initialize(); - /// /// Gets the name of the repository /// diff --git a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs index ad111f4ed..bdeaf70dc 100644 --- a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs @@ -10,6 +10,12 @@ namespace MediaBrowser.Controller.Persistence /// public interface IUserDataRepository : IRepository { + /// + /// Opens the connection to the repository + /// + /// Task. + Task Initialize(); + /// /// Saves the user data. /// diff --git a/MediaBrowser.Controller/Persistence/IUserRepository.cs b/MediaBrowser.Controller/Persistence/IUserRepository.cs index 80961a369..0241b8c03 100644 --- a/MediaBrowser.Controller/Persistence/IUserRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserRepository.cs @@ -10,6 +10,12 @@ namespace MediaBrowser.Controller.Persistence /// public interface IUserRepository : IRepository { + /// + /// Opens the connection to the repository + /// + /// Task. + Task Initialize(); + /// /// Deletes the user. /// -- cgit v1.2.3