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 +++++++++++----------- 3 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/ChildDefinition.cs (limited to 'MediaBrowser.Controller/Entities') diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index cfabbbadb9..0d7c1862a4 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 0000000000..e8d68b5eab --- /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 de965221b8..762209f702 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; } -- cgit v1.2.3