diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-06-26 12:08:16 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-06-26 12:08:16 -0400 |
| commit | 6025a89235f0677e38992abee49e914b47e762cb (patch) | |
| tree | eb584963d579027ffbce725dad55fa9ca302dce2 /MediaBrowser.Server.Implementations | |
| parent | 934584313eb1ce97ba26eba343dc1b3cd53f36dc (diff) | |
read 3d format from xml
Diffstat (limited to 'MediaBrowser.Server.Implementations')
5 files changed, 89 insertions, 34 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 3e6370868e..a2ef2fe4e6 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Implementations.Library Directory.CreateDirectory(rootFolderPath); } - var rootFolder = RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder)), typeof(AggregateFolder)) as AggregateFolder ?? (AggregateFolder)ResolvePath(new DirectoryInfo(rootFolderPath)); + var rootFolder = RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)ResolvePath(new DirectoryInfo(rootFolderPath)); // Add in the plug-in folders foreach (var child in PluginFolderCreators) @@ -598,7 +598,7 @@ namespace MediaBrowser.Server.Implementations.Library /// <returns>UserRootFolder.</returns> public UserRootFolder GetUserRootFolder(string userRootPath) { - return _userRootFolders.GetOrAdd(userRootPath, key => RetrieveItem(userRootPath.GetMBId(typeof(UserRootFolder)), typeof(UserRootFolder)) as UserRootFolder ?? + return _userRootFolders.GetOrAdd(userRootPath, key => RetrieveItem(userRootPath.GetMBId(typeof(UserRootFolder))) as UserRootFolder ?? (UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath))); } @@ -793,7 +793,7 @@ namespace MediaBrowser.Server.Implementations.Library var id = path.GetMBId(type); - var item = RetrieveItem(id, type) as T; + var item = RetrieveItem(id) as T; if (item == null) { item = new T @@ -1350,11 +1350,10 @@ namespace MediaBrowser.Server.Implementations.Library /// Retrieves the item. /// </summary> /// <param name="id">The id.</param> - /// <param name="type">The type.</param> /// <returns>BaseItem.</returns> - public BaseItem RetrieveItem(Guid id, Type type) + public BaseItem RetrieveItem(Guid id) { - return ItemRepository.RetrieveItem(id, type); + return ItemRepository.RetrieveItem(id); } private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>(); diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 4cf892c9a1..949b55d650 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -146,6 +146,7 @@ <Compile Include="MediaEncoder\MediaEncoder.cs" /> <Compile Include="Persistence\SqliteChapterRepository.cs" /> <Compile Include="Persistence\SqliteExtensions.cs" /> + <Compile Include="Persistence\TypeMapper.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Providers\ProviderManager.cs" /> <Compile Include="ScheduledTasks\ArtistValidationTask.cs" /> diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index c6fac841b5..9695d90d66 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -23,6 +23,8 @@ namespace MediaBrowser.Server.Implementations.Persistence private SQLiteConnection _connection; private readonly ILogger _logger; + + private TypeMapper _typeMapper = new TypeMapper(); /// <summary> /// Gets the name of the repository @@ -103,11 +105,11 @@ namespace MediaBrowser.Server.Implementations.Persistence string[] queries = { - "create table if not exists baseitems (guid GUID primary key, data BLOB)", - "create index if not exists idx_baseitems on baseitems(guid)", + "create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB)", + "create index if not exists idx_TypedBaseItems on baseitems(guid)", - "create table if not exists ChildDefinitions (ParentId GUID, ItemId GUID, Type TEXT, PRIMARY KEY (ParentId, ItemId))", - "create index if not exists idx_ChildDefinitions on ChildDefinitions(ParentId,ItemId)", + "create table if not exists ChildrenIds (ParentId GUID, ItemId GUID, PRIMARY KEY (ParentId, ItemId))", + "create index if not exists idx_ChildrenIds on ChildrenIds(ParentId,ItemId)", //pragmas "pragma temp_store = memory" @@ -132,27 +134,27 @@ namespace MediaBrowser.Server.Implementations.Persistence { _saveItemCommand = new SQLiteCommand { - CommandText = "replace into baseitems (guid, data) values (@1, @2)" + CommandText = "replace into TypedBaseItems (guid, type, data) values (@1, @2, @3)" }; _saveItemCommand.Parameters.Add(new SQLiteParameter("@1")); _saveItemCommand.Parameters.Add(new SQLiteParameter("@2")); + _saveItemCommand.Parameters.Add(new SQLiteParameter("@3")); _deleteChildrenCommand = new SQLiteCommand { - CommandText = "delete from ChildDefinitions where ParentId=@ParentId" + CommandText = "delete from ChildrenIds where ParentId=@ParentId" }; _deleteChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId")); _saveChildrenCommand = new SQLiteCommand { - CommandText = "replace into ChildDefinitions (ParentId, ItemId, Type) values (@ParentId, @ItemId, @Type)" + CommandText = "replace into ChildrenIds (ParentId, ItemId) values (@ParentId, @ItemId)" }; _saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId")); _saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ItemId")); - _saveChildrenCommand.Parameters.Add(new SQLiteParameter("@Type")); } /// <summary> @@ -210,7 +212,8 @@ namespace MediaBrowser.Server.Implementations.Persistence cancellationToken.ThrowIfCancellationRequested(); _saveItemCommand.Parameters[0].Value = item.Id; - _saveItemCommand.Parameters[1].Value = _jsonSerializer.SerializeToBytes(item); + _saveItemCommand.Parameters[1].Value = item.GetType().FullName; + _saveItemCommand.Parameters[2].Value = _jsonSerializer.SerializeToBytes(item); _saveItemCommand.Transaction = transaction; @@ -254,11 +257,10 @@ namespace MediaBrowser.Server.Implementations.Persistence /// Internal retrieve from items or users table /// </summary> /// <param name="id">The id.</param> - /// <param name="type">The type.</param> /// <returns>BaseItem.</returns> /// <exception cref="System.ArgumentNullException">id</exception> /// <exception cref="System.ArgumentException"></exception> - public BaseItem RetrieveItem(Guid id, Type type) + public BaseItem RetrieveItem(Guid id) { if (id == Guid.Empty) { @@ -267,7 +269,7 @@ namespace MediaBrowser.Server.Implementations.Persistence using (var cmd = _connection.CreateCommand()) { - cmd.CommandText = "select data from baseitems where guid = @guid"; + cmd.CommandText = "select type,data from TypedBaseItems where guid = @guid"; var guidParam = cmd.Parameters.Add("@guid", DbType.Guid); guidParam.Value = id; @@ -275,7 +277,18 @@ namespace MediaBrowser.Server.Implementations.Persistence { if (reader.Read()) { - using (var stream = reader.GetMemoryStream(0)) + var typeString = reader.GetString(0); + + var type = _typeMapper.GetType(typeString); + + if (type == null) + { + _logger.Debug("Unknown type {0}", typeString); + + return null; + } + + using (var stream = reader.GetMemoryStream(1)) { return _jsonSerializer.DeserializeFromStream(stream, type) as BaseItem; } @@ -424,7 +437,7 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - public IEnumerable<ChildDefinition> GetChildren(Guid parentId) + public IEnumerable<Guid> GetChildren(Guid parentId) { if (parentId == Guid.Empty) { @@ -433,7 +446,7 @@ namespace MediaBrowser.Server.Implementations.Persistence using (var cmd = _connection.CreateCommand()) { - cmd.CommandText = "select ItemId,Type from ChildDefinitions where ParentId = @ParentId"; + cmd.CommandText = "select ItemId from ChildrenIds where ParentId = @ParentId"; cmd.Parameters.Add("@ParentId", DbType.Guid).Value = parentId; @@ -441,17 +454,13 @@ namespace MediaBrowser.Server.Implementations.Persistence { while (reader.Read()) { - yield return new ChildDefinition - { - ItemId = reader.GetGuid(0), - Type = reader.GetString(1) - }; + yield return reader.GetGuid(0); } } } } - public async Task SaveChildren(Guid parentId, IEnumerable<ChildDefinition> children, CancellationToken cancellationToken) + public async Task SaveChildren(Guid parentId, IEnumerable<Guid> children, CancellationToken cancellationToken) { if (parentId == Guid.Empty) { @@ -483,13 +492,12 @@ namespace MediaBrowser.Server.Implementations.Persistence _deleteChildrenCommand.Transaction = transaction; await _deleteChildrenCommand.ExecuteNonQueryAsync(cancellationToken); - foreach (var chapter in children) + foreach (var id in children) { cancellationToken.ThrowIfCancellationRequested(); _saveChildrenCommand.Parameters[0].Value = parentId; - _saveChildrenCommand.Parameters[1].Value = chapter.ItemId; - _saveChildrenCommand.Parameters[2].Value = chapter.Type; + _saveChildrenCommand.Parameters[1].Value = id; _saveChildrenCommand.Transaction = transaction; diff --git a/MediaBrowser.Server.Implementations/Persistence/TypeMapper.cs b/MediaBrowser.Server.Implementations/Persistence/TypeMapper.cs new file mode 100644 index 0000000000..2de02d8171 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Persistence/TypeMapper.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; + +namespace MediaBrowser.Server.Implementations.Persistence +{ + /// <summary> + /// Class TypeMapper + /// </summary> + public class TypeMapper + { + /// <summary> + /// This holds all the types in the running assemblies so that we can de-serialize properly when we don't have strong types + /// </summary> + private readonly ConcurrentDictionary<string, Type> _typeMap = new ConcurrentDictionary<string, Type>(); + + /// <summary> + /// Gets the type. + /// </summary> + /// <param name="typeName">Name of the type.</param> + /// <returns>Type.</returns> + /// <exception cref="System.ArgumentNullException"></exception> + public Type GetType(string typeName) + { + if (string.IsNullOrEmpty(typeName)) + { + throw new ArgumentNullException(); + } + + return _typeMap.GetOrAdd(typeName, LookupType); + } + + /// <summary> + /// Lookups the type. + /// </summary> + /// <param name="typeName">Name of the type.</param> + /// <returns>Type.</returns> + private Type LookupType(string typeName) + { + return AppDomain + .CurrentDomain + .GetAssemblies() + .Select(a => a.GetType(typeName, false)) + .FirstOrDefault(t => t != null); + } + } +} diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs index dc8425ac88..b19c41ad36 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs @@ -210,9 +210,9 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks { var allItems = sourceItems.ToList(); - var localTrailers = allItems.SelectMany(i => _itemRepo.RetrieveItems<Trailer>(i.LocalTrailerIds)); + var localTrailers = allItems.SelectMany(i => i.LocalTrailerIds.Select(_itemRepo.RetrieveItem)).Cast<Video>(); - var themeVideos = allItems.SelectMany(i => _itemRepo.RetrieveItems<Video>(i.ThemeVideoIds)); + var themeVideos = allItems.SelectMany(i => i.ThemeVideoIds.Select(_itemRepo.RetrieveItem)).Cast<Video>(); var videos = allItems.OfType<Video>().ToList(); @@ -222,8 +222,8 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks items.AddRange(themeVideos); - items.AddRange(videos.SelectMany(i => _itemRepo.RetrieveItems<Video>(i.AdditionalPartIds)).ToList()); - items.AddRange(videos.OfType<Movie>().SelectMany(i => _itemRepo.RetrieveItems<Video>(i.SpecialFeatureIds)).ToList()); + items.AddRange(videos.SelectMany(i => i.AdditionalPartIds).Select(_itemRepo.RetrieveItem).Cast<Video>()); + items.AddRange(videos.OfType<Movie>().SelectMany(i => i.SpecialFeatureIds).Select(_itemRepo.RetrieveItem).Cast<Video>()); return items.Where(i => { |
