signalr cleanup
This commit is contained in:
parent
feda4a9b67
commit
25e2c98c45
|
@ -4,6 +4,7 @@ using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Marr.Data;
|
using Marr.Data;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Api.Commands;
|
||||||
using NzbDrone.Api.Config;
|
using NzbDrone.Api.Config;
|
||||||
using NzbDrone.Api.Episodes;
|
using NzbDrone.Api.Episodes;
|
||||||
using NzbDrone.Api.History;
|
using NzbDrone.Api.History;
|
||||||
|
@ -17,12 +18,15 @@ using NzbDrone.Api.Update;
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Instrumentation;
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
using NzbDrone.Core.RootFolders;
|
using NzbDrone.Core.RootFolders;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Update;
|
using NzbDrone.Core.Update;
|
||||||
|
using NzbDrone.Core.Update.Commands;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
@ -40,9 +44,9 @@ namespace NzbDrone.Api.Test.MappingTests
|
||||||
[TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))]
|
[TestCase(typeof(ParsedEpisodeInfo), typeof(ReleaseResource))]
|
||||||
[TestCase(typeof(DownloadDecision), typeof(ReleaseResource))]
|
[TestCase(typeof(DownloadDecision), typeof(ReleaseResource))]
|
||||||
[TestCase(typeof(Core.History.History), typeof(HistoryResource))]
|
[TestCase(typeof(Core.History.History), typeof(HistoryResource))]
|
||||||
[TestCase(typeof(UpdatePackage), typeof(UpdateResource))]
|
|
||||||
[TestCase(typeof(Quality), typeof(QualityResource))]
|
[TestCase(typeof(Quality), typeof(QualityResource))]
|
||||||
[TestCase(typeof(Log), typeof(LogResource))]
|
[TestCase(typeof(Log), typeof(LogResource))]
|
||||||
|
[TestCase(typeof(Command), typeof(CommandResource))]
|
||||||
public void matching_fields(Type modelType, Type resourceType)
|
public void matching_fields(Type modelType, Type resourceType)
|
||||||
{
|
{
|
||||||
MappingValidation.ValidateMapping(modelType, resourceType);
|
MappingValidation.ValidateMapping(modelType, resourceType);
|
||||||
|
@ -116,6 +120,15 @@ namespace NzbDrone.Api.Test.MappingTests
|
||||||
profileResource.InjectTo<QualityProfile>();
|
profileResource.InjectTo<QualityProfile>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_map_tracked_command()
|
||||||
|
{
|
||||||
|
var profileResource = new ApplicationUpdateCommand();
|
||||||
|
profileResource.InjectTo<CommandResource>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ModelWithLazy
|
public class ModelWithLazy
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.AspNet.SignalR;
|
|
||||||
using Microsoft.AspNet.SignalR.Infrastructure;
|
|
||||||
using NzbDrone.Api.SignalR;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Common.Messaging.Events;
|
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Commands
|
|
||||||
{
|
|
||||||
public class CommandConnection : NzbDronePersistentConnection,
|
|
||||||
IHandleAsync<CommandStartedEvent>,
|
|
||||||
IHandleAsync<CommandCompletedEvent>,
|
|
||||||
IHandleAsync<CommandFailedEvent>
|
|
||||||
{
|
|
||||||
public override string Resource
|
|
||||||
{
|
|
||||||
get { return "/Command"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(CommandStartedEvent message)
|
|
||||||
{
|
|
||||||
BroadcastMessage(message.TrackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(CommandCompletedEvent message)
|
|
||||||
{
|
|
||||||
BroadcastMessage(message.TrackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(CommandFailedEvent message)
|
|
||||||
{
|
|
||||||
BroadcastMessage(message.TrackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void BroadcastMessage(TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
var context = ((ConnectionManager)GlobalHost.ConnectionManager).GetConnection(GetType());
|
|
||||||
context.Connection.Broadcast(trackedCommand);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +1,68 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Nancy;
|
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Mapping;
|
using NzbDrone.Api.Mapping;
|
||||||
|
using NzbDrone.Api.Validation;
|
||||||
using NzbDrone.Common.Composition;
|
using NzbDrone.Common.Composition;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Datastore.Events;
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
using NzbDrone.Core.Messaging.Tracking;
|
||||||
|
using NzbDrone.Core.ProgressMessaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Commands
|
namespace NzbDrone.Api.Commands
|
||||||
{
|
{
|
||||||
public class CommandModule : NzbDroneRestModule<CommandResource>
|
public class CommandModule : NzbDroneRestModuleWithSignalR<CommandResource, Command>, IHandle<CommandUpdatedEvent>
|
||||||
{
|
{
|
||||||
private readonly IMessageAggregator _messageAggregator;
|
private readonly IMessageAggregator _messageAggregator;
|
||||||
private readonly IContainer _container;
|
private readonly IContainer _container;
|
||||||
private readonly ITrackCommands _trackCommands;
|
private readonly ITrackCommands _trackCommands;
|
||||||
|
|
||||||
public CommandModule(IMessageAggregator messageAggregator, IContainer container, ITrackCommands trackCommands)
|
public CommandModule(IMessageAggregator messageAggregator, IContainer container, ITrackCommands trackCommands)
|
||||||
|
: base(messageAggregator)
|
||||||
{
|
{
|
||||||
_messageAggregator = messageAggregator;
|
_messageAggregator = messageAggregator;
|
||||||
_container = container;
|
_container = container;
|
||||||
_trackCommands = trackCommands;
|
_trackCommands = trackCommands;
|
||||||
|
|
||||||
Post["/"] = x => RunCommand(ReadResourceFromRequest());
|
GetResourceById = GetCommand;
|
||||||
Get["/"] = x => GetAllCommands();
|
CreateResource = StartCommand;
|
||||||
|
GetResourceAll = GetAllCommands;
|
||||||
|
|
||||||
|
PostValidator.RuleFor(c => c.Name).NotBlank();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response RunCommand(CommandResource resource)
|
private CommandResource GetCommand(int id)
|
||||||
|
{
|
||||||
|
return _trackCommands.GetById(id).InjectTo<CommandResource>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int StartCommand(CommandResource commandResource)
|
||||||
{
|
{
|
||||||
var commandType =
|
var commandType =
|
||||||
_container.GetImplementations(typeof(ICommand))
|
_container.GetImplementations(typeof(Command))
|
||||||
.Single(c => c.Name.Replace("Command", "")
|
.Single(c => c.Name.Replace("Command", "")
|
||||||
.Equals(resource.Command, StringComparison.InvariantCultureIgnoreCase));
|
.Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
dynamic command = Request.Body.FromJson(commandType);
|
dynamic command = Request.Body.FromJson(commandType);
|
||||||
|
|
||||||
var response = (TrackedCommand) _messageAggregator.PublishCommandAsync(command);
|
var trackedCommand = (Command)_messageAggregator.PublishCommandAsync(command);
|
||||||
|
return trackedCommand.Id;
|
||||||
return response.AsResponse(HttpStatusCode.Created);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response GetAllCommands()
|
private List<CommandResource> GetAllCommands()
|
||||||
{
|
{
|
||||||
return _trackCommands.AllTracked().AsResponse();
|
return ToListResource(_trackCommands.RunningCommands);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(CommandUpdatedEvent message)
|
||||||
|
{
|
||||||
|
if (message.Command.SendUpdatesToClient)
|
||||||
|
{
|
||||||
|
BroadcastResourceChange(ModelAction.Updated, message.Command.Id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,9 +1,16 @@
|
||||||
using NzbDrone.Api.REST;
|
using System;
|
||||||
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Messaging.Tracking;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Commands
|
namespace NzbDrone.Api.Commands
|
||||||
{
|
{
|
||||||
public class CommandResource : RestResource
|
public class CommandResource : RestResource
|
||||||
{
|
{
|
||||||
public string Command { get; set; }
|
public String Name { get; set; }
|
||||||
|
public String Message { get; set; }
|
||||||
|
public DateTime StartedOn { get; set; }
|
||||||
|
public DateTime StateChangeTime { get; set; }
|
||||||
|
public Boolean SendUpdatesToClient { get; set; }
|
||||||
|
public CommandStatus State { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,24 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.AspNet.SignalR;
|
|
||||||
using Microsoft.AspNet.SignalR.Infrastructure;
|
|
||||||
using NzbDrone.Api.SignalR;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Download;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Episodes
|
|
||||||
{
|
|
||||||
public class EpisodeConnection : BasicResourceConnection<Episode>, IHandleAsync<EpisodeGrabbedEvent>
|
|
||||||
{
|
|
||||||
public override string Resource
|
|
||||||
{
|
|
||||||
get { return "/Episodes"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(EpisodeGrabbedEvent message)
|
|
||||||
{
|
|
||||||
var context = ((ConnectionManager)GlobalHost.ConnectionManager).GetConnection(GetType());
|
|
||||||
context.Connection.Broadcast(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,9 +7,9 @@ using NzbDrone.Api.ErrorManagement;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Extensions.Pipelines;
|
using NzbDrone.Api.Extensions.Pipelines;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Instrumentation;
|
using NzbDrone.Core.Instrumentation;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.ProgressMessaging;
|
using NzbDrone.Core.ProgressMessaging;
|
||||||
using TinyIoC;
|
using TinyIoC;
|
||||||
|
|
||||||
|
|
|
@ -83,19 +83,14 @@
|
||||||
<Compile Include="ClientSchema\SelectOption.cs" />
|
<Compile Include="ClientSchema\SelectOption.cs" />
|
||||||
<Compile Include="Commands\CommandModule.cs" />
|
<Compile Include="Commands\CommandModule.cs" />
|
||||||
<Compile Include="Commands\CommandResource.cs" />
|
<Compile Include="Commands\CommandResource.cs" />
|
||||||
<Compile Include="Commands\CommandConnection.cs" />
|
|
||||||
<Compile Include="Config\NamingConfigResource.cs" />
|
<Compile Include="Config\NamingConfigResource.cs" />
|
||||||
<Compile Include="Config\NamingModule.cs" />
|
<Compile Include="Config\NamingModule.cs" />
|
||||||
<Compile Include="ProgressMessaging\ProgressMessageConnection.cs" />
|
|
||||||
<Compile Include="ProgressMessaging\ProgressMessageModule.cs" />
|
|
||||||
<Compile Include="ProgressMessaging\ProgressMessageResource.cs" />
|
|
||||||
<Compile Include="EpisodeFiles\EpisodeFileModule.cs" />
|
<Compile Include="EpisodeFiles\EpisodeFileModule.cs" />
|
||||||
<Compile Include="EpisodeFiles\EpisodeFileResource.cs" />
|
<Compile Include="EpisodeFiles\EpisodeFileResource.cs" />
|
||||||
<Compile Include="Directories\DirectoryLookupService.cs" />
|
<Compile Include="Directories\DirectoryLookupService.cs" />
|
||||||
<Compile Include="Directories\DirectoryModule.cs" />
|
<Compile Include="Directories\DirectoryModule.cs" />
|
||||||
<Compile Include="Episodes\EpisodeModule.cs" />
|
<Compile Include="Episodes\EpisodeModule.cs" />
|
||||||
<Compile Include="Episodes\EpisodeResource.cs" />
|
<Compile Include="Episodes\EpisodeResource.cs" />
|
||||||
<Compile Include="Episodes\EpisodeConnection.cs" />
|
|
||||||
<Compile Include="Extensions\Pipelines\CacheHeaderPipeline.cs" />
|
<Compile Include="Extensions\Pipelines\CacheHeaderPipeline.cs" />
|
||||||
<Compile Include="Extensions\Pipelines\GZipPipeline.cs" />
|
<Compile Include="Extensions\Pipelines\GZipPipeline.cs" />
|
||||||
<Compile Include="Extensions\Pipelines\IfModifiedPipeline.cs" />
|
<Compile Include="Extensions\Pipelines\IfModifiedPipeline.cs" />
|
||||||
|
@ -127,6 +122,8 @@
|
||||||
<Compile Include="Mapping\ValueInjectorExtensions.cs" />
|
<Compile Include="Mapping\ValueInjectorExtensions.cs" />
|
||||||
<Compile Include="Missing\MissingModule.cs" />
|
<Compile Include="Missing\MissingModule.cs" />
|
||||||
<Compile Include="Config\NamingSampleResource.cs" />
|
<Compile Include="Config\NamingSampleResource.cs" />
|
||||||
|
<Compile Include="NzbDroneRestModuleWithSignalR.cs" />
|
||||||
|
<Compile Include="ResourceChangeMessage.cs" />
|
||||||
<Compile Include="Notifications\NotificationSchemaModule.cs" />
|
<Compile Include="Notifications\NotificationSchemaModule.cs" />
|
||||||
<Compile Include="Notifications\NotificationModule.cs" />
|
<Compile Include="Notifications\NotificationModule.cs" />
|
||||||
<Compile Include="Notifications\NotificationResource.cs" />
|
<Compile Include="Notifications\NotificationResource.cs" />
|
||||||
|
@ -139,8 +136,6 @@
|
||||||
<Compile Include="REST\RestResource.cs" />
|
<Compile Include="REST\RestResource.cs" />
|
||||||
<Compile Include="RootFolders\RootFolderModule.cs" />
|
<Compile Include="RootFolders\RootFolderModule.cs" />
|
||||||
<Compile Include="RootFolders\RootFolderResource.cs" />
|
<Compile Include="RootFolders\RootFolderResource.cs" />
|
||||||
<Compile Include="RootFolders\RootFolderConnection.cs" />
|
|
||||||
<Compile Include="Series\SeriesConnection.cs" />
|
|
||||||
<Compile Include="Series\SeriesResource.cs" />
|
<Compile Include="Series\SeriesResource.cs" />
|
||||||
<Compile Include="Series\SeriesModule.cs" />
|
<Compile Include="Series\SeriesModule.cs" />
|
||||||
<Compile Include="Series\SeriesLookupModule.cs" />
|
<Compile Include="Series\SeriesLookupModule.cs" />
|
||||||
|
@ -158,11 +153,6 @@
|
||||||
<Compile Include="Qualities\QualitySizeModule.cs" />
|
<Compile Include="Qualities\QualitySizeModule.cs" />
|
||||||
<Compile Include="Extensions\ReqResExtensions.cs" />
|
<Compile Include="Extensions\ReqResExtensions.cs" />
|
||||||
<Compile Include="Config\SettingsModule.cs" />
|
<Compile Include="Config\SettingsModule.cs" />
|
||||||
<Compile Include="SignalR\BasicResourceConnection.cs" />
|
|
||||||
<Compile Include="SignalR\NoOpPerformanceCounterManager.cs" />
|
|
||||||
<Compile Include="SignalR\Serializer.cs" />
|
|
||||||
<Compile Include="SignalR\SignalrDependencyResolver.cs" />
|
|
||||||
<Compile Include="SignalR\NzbDronePersistentConnection.cs" />
|
|
||||||
<Compile Include="System\SystemModule.cs" />
|
<Compile Include="System\SystemModule.cs" />
|
||||||
<Compile Include="TinyIoCNancyBootstrapper.cs" />
|
<Compile Include="TinyIoCNancyBootstrapper.cs" />
|
||||||
<Compile Include="Update\UpdateModule.cs" />
|
<Compile Include="Update\UpdateModule.cs" />
|
||||||
|
@ -185,6 +175,10 @@
|
||||||
<Project>{ff5ee3b6-913b-47ce-9ceb-11c51b4e1205}</Project>
|
<Project>{ff5ee3b6-913b-47ce-9ceb-11c51b4e1205}</Project>
|
||||||
<Name>NzbDrone.Core</Name>
|
<Name>NzbDrone.Core</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\NzbDrone.SignalR\NzbDrone.SignalR.csproj">
|
||||||
|
<Project>{7c2cc69f-5ca0-4e5c-85cb-983f9f6c3b36}</Project>
|
||||||
|
<Name>NzbDrone.SignalR</Name>
|
||||||
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -196,4 +190,4 @@
|
||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
</Target>
|
</Target>
|
||||||
-->
|
-->
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,6 +9,8 @@ namespace NzbDrone.Api
|
||||||
{
|
{
|
||||||
public abstract class NzbDroneRestModule<TResource> : RestModule<TResource> where TResource : RestResource, new()
|
public abstract class NzbDroneRestModule<TResource> : RestModule<TResource> where TResource : RestResource, new()
|
||||||
{
|
{
|
||||||
|
protected string Resource { get; private set; }
|
||||||
|
|
||||||
protected NzbDroneRestModule()
|
protected NzbDroneRestModule()
|
||||||
: this(new TResource().ResourceName)
|
: this(new TResource().ResourceName)
|
||||||
{
|
{
|
||||||
|
@ -17,6 +19,7 @@ namespace NzbDrone.Api
|
||||||
protected NzbDroneRestModule(string resource)
|
protected NzbDroneRestModule(string resource)
|
||||||
: base("/api/" + resource.Trim('/'))
|
: base("/api/" + resource.Trim('/'))
|
||||||
{
|
{
|
||||||
|
Resource = resource;
|
||||||
PostValidator.RuleFor(r => r.Id).IsZero();
|
PostValidator.RuleFor(r => r.Id).IsZero();
|
||||||
PutValidator.RuleFor(r => r.Id).ValidId();
|
PutValidator.RuleFor(r => r.Id).ValidId();
|
||||||
}
|
}
|
||||||
|
@ -28,7 +31,7 @@ namespace NzbDrone.Api
|
||||||
return model.Id;
|
return model.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<TResource> ToListResource<TModel>(Func<IEnumerable<TModel>> function) where TModel : ModelBase, new()
|
protected List<TResource> ToListResource<TModel>(Func<IEnumerable<TModel>> function) where TModel : class
|
||||||
{
|
{
|
||||||
var modelList = function();
|
var modelList = function();
|
||||||
return modelList.InjectTo<List<TResource>>();
|
return modelList.InjectTo<List<TResource>>();
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Datastore.Events;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.SignalR;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api
|
||||||
|
{
|
||||||
|
public abstract class NzbDroneRestModuleWithSignalR<TResource, TModel> : NzbDroneRestModule<TResource>, IHandle<ModelEvent<TModel>>
|
||||||
|
where TResource : RestResource, new()
|
||||||
|
where TModel : ModelBase
|
||||||
|
{
|
||||||
|
private readonly IMessageAggregator _messageAggregator;
|
||||||
|
|
||||||
|
protected NzbDroneRestModuleWithSignalR(IMessageAggregator messageAggregator)
|
||||||
|
{
|
||||||
|
_messageAggregator = messageAggregator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(ModelEvent<TModel> message)
|
||||||
|
{
|
||||||
|
if (message.Action == ModelAction.Deleted || message.Action == ModelAction.Sync)
|
||||||
|
{
|
||||||
|
BroadcastResourceChange(message.Action);
|
||||||
|
}
|
||||||
|
|
||||||
|
BroadcastResourceChange(message.Action, message.Model.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void BroadcastResourceChange(ModelAction action, int id)
|
||||||
|
{
|
||||||
|
var resource = GetResourceById(id);
|
||||||
|
|
||||||
|
var signalRMessage = new SignalRMessage
|
||||||
|
{
|
||||||
|
Name = Resource,
|
||||||
|
Body = new ResourceChangeMessage<TResource>(resource, action)
|
||||||
|
};
|
||||||
|
|
||||||
|
_messageAggregator.PublishCommand(new BroadcastSignalRMessage(signalRMessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void BroadcastResourceChange(ModelAction action)
|
||||||
|
{
|
||||||
|
var signalRMessage = new SignalRMessage
|
||||||
|
{
|
||||||
|
Name = Resource,
|
||||||
|
Body = new ResourceChangeMessage<TResource>(action)
|
||||||
|
};
|
||||||
|
|
||||||
|
_messageAggregator.PublishCommand(new BroadcastSignalRMessage(signalRMessage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,24 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.AspNet.SignalR;
|
|
||||||
using Microsoft.AspNet.SignalR.Infrastructure;
|
|
||||||
using NzbDrone.Api.SignalR;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.ProgressMessaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.ProgressMessaging
|
|
||||||
{
|
|
||||||
public class ProgressMessageConnection : NzbDronePersistentConnection,
|
|
||||||
IHandleAsync<NewProgressMessageEvent>
|
|
||||||
{
|
|
||||||
public override string Resource
|
|
||||||
{
|
|
||||||
get { return "/ProgressMessage"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(NewProgressMessageEvent message)
|
|
||||||
{
|
|
||||||
var context = ((ConnectionManager)GlobalHost.ConnectionManager).GetConnection(GetType());
|
|
||||||
context.Connection.Broadcast(message.ProgressMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Nancy;
|
|
||||||
using NzbDrone.Api.Extensions;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.ProgressMessaging
|
|
||||||
{
|
|
||||||
public class ProgressMessageModule : NzbDroneRestModule<ProgressMessageResource>
|
|
||||||
{
|
|
||||||
public ProgressMessageModule()
|
|
||||||
{
|
|
||||||
Get["/"] = x => GetAllMessages();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Response GetAllMessages()
|
|
||||||
{
|
|
||||||
return new List<ProgressMessageResource>().AsResponse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
using System;
|
|
||||||
using NzbDrone.Api.REST;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.ProgressMessaging
|
|
||||||
{
|
|
||||||
public class ProgressMessageResource : RestResource
|
|
||||||
{
|
|
||||||
public DateTime Time { get; set; }
|
|
||||||
public String CommandId { get; set; }
|
|
||||||
public String Message { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -61,7 +61,7 @@ namespace NzbDrone.Api.REST
|
||||||
|
|
||||||
protected Func<int, TResource> GetResourceById
|
protected Func<int, TResource> GetResourceById
|
||||||
{
|
{
|
||||||
private get { return _getResourceById; }
|
get { return _getResourceById; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_getResourceById = value;
|
_getResourceById = value;
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
using System;
|
||||||
|
using NzbDrone.Api.REST;
|
||||||
|
using NzbDrone.Core.Datastore.Events;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api
|
||||||
|
{
|
||||||
|
public class ResourceChangeMessage<TResource> where TResource : RestResource
|
||||||
|
{
|
||||||
|
public TResource Resource { get; private set; }
|
||||||
|
public ModelAction Action { get; private set; }
|
||||||
|
|
||||||
|
public ResourceChangeMessage(ModelAction action)
|
||||||
|
{
|
||||||
|
if (action != ModelAction.Deleted || action != ModelAction.Sync)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Resource message without a resource needs to have Delete or Sync as action");
|
||||||
|
}
|
||||||
|
|
||||||
|
Action = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResourceChangeMessage(TResource resource, ModelAction action)
|
||||||
|
{
|
||||||
|
Resource = resource;
|
||||||
|
Action = action;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,13 +0,0 @@
|
||||||
using NzbDrone.Api.SignalR;
|
|
||||||
using NzbDrone.Core.RootFolders;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.RootFolders
|
|
||||||
{
|
|
||||||
public class RootFolderConnection : BasicResourceConnection<RootFolder>
|
|
||||||
{
|
|
||||||
public override string Resource
|
|
||||||
{
|
|
||||||
get { return "RootFolder"; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
using NzbDrone.Api.SignalR;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.Series
|
|
||||||
{
|
|
||||||
public class SeriesConnection : BasicResourceConnection<Core.Tv.Series>
|
|
||||||
{
|
|
||||||
public override string Resource
|
|
||||||
{
|
|
||||||
get { return "/Series"; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNet.SignalR;
|
|
||||||
using Microsoft.AspNet.SignalR.Infrastructure;
|
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common.Instrumentation;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
|
||||||
using NzbDrone.Core.Datastore.Events;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.SignalR
|
|
||||||
{
|
|
||||||
public abstract class BasicResourceConnection<T> :
|
|
||||||
NzbDronePersistentConnection,
|
|
||||||
IHandleAsync<ModelEvent<T>>
|
|
||||||
where T : ModelBase
|
|
||||||
{
|
|
||||||
private readonly Logger _logger;
|
|
||||||
|
|
||||||
|
|
||||||
public BasicResourceConnection()
|
|
||||||
{
|
|
||||||
_logger = NzbDroneLogger.GetLogger(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override Task OnConnected(IRequest request, string connectionId)
|
|
||||||
{
|
|
||||||
_logger.Trace("SignalR client connected. ID:{0}", connectionId);
|
|
||||||
return base.OnConnected(request, connectionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HandleAsync(ModelEvent<T> message)
|
|
||||||
{
|
|
||||||
var context = ((ConnectionManager)GlobalHost.ConnectionManager).GetConnection(GetType());
|
|
||||||
context.Connection.Broadcast(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
using Microsoft.AspNet.SignalR;
|
|
||||||
|
|
||||||
namespace NzbDrone.Api.SignalR
|
|
||||||
{
|
|
||||||
public abstract class NzbDronePersistentConnection : PersistentConnection
|
|
||||||
{
|
|
||||||
public abstract string Resource { get; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -33,8 +33,6 @@ namespace NzbDrone.Api.Update
|
||||||
|
|
||||||
public class UpdateResource : RestResource
|
public class UpdateResource : RestResource
|
||||||
{
|
{
|
||||||
public String Id { get; set; }
|
|
||||||
|
|
||||||
[JsonConverter(typeof(Newtonsoft.Json.Converters.VersionConverter))]
|
[JsonConverter(typeof(Newtonsoft.Json.Converters.VersionConverter))]
|
||||||
public Version Version { get; set; }
|
public Version Version { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -27,5 +27,10 @@ namespace NzbDrone.Api.Validation
|
||||||
{
|
{
|
||||||
return ruleBuilder.SetValidator(new PathValidator());
|
return ruleBuilder.SetValidator(new PathValidator());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IRuleBuilderOptions<T, string> NotBlank<T>(this IRuleBuilder<T, string> ruleBuilder)
|
||||||
|
{
|
||||||
|
return ruleBuilder.SetValidator(new NotNullValidator()).SetValidator(new NotEmptyValidator(""));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,12 +2,12 @@
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Jobs;
|
using NzbDrone.Core.Jobs;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Host;
|
using NzbDrone.Host;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.Update.Commands;
|
||||||
|
|
||||||
|
namespace NzbDrone.Common.Test.MessagingTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CommandBaseFixture
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void default_values()
|
||||||
|
{
|
||||||
|
var command = new ApplicationUpdateCommand();
|
||||||
|
|
||||||
|
command.Id.Should().NotBe(0);
|
||||||
|
command.Name.Should().Be("ApplicationUpdate");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,9 @@
|
||||||
using System;
|
using FluentAssertions;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using FluentAssertions;
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.IndexerSearch;
|
using NzbDrone.Core.IndexerSearch;
|
||||||
using NzbDrone.Core.MediaFiles.Commands;
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Test.MessagingTests
|
namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
|
@ -18,9 +15,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new DownloadedEpisodesScanCommand();
|
var command1 = new DownloadedEpisodesScanCommand();
|
||||||
var command2 = new DownloadedEpisodesScanCommand();
|
var command2 = new DownloadedEpisodesScanCommand();
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeTrue();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -28,9 +24,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new EpisodeSearchCommand { EpisodeId = 1 };
|
var command1 = new EpisodeSearchCommand { EpisodeId = 1 };
|
||||||
var command2 = new EpisodeSearchCommand { EpisodeId = 1 };
|
var command2 = new EpisodeSearchCommand { EpisodeId = 1 };
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeTrue();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -38,9 +33,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
||||||
var command2 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
var command2 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeTrue();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -48,9 +42,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new EpisodeSearchCommand { EpisodeId = 1 };
|
var command1 = new EpisodeSearchCommand { EpisodeId = 1 };
|
||||||
var command2 = new EpisodeSearchCommand { EpisodeId = 2 };
|
var command2 = new EpisodeSearchCommand { EpisodeId = 2 };
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeFalse();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -58,9 +51,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
||||||
var command2 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 2 };
|
var command2 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 2 };
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeFalse();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -68,9 +60,8 @@ namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
var command1 = new SeasonSearchCommand { SeriesId = 1, SeasonNumber = 1 };
|
||||||
var command2 = new SeasonSearchCommand { SeriesId = 2, SeasonNumber = 2 };
|
var command2 = new SeasonSearchCommand { SeriesId = 2, SeasonNumber = 2 };
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
|
|
||||||
comparer.Equals(command1, command2).Should().BeFalse();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
using NzbDrone.Core.Messaging.Tracking;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Test.EventingTests
|
namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class MessageAggregatorCommandTests : TestBase<MessageAggregator>
|
public class MessageAggregatorCommandTests : TestBase<MessageAggregator>
|
||||||
|
@ -28,13 +29,10 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
.Setup(c => c.Build(typeof(IExecute<CommandB>)))
|
.Setup(c => c.Build(typeof(IExecute<CommandB>)))
|
||||||
.Returns(_executorB.Object);
|
.Returns(_executorB.Object);
|
||||||
|
|
||||||
Mocker.GetMock<ITrackCommands>()
|
|
||||||
.Setup(c => c.TrackIfNew(It.IsAny<CommandA>()))
|
|
||||||
.Returns(new TrackedCommand(new CommandA(), ProcessState.Running));
|
|
||||||
|
|
||||||
Mocker.GetMock<ITrackCommands>()
|
Mocker.GetMock<ITrackCommands>()
|
||||||
.Setup(c => c.TrackIfNew(It.IsAny<CommandB>()))
|
.Setup(c => c.FindExisting(It.IsAny<Command>()))
|
||||||
.Returns(new TrackedCommand(new CommandB(), ProcessState.Running));
|
.Returns<Command>(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -42,10 +40,6 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
{
|
{
|
||||||
var commandA = new CommandA();
|
var commandA = new CommandA();
|
||||||
|
|
||||||
Mocker.GetMock<ITrackCommands>()
|
|
||||||
.Setup(c => c.TrackIfNew(commandA))
|
|
||||||
.Returns(new TrackedCommand(commandA, ProcessState.Running));
|
|
||||||
|
|
||||||
Subject.PublishCommand(commandA);
|
Subject.PublishCommand(commandA);
|
||||||
|
|
||||||
_executorA.Verify(c => c.Execute(commandA), Times.Once());
|
_executorA.Verify(c => c.Execute(commandA), Times.Once());
|
||||||
|
@ -54,7 +48,7 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
[Test]
|
[Test]
|
||||||
public void should_publish_command_by_with_optional_arg_using_name()
|
public void should_publish_command_by_with_optional_arg_using_name()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IServiceFactory>().Setup(c => c.GetImplementations(typeof(ICommand)))
|
Mocker.GetMock<IServiceFactory>().Setup(c => c.GetImplementations(typeof(Command)))
|
||||||
.Returns(new List<Type> { typeof(CommandA), typeof(CommandB) });
|
.Returns(new List<Type> { typeof(CommandA), typeof(CommandB) });
|
||||||
|
|
||||||
Subject.PublishCommand(typeof(CommandA).FullName);
|
Subject.PublishCommand(typeof(CommandA).FullName);
|
||||||
|
@ -67,10 +61,6 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
{
|
{
|
||||||
var commandA = new CommandA();
|
var commandA = new CommandA();
|
||||||
|
|
||||||
Mocker.GetMock<ITrackCommands>()
|
|
||||||
.Setup(c => c.TrackIfNew(commandA))
|
|
||||||
.Returns(new TrackedCommand(commandA, ProcessState.Running));
|
|
||||||
|
|
||||||
Subject.PublishCommand(commandA);
|
Subject.PublishCommand(commandA);
|
||||||
|
|
||||||
_executorA.Verify(c => c.Execute(commandA), Times.Once());
|
_executorA.Verify(c => c.Execute(commandA), Times.Once());
|
||||||
|
@ -89,24 +79,18 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CommandA : ICommand
|
public class CommandA : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
// ReSharper disable UnusedParameter.Local
|
|
||||||
public CommandA(int id = 0)
|
public CommandA(int id = 0)
|
||||||
// ReSharper restore UnusedParameter.Local
|
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CommandB : ICommand
|
public class CommandB : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public CommandB()
|
public CommandB()
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
using FluentAssertions;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Test.EventingTests
|
namespace NzbDrone.Common.Test.MessagingTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class MessageAggregatorEventTests : TestBase<MessageAggregator>
|
public class MessageAggregatorEventTests : TestBase<MessageAggregator>
|
||||||
|
@ -127,7 +128,7 @@ namespace NzbDrone.Common.Test.EventingTests
|
||||||
|
|
||||||
counter.WaitForAllItems();
|
counter.WaitForAllItems();
|
||||||
|
|
||||||
counter.MaxThreads.Should().Be(2);
|
counter.MaxThreads.Should().Be(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,8 +67,9 @@
|
||||||
<Compile Include="EnsureTest\PathExtensionFixture.cs" />
|
<Compile Include="EnsureTest\PathExtensionFixture.cs" />
|
||||||
<Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" />
|
<Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" />
|
||||||
<Compile Include="EnvironmentTests\EnvironmentProviderTest.cs" />
|
<Compile Include="EnvironmentTests\EnvironmentProviderTest.cs" />
|
||||||
<Compile Include="EventingTests\MessageAggregatorCommandTests.cs" />
|
<Compile Include="MessagingTests\CommandBaseFixture.cs" />
|
||||||
<Compile Include="EventingTests\MessageAggregatorEventTests.cs" />
|
<Compile Include="MessagingTests\MessageAggregatorCommandTests.cs" />
|
||||||
|
<Compile Include="MessagingTests\MessageAggregatorEventTests.cs" />
|
||||||
<Compile Include="MessagingTests\CommandEqualityComparerFixture.cs" />
|
<Compile Include="MessagingTests\CommandEqualityComparerFixture.cs" />
|
||||||
<Compile Include="ReflectionExtensions.cs" />
|
<Compile Include="ReflectionExtensions.cs" />
|
||||||
<Compile Include="PathExtensionFixture.cs" />
|
<Compile Include="PathExtensionFixture.cs" />
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Host;
|
using NzbDrone.Host;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ using Exceptron.Client;
|
||||||
using Exceptron.Client.Configuration;
|
using Exceptron.Client.Configuration;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Common;
|
using NLog.Common;
|
||||||
using NLog.Config;
|
|
||||||
using NLog.Layouts;
|
using NLog.Layouts;
|
||||||
using NLog.Targets;
|
using NLog.Targets;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
@ -23,9 +22,6 @@ namespace NzbDrone.Common.Instrumentation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IExceptronClient ExceptronClient { get; internal set; }
|
public IExceptronClient ExceptronClient { get; internal set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected override void InitializeTarget()
|
protected override void InitializeTarget()
|
||||||
{
|
{
|
||||||
var config = new ExceptronConfiguration
|
var config = new ExceptronConfiguration
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Instrumentation
|
|
||||||
{
|
|
||||||
public static class LoggerExtensions
|
|
||||||
{
|
|
||||||
public static void Progress(this Logger logger, string message)
|
|
||||||
{
|
|
||||||
LogProgressMessage(logger, message, ProcessState.Running);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Progress(this Logger logger, string message, params object[] args)
|
|
||||||
{
|
|
||||||
var formattedMessage = String.Format(message, args);
|
|
||||||
Progress(logger, formattedMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Complete(this Logger logger, string message)
|
|
||||||
{
|
|
||||||
LogProgressMessage(logger, message, ProcessState.Completed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Complete(this Logger logger, string message, params object[] args)
|
|
||||||
{
|
|
||||||
var formattedMessage = String.Format(message, args);
|
|
||||||
Complete(logger, formattedMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Failed(this Logger logger, string message)
|
|
||||||
{
|
|
||||||
LogProgressMessage(logger, message, ProcessState.Failed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Failed(this Logger logger, string message, params object[] args)
|
|
||||||
{
|
|
||||||
var formattedMessage = String.Format(message, args);
|
|
||||||
Failed(logger, formattedMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void LogProgressMessage(Logger logger, string message, ProcessState state)
|
|
||||||
{
|
|
||||||
var logEvent = new LogEventInfo(LogLevel.Info, logger.Name, message);
|
|
||||||
logEvent.Properties.Add("Status", state);
|
|
||||||
|
|
||||||
logger.Log(logEvent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging
|
|
||||||
{
|
|
||||||
public class CommandEqualityComparer : IEqualityComparer<ICommand>
|
|
||||||
{
|
|
||||||
public bool Equals(ICommand x, ICommand y)
|
|
||||||
{
|
|
||||||
var xProperties = x.GetType().GetProperties();
|
|
||||||
var yProperties = y.GetType().GetProperties();
|
|
||||||
|
|
||||||
foreach (var xProperty in xProperties)
|
|
||||||
{
|
|
||||||
if (xProperty.Name == "CommandId")
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var yProperty = yProperties.SingleOrDefault(p => p.Name == xProperty.Name);
|
|
||||||
|
|
||||||
if (yProperty == null)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!xProperty.GetValue(x, null).Equals(yProperty.GetValue(y, null)))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetHashCode(ICommand obj)
|
|
||||||
{
|
|
||||||
return obj.CommandId.GetHashCode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Events
|
|
||||||
{
|
|
||||||
public class CommandCompletedEvent : IEvent
|
|
||||||
{
|
|
||||||
public TrackedCommand TrackedCommand { get; private set; }
|
|
||||||
|
|
||||||
public CommandCompletedEvent(TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
TrackedCommand = trackedCommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Events
|
|
||||||
{
|
|
||||||
public class CommandExecutedEvent : IEvent
|
|
||||||
{
|
|
||||||
public TrackedCommand TrackedCommand { get; private set; }
|
|
||||||
|
|
||||||
public CommandExecutedEvent(TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
TrackedCommand = trackedCommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
using System;
|
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Events
|
|
||||||
{
|
|
||||||
public class CommandFailedEvent : IEvent
|
|
||||||
{
|
|
||||||
public TrackedCommand TrackedCommand { get; private set; }
|
|
||||||
public Exception Exception { get; private set; }
|
|
||||||
|
|
||||||
public CommandFailedEvent(TrackedCommand trackedCommand, Exception exception)
|
|
||||||
{
|
|
||||||
TrackedCommand = trackedCommand;
|
|
||||||
Exception = exception;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Events
|
|
||||||
{
|
|
||||||
public class CommandStartedEvent : IEvent
|
|
||||||
{
|
|
||||||
public TrackedCommand TrackedCommand { get; private set; }
|
|
||||||
|
|
||||||
public CommandStartedEvent(TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
TrackedCommand = trackedCommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging
|
|
||||||
{
|
|
||||||
public interface ICommand : IMessage
|
|
||||||
{
|
|
||||||
String CommandId { get; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
namespace NzbDrone.Common.Messaging
|
namespace NzbDrone.Common.Messaging
|
||||||
{
|
{
|
||||||
public interface IEvent : IMessage
|
public interface IEvent : IMessage
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging
|
|
||||||
{
|
|
||||||
public class TestCommand : ICommand
|
|
||||||
{
|
|
||||||
public int Duration { get; set; }
|
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public TestCommand()
|
|
||||||
{
|
|
||||||
Duration = 4000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging
|
|
||||||
{
|
|
||||||
public class TestCommandExecutor : IExecute<TestCommand>
|
|
||||||
{
|
|
||||||
public void Execute(TestCommand message)
|
|
||||||
{
|
|
||||||
Thread.Sleep(message.Duration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,127 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.Remoting;
|
|
||||||
using NzbDrone.Common.Cache;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Tracking
|
|
||||||
{
|
|
||||||
public interface ITrackCommands
|
|
||||||
{
|
|
||||||
TrackedCommand TrackIfNew(ICommand command);
|
|
||||||
ExistingCommand TrackNewOrGet(ICommand command);
|
|
||||||
TrackedCommand Completed(TrackedCommand trackedCommand, TimeSpan runtime);
|
|
||||||
TrackedCommand Failed(TrackedCommand trackedCommand, Exception e);
|
|
||||||
List<TrackedCommand> AllTracked();
|
|
||||||
Boolean ExistingCommand(ICommand command);
|
|
||||||
TrackedCommand FindExisting(ICommand command);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TrackCommands : ITrackCommands, IExecute<TrackedCommandCleanupCommand>
|
|
||||||
{
|
|
||||||
private readonly ICached<TrackedCommand> _cache;
|
|
||||||
|
|
||||||
public TrackCommands(ICacheManger cacheManger)
|
|
||||||
{
|
|
||||||
_cache = cacheManger.GetCache<TrackedCommand>(GetType());
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackedCommand TrackIfNew(ICommand command)
|
|
||||||
{
|
|
||||||
if (ExistingCommand(command))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var trackedCommand = new TrackedCommand(command, ProcessState.Running);
|
|
||||||
Store(trackedCommand);
|
|
||||||
|
|
||||||
return trackedCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExistingCommand TrackNewOrGet(ICommand command)
|
|
||||||
{
|
|
||||||
var trackedCommand = FindExisting(command);
|
|
||||||
|
|
||||||
if (trackedCommand == null)
|
|
||||||
{
|
|
||||||
trackedCommand = new TrackedCommand(command, ProcessState.Running);
|
|
||||||
Store(trackedCommand);
|
|
||||||
|
|
||||||
return new ExistingCommand(false, trackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ExistingCommand(true, trackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackedCommand Completed(TrackedCommand trackedCommand, TimeSpan runtime)
|
|
||||||
{
|
|
||||||
trackedCommand.StateChangeTime = DateTime.UtcNow;
|
|
||||||
trackedCommand.State = ProcessState.Completed;
|
|
||||||
trackedCommand.Runtime = runtime;
|
|
||||||
|
|
||||||
Store(trackedCommand);
|
|
||||||
|
|
||||||
return trackedCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackedCommand Failed(TrackedCommand trackedCommand, Exception e)
|
|
||||||
{
|
|
||||||
trackedCommand.StateChangeTime = DateTime.UtcNow;
|
|
||||||
trackedCommand.State = ProcessState.Failed;
|
|
||||||
trackedCommand.Exception = e;
|
|
||||||
|
|
||||||
Store(trackedCommand);
|
|
||||||
|
|
||||||
return trackedCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<TrackedCommand> AllTracked()
|
|
||||||
{
|
|
||||||
return _cache.Values.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ExistingCommand(ICommand command)
|
|
||||||
{
|
|
||||||
return FindExisting(command) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackedCommand FindExisting(ICommand command)
|
|
||||||
{
|
|
||||||
var comparer = new CommandEqualityComparer();
|
|
||||||
return Running(command.GetType()).SingleOrDefault(t => comparer.Equals(t.Command, command));
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<TrackedCommand> Running(Type type = null)
|
|
||||||
{
|
|
||||||
var running = AllTracked().Where(i => i.State == ProcessState.Running);
|
|
||||||
|
|
||||||
if (type != null)
|
|
||||||
{
|
|
||||||
return running.Where(t => t.Type == type.FullName).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
return running.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Store(TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
if (trackedCommand.Command.GetType() == typeof(TrackedCommandCleanupCommand))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_cache.Set(trackedCommand.Command.CommandId, trackedCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Execute(TrackedCommandCleanupCommand message)
|
|
||||||
{
|
|
||||||
var old = AllTracked().Where(c => c.State != ProcessState.Running && c.StateChangeTime < DateTime.UtcNow.AddMinutes(-5));
|
|
||||||
|
|
||||||
foreach (var trackedCommand in old)
|
|
||||||
{
|
|
||||||
_cache.Remove(trackedCommand.Command.CommandId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Tracking
|
|
||||||
{
|
|
||||||
public class ExistingCommand
|
|
||||||
{
|
|
||||||
public Boolean Existing { get; set; }
|
|
||||||
public TrackedCommand TrackedCommand { get; set; }
|
|
||||||
|
|
||||||
public ExistingCommand(Boolean exisitng, TrackedCommand trackedCommand)
|
|
||||||
{
|
|
||||||
Existing = exisitng;
|
|
||||||
TrackedCommand = trackedCommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Tracking
|
|
||||||
{
|
|
||||||
public enum ProcessState
|
|
||||||
{
|
|
||||||
Running,
|
|
||||||
Completed,
|
|
||||||
Failed
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Tracking
|
|
||||||
{
|
|
||||||
public class TrackedCommand
|
|
||||||
{
|
|
||||||
public String Id { get; private set; }
|
|
||||||
public String Name { get; private set; }
|
|
||||||
public String Type { get; private set; }
|
|
||||||
public ICommand Command { get; private set; }
|
|
||||||
public ProcessState State { get; set; }
|
|
||||||
public DateTime StateChangeTime { get; set; }
|
|
||||||
public TimeSpan Runtime { get; set; }
|
|
||||||
public Exception Exception { get; set; }
|
|
||||||
|
|
||||||
public TrackedCommand()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackedCommand(ICommand command, ProcessState state)
|
|
||||||
{
|
|
||||||
Id = command.CommandId;
|
|
||||||
Name = command.GetType().Name;
|
|
||||||
Type = command.GetType().FullName;
|
|
||||||
Command = command;
|
|
||||||
State = state;
|
|
||||||
StateChangeTime = DateTime.UtcNow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace NzbDrone.Common.Messaging.Tracking
|
|
||||||
{
|
|
||||||
public class TrackedCommandCleanupCommand : ICommand
|
|
||||||
{
|
|
||||||
public string CommandId { get; private set; }
|
|
||||||
|
|
||||||
public TrackedCommandCleanupCommand()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -92,16 +92,11 @@
|
||||||
<Compile Include="IEnumerableExtensions.cs" />
|
<Compile Include="IEnumerableExtensions.cs" />
|
||||||
<Compile Include="Instrumentation\GlobalExceptionHandlers.cs" />
|
<Compile Include="Instrumentation\GlobalExceptionHandlers.cs" />
|
||||||
<Compile Include="Instrumentation\ExceptronTarget.cs" />
|
<Compile Include="Instrumentation\ExceptronTarget.cs" />
|
||||||
|
<Compile Include="Instrumentation\LogEventExtensions.cs" />
|
||||||
<Compile Include="Instrumentation\NzbDroneLogger.cs" />
|
<Compile Include="Instrumentation\NzbDroneLogger.cs" />
|
||||||
<Compile Include="Instrumentation\LogTargets.cs" />
|
<Compile Include="Instrumentation\LogTargets.cs" />
|
||||||
<Compile Include="Instrumentation\LoggerExtensions.cs" />
|
<Compile Include="Messaging\IEvent.cs" />
|
||||||
<Compile Include="Messaging\Tracking\ProcessState.cs" />
|
<Compile Include="Messaging\IMessage.cs" />
|
||||||
<Compile Include="Messaging\Tracking\CommandTrackingService.cs" />
|
|
||||||
<Compile Include="Messaging\Tracking\ExistingCommand.cs" />
|
|
||||||
<Compile Include="Messaging\Tracking\TrackedCommand.cs" />
|
|
||||||
<Compile Include="Messaging\Events\CommandStartedEvent.cs" />
|
|
||||||
<Compile Include="Messaging\CommandEqualityComparer.cs" />
|
|
||||||
<Compile Include="Messaging\Tracking\TrackedCommandCleanupCommand.cs" />
|
|
||||||
<Compile Include="PathEqualityComparer.cs" />
|
<Compile Include="PathEqualityComparer.cs" />
|
||||||
<Compile Include="Services.cs" />
|
<Compile Include="Services.cs" />
|
||||||
<Compile Include="TPL\LimitedConcurrencyLevelTaskScheduler.cs" />
|
<Compile Include="TPL\LimitedConcurrencyLevelTaskScheduler.cs" />
|
||||||
|
@ -109,20 +104,8 @@
|
||||||
<Compile Include="StringExtensions.cs" />
|
<Compile Include="StringExtensions.cs" />
|
||||||
<Compile Include="EnsureThat\TypeParam.cs" />
|
<Compile Include="EnsureThat\TypeParam.cs" />
|
||||||
<Compile Include="HashUtil.cs" />
|
<Compile Include="HashUtil.cs" />
|
||||||
<Compile Include="Instrumentation\LogEventExtensions.cs" />
|
|
||||||
<Compile Include="Instrumentation\LogglyTarget.cs" />
|
<Compile Include="Instrumentation\LogglyTarget.cs" />
|
||||||
<Compile Include="Serializer\Json.cs" />
|
<Compile Include="Serializer\Json.cs" />
|
||||||
<Compile Include="Messaging\Events\CommandCompletedEvent.cs" />
|
|
||||||
<Compile Include="Messaging\Events\CommandExecutedEvent.cs" />
|
|
||||||
<Compile Include="Messaging\Events\CommandFailedEvent.cs" />
|
|
||||||
<Compile Include="Messaging\IExecute.cs" />
|
|
||||||
<Compile Include="Messaging\ICommand.cs" />
|
|
||||||
<Compile Include="Messaging\IMessage.cs" />
|
|
||||||
<Compile Include="Messaging\IProcessMessage.cs" />
|
|
||||||
<Compile Include="Messaging\MessageAggregator.cs" />
|
|
||||||
<Compile Include="Messaging\IEvent.cs" />
|
|
||||||
<Compile Include="Messaging\IMessageAggregator.cs" />
|
|
||||||
<Compile Include="Messaging\IHandle.cs" />
|
|
||||||
<Compile Include="Expansive\CircularReferenceException.cs" />
|
<Compile Include="Expansive\CircularReferenceException.cs" />
|
||||||
<Compile Include="Expansive\Expansive.cs" />
|
<Compile Include="Expansive\Expansive.cs" />
|
||||||
<Compile Include="Expansive\PatternStyle.cs" />
|
<Compile Include="Expansive\PatternStyle.cs" />
|
||||||
|
@ -130,9 +113,6 @@
|
||||||
<Compile Include="Expansive\TreeNode.cs" />
|
<Compile Include="Expansive\TreeNode.cs" />
|
||||||
<Compile Include="Expansive\TreeNodeList.cs" />
|
<Compile Include="Expansive\TreeNodeList.cs" />
|
||||||
<Compile Include="Instrumentation\VersionLayoutRenderer.cs" />
|
<Compile Include="Instrumentation\VersionLayoutRenderer.cs" />
|
||||||
<Compile Include="Messaging\MessageExtensions.cs" />
|
|
||||||
<Compile Include="Messaging\TestCommand.cs" />
|
|
||||||
<Compile Include="Messaging\TestCommandExecutor.cs" />
|
|
||||||
<Compile Include="Reflection\ReflectionExtensions.cs" />
|
<Compile Include="Reflection\ReflectionExtensions.cs" />
|
||||||
<Compile Include="ServiceFactory.cs" />
|
<Compile Include="ServiceFactory.cs" />
|
||||||
<Compile Include="HttpProvider.cs" />
|
<Compile Include="HttpProvider.cs" />
|
||||||
|
|
|
@ -6,9 +6,10 @@ using FluentMigrator.Runner;
|
||||||
using Marr.Data;
|
using Marr.Data;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.Framework
|
namespace NzbDrone.Core.Test.Framework
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,10 +4,10 @@ using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
using NzbDrone.Core.MediaFiles.EpisodeImport;
|
using NzbDrone.Core.MediaFiles.EpisodeImport;
|
||||||
using NzbDrone.Core.MediaFiles.Events;
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
|
|
@ -3,11 +3,11 @@ using System.Linq;
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
using NzbDrone.Core.MediaFiles.Commands;
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
using NzbDrone.Core.MediaFiles.Events;
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.MediaFiles
|
namespace NzbDrone.Core.Test.MediaFiles
|
||||||
|
|
Binary file not shown.
|
@ -1,22 +1,26 @@
|
||||||
|
using System;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Core.Update;
|
using NzbDrone.Core.Update;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.UpdateTests
|
namespace NzbDrone.Core.Test.UpdateTests
|
||||||
{
|
{
|
||||||
public class UpdatePackageProviderFixture : CoreTest<UpdatePackageProvider>
|
public class UpdatePackageProviderFixture : CoreTest<UpdatePackageProvider>
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void should_get_list_of_available_updates()
|
public void no_update_when_version_higher()
|
||||||
{
|
{
|
||||||
UseRealHttp();
|
UseRealHttp();
|
||||||
|
Subject.GetLatestUpdate("master", new Version(10,0)).Should().BeNull();
|
||||||
|
}
|
||||||
|
|
||||||
Mocker.GetMock<IConfigFileProvider>().SetupGet(c => c.Branch).Returns("master");
|
[Test]
|
||||||
|
public void finds_update_when_version_lower()
|
||||||
Subject.GetLatestUpdate().Should().BeNull();
|
{
|
||||||
|
UseRealHttp();
|
||||||
|
Subject.GetLatestUpdate("master", new Version(1, 0)).Should().NotBeNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,10 @@ using System.Xml.Linq;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Cache;
|
using NzbDrone.Common.Cache;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Configuration.Events;
|
using NzbDrone.Core.Configuration.Events;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Configuration
|
namespace NzbDrone.Core.Configuration
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Configuration
|
namespace NzbDrone.Core.Configuration
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Configuration.Events;
|
using NzbDrone.Core.Configuration.Events;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.Core.Download.Clients.Nzbget;
|
using NzbDrone.Core.Download.Clients.Nzbget;
|
||||||
using NzbDrone.Core.Download.Clients.Sabnzbd;
|
using NzbDrone.Core.Download.Clients.Sabnzbd;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Configuration
|
namespace NzbDrone.Core.Configuration
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Configuration.Events
|
namespace NzbDrone.Core.Configuration.Events
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Configuration.Events
|
namespace NzbDrone.Core.Configuration.Events
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.DataAugmentation.Scene
|
namespace NzbDrone.Core.DataAugmentation.Scene
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,8 +2,8 @@ using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Cache;
|
using NzbDrone.Common.Cache;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Parser;
|
using NzbDrone.Core.Parser;
|
||||||
|
|
||||||
namespace NzbDrone.Core.DataAugmentation.Scene
|
namespace NzbDrone.Core.DataAugmentation.Scene
|
||||||
|
|
|
@ -1,16 +1,12 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.DataAugmentation.Scene
|
namespace NzbDrone.Core.DataAugmentation.Scene
|
||||||
{
|
{
|
||||||
public class UpdateSceneMappingCommand : ICommand
|
public class UpdateSceneMappingCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public UpdateSceneMappingCommand()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,9 +4,9 @@ using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using Marr.Data;
|
using Marr.Data;
|
||||||
using Marr.Data.QGen;
|
using Marr.Data.QGen;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore.Events;
|
using NzbDrone.Core.Datastore.Events;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore
|
namespace NzbDrone.Core.Datastore
|
||||||
|
@ -115,7 +115,6 @@ namespace NzbDrone.Core.Datastore
|
||||||
}
|
}
|
||||||
|
|
||||||
DataMapper.Insert(model);
|
DataMapper.Insert(model);
|
||||||
PublishModelEvent(model, RepositoryAction.Created);
|
|
||||||
|
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
@ -222,7 +221,22 @@ namespace NzbDrone.Core.Datastore
|
||||||
DataMapper.Delete<TModel>(c => c.Id > 0);
|
DataMapper.Delete<TModel>(c => c.Id > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PublishModelEvent(TModel model, RepositoryAction action)
|
protected void ModelCreated(TModel model)
|
||||||
|
{
|
||||||
|
PublishModelEvent(model, ModelAction.Created);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ModelUpdated(TModel model)
|
||||||
|
{
|
||||||
|
PublishModelEvent(model, ModelAction.Updated);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ModelDeleted(TModel model)
|
||||||
|
{
|
||||||
|
PublishModelEvent(model, ModelAction.Deleted);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PublishModelEvent(TModel model, ModelAction action)
|
||||||
{
|
{
|
||||||
if (PublishModelEvents)
|
if (PublishModelEvents)
|
||||||
{
|
{
|
||||||
|
@ -230,16 +244,6 @@ namespace NzbDrone.Core.Datastore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void OnModelChanged(IEnumerable<TModel> models)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void OnModelDeleted(IEnumerable<TModel> models)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual bool PublishModelEvents
|
protected virtual bool PublishModelEvents
|
||||||
{
|
{
|
||||||
get { return false; }
|
get { return false; }
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
using NzbDrone.Common.Cache;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore
|
|
||||||
{
|
|
||||||
public abstract class CachedBasicRepository<TModel> : BasicRepository<TModel> where TModel : ModelBase, new()
|
|
||||||
{
|
|
||||||
private readonly ICacheManger _cacheManger;
|
|
||||||
|
|
||||||
protected CachedBasicRepository(IDatabase database, IMessageAggregator messageAggregator)
|
|
||||||
: base(database, messageAggregator)
|
|
||||||
{
|
|
||||||
_cacheManger = new CacheManger();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ICached<T> GetCache<T>(string name)
|
|
||||||
{
|
|
||||||
return _cacheManger.GetCache<T>(GetType(), name);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnModelChanged(IEnumerable<TModel> models)
|
|
||||||
{
|
|
||||||
PurgeCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnModelDeleted(IEnumerable<TModel> models)
|
|
||||||
{
|
|
||||||
PurgeCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PurgeCache()
|
|
||||||
{
|
|
||||||
foreach (var model in _cacheManger.Caches)
|
|
||||||
{
|
|
||||||
model.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,9 +3,9 @@ using System.Data.SQLite;
|
||||||
using Marr.Data;
|
using Marr.Data;
|
||||||
using Marr.Data.Reflection;
|
using Marr.Data.Reflection;
|
||||||
using NzbDrone.Common.Composition;
|
using NzbDrone.Common.Composition;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
using NzbDrone.Core.Instrumentation;
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore
|
namespace NzbDrone.Core.Datastore
|
||||||
|
|
|
@ -2,23 +2,25 @@
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore.Events
|
namespace NzbDrone.Core.Datastore.Events
|
||||||
{
|
{
|
||||||
public class ModelEvent<T> : IEvent where T : ModelBase
|
public class ModelEvent <TModel> : IEvent
|
||||||
{
|
{
|
||||||
public T Model { get; set; }
|
public TModel Model { get; set; }
|
||||||
public RepositoryAction Action { get; set; }
|
public ModelAction Action { get; set; }
|
||||||
|
|
||||||
public ModelEvent(T model, RepositoryAction action)
|
public ModelEvent(TModel model, ModelAction action)
|
||||||
{
|
{
|
||||||
Model = model;
|
Model = model;
|
||||||
Action = action;
|
Action = action;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum RepositoryAction
|
public enum ModelAction
|
||||||
{
|
{
|
||||||
|
Unknow = 0,
|
||||||
Created = 1,
|
Created = 1,
|
||||||
Updated = 2,
|
Updated = 2,
|
||||||
Deleted = 3
|
Deleted = 3,
|
||||||
|
Sync = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,241 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data.SQLite;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using NLog;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||||
|
{
|
||||||
|
public interface ISQLiteMigrationHelper
|
||||||
|
{
|
||||||
|
Dictionary<String, SQLiteMigrationHelper.SQLiteColumn> GetColumns(string tableName);
|
||||||
|
void CreateTable(string tableName, IEnumerable<SQLiteMigrationHelper.SQLiteColumn> values, IEnumerable<SQLiteMigrationHelper.SQLiteIndex> indexes);
|
||||||
|
void CopyData(string sourceTable, string destinationTable, IEnumerable<SQLiteMigrationHelper.SQLiteColumn> columns);
|
||||||
|
void DropTable(string tableName);
|
||||||
|
void RenameTable(string tableName, string newName);
|
||||||
|
List<T> GetDuplicates<T>(string tableName, string columnName);
|
||||||
|
SQLiteTransaction BeginTransaction();
|
||||||
|
List<SQLiteMigrationHelper.SQLiteIndex> GetIndexes(string tableName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SQLiteMigrationHelper : ISQLiteMigrationHelper
|
||||||
|
{
|
||||||
|
private readonly SQLiteConnection _connection;
|
||||||
|
|
||||||
|
private static readonly Regex SchemaRegex = new Regex(@"['\""\[](?<name>\w+)['\""\]]\s(?<schema>[\w-\s]+)",
|
||||||
|
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
|
||||||
|
|
||||||
|
private static readonly Regex IndexRegex = new Regex(@"\(""(?<col>.*)""\s(?<direction>ASC|DESC)\)$",
|
||||||
|
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
|
||||||
|
|
||||||
|
public SQLiteMigrationHelper(IConnectionStringFactory connectionStringFactory, Logger logger)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_connection = new SQLiteConnection(connectionStringFactory.MainDbConnectionString);
|
||||||
|
_connection.Open();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.ErrorException("Couldn't open database " + connectionStringFactory.MainDbConnectionString, e);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetOriginalSql(string tableName)
|
||||||
|
{
|
||||||
|
var command =
|
||||||
|
new SQLiteCommand(string.Format("SELECT sql FROM sqlite_master WHERE type='table' AND name ='{0}'",
|
||||||
|
tableName));
|
||||||
|
|
||||||
|
command.Connection = _connection;
|
||||||
|
|
||||||
|
return (string)command.ExecuteScalar();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<String, SQLiteColumn> GetColumns(string tableName)
|
||||||
|
{
|
||||||
|
var originalSql = GetOriginalSql(tableName);
|
||||||
|
|
||||||
|
var matches = SchemaRegex.Matches(originalSql);
|
||||||
|
|
||||||
|
return matches.Cast<Match>().ToDictionary(
|
||||||
|
match => match.Groups["name"].Value.Trim(),
|
||||||
|
match => new SQLiteColumn
|
||||||
|
{
|
||||||
|
Name = match.Groups["name"].Value.Trim(),
|
||||||
|
Schema = match.Groups["schema"].Value.Trim()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static IEnumerable<T> ReadArray<T>(SQLiteDataReader reader)
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
yield return (T)Convert.ChangeType(reader[0], typeof(T));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SQLiteIndex> GetIndexes(string tableName)
|
||||||
|
{
|
||||||
|
var command = new SQLiteCommand(string.Format("SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name ='{0}'", tableName));
|
||||||
|
command.Connection = _connection;
|
||||||
|
|
||||||
|
var reader = command.ExecuteReader();
|
||||||
|
var sqls = ReadArray<string>(reader).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
var indexes = new List<SQLiteIndex>();
|
||||||
|
|
||||||
|
foreach (var indexSql in sqls)
|
||||||
|
{
|
||||||
|
var newIndex = new SQLiteIndex();
|
||||||
|
var matches = IndexRegex.Match(indexSql);
|
||||||
|
|
||||||
|
newIndex.Column = matches.Groups["col"].Value;
|
||||||
|
newIndex.Unique = indexSql.Contains("UNIQUE");
|
||||||
|
newIndex.Table = tableName;
|
||||||
|
|
||||||
|
indexes.Add(newIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CreateTable(string tableName, IEnumerable<SQLiteColumn> values, IEnumerable<SQLiteIndex> indexes)
|
||||||
|
{
|
||||||
|
var columns = String.Join(",", values.Select(c => c.ToString()));
|
||||||
|
|
||||||
|
ExecuteNonQuery("CREATE TABLE [{0}] ({1})", tableName, columns);
|
||||||
|
|
||||||
|
foreach (var index in indexes)
|
||||||
|
{
|
||||||
|
ExecuteNonQuery("DROP INDEX {0}", index.IndexName);
|
||||||
|
ExecuteNonQuery(index.CreateSql(tableName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyData(string sourceTable, string destinationTable, IEnumerable<SQLiteColumn> columns)
|
||||||
|
{
|
||||||
|
var originalCount = GetRowCount(sourceTable);
|
||||||
|
|
||||||
|
var columnsToTransfer = String.Join(",", columns.Select(c => c.Name));
|
||||||
|
|
||||||
|
var transferCommand = BuildCommand("INSERT INTO {0} SELECT {1} FROM {2};", destinationTable, columnsToTransfer, sourceTable);
|
||||||
|
|
||||||
|
transferCommand.ExecuteNonQuery();
|
||||||
|
|
||||||
|
var transferredRows = GetRowCount(destinationTable);
|
||||||
|
|
||||||
|
|
||||||
|
if (transferredRows != originalCount)
|
||||||
|
{
|
||||||
|
throw new ApplicationException(string.Format("Expected {0} rows to be copied from [{1}] to [{2}]. But only copied {3}", originalCount, sourceTable, destinationTable, transferredRows));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void DropTable(string tableName)
|
||||||
|
{
|
||||||
|
var dropCommand = BuildCommand("DROP TABLE {0};", tableName);
|
||||||
|
dropCommand.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void RenameTable(string tableName, string newName)
|
||||||
|
{
|
||||||
|
var renameCommand = BuildCommand("ALTER TABLE {0} RENAME TO {1};", tableName, newName);
|
||||||
|
renameCommand.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<int,T> GetDuplicates<T>(string tableName, string columnName)
|
||||||
|
{
|
||||||
|
var dupCommand = BuildCommand("select id, {0} from {1}", columnName, tableName);
|
||||||
|
|
||||||
|
var result = new Dictionary<int, T>();
|
||||||
|
using (var reader = dupCommand.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return ReadArray<T>().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetRowCount(string tableName)
|
||||||
|
{
|
||||||
|
var countCommand = BuildCommand("SELECT COUNT(*) FROM {0};", tableName);
|
||||||
|
return Convert.ToInt32(countCommand.ExecuteScalar());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public SQLiteTransaction BeginTransaction()
|
||||||
|
{
|
||||||
|
return _connection.BeginTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
private SQLiteCommand BuildCommand(string format, params string[] args)
|
||||||
|
{
|
||||||
|
var command = new SQLiteCommand(string.Format(format, args));
|
||||||
|
command.Connection = _connection;
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void ExecuteNonQuery(string command, params string[] args)
|
||||||
|
{
|
||||||
|
var sqLiteCommand = new SQLiteCommand(string.Format(command, args))
|
||||||
|
{
|
||||||
|
Connection = _connection
|
||||||
|
};
|
||||||
|
|
||||||
|
sqLiteCommand.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class SQLiteColumn
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Schema { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("[{0}] {1}", Name, Schema);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SQLiteIndex
|
||||||
|
{
|
||||||
|
public string Column { get; set; }
|
||||||
|
public string Table { get; set; }
|
||||||
|
public bool Unique { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("[{0}] Unique: {1}", Column, Unique);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string IndexName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return string.Format("IX_{0}_{1}", Table, Column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CreateSql(string tableName)
|
||||||
|
{
|
||||||
|
return string.Format(@"CREATE UNIQUE INDEX ""{2}"" ON ""{0}"" (""{1}"" ASC)", tableName, Column, IndexName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -2,9 +2,8 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
|
||||||
using NzbDrone.Core.DecisionEngine.Specifications.Search;
|
|
||||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
using NzbDrone.Core.Parser;
|
using NzbDrone.Core.Parser;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Common.Serializer;
|
using NzbDrone.Common.Serializer;
|
||||||
|
@ -44,12 +43,12 @@ namespace NzbDrone.Core.DecisionEngine
|
||||||
{
|
{
|
||||||
if (reports.Any())
|
if (reports.Any())
|
||||||
{
|
{
|
||||||
_logger.Progress("Processing {0} reports", reports.Count);
|
_logger.ProgressInfo("Processing {0} reports", reports.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Progress("No reports found");
|
_logger.ProgressInfo("No reports found");
|
||||||
}
|
}
|
||||||
|
|
||||||
var reportNumber = 1;
|
var reportNumber = 1;
|
||||||
|
@ -57,7 +56,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||||
foreach (var report in reports)
|
foreach (var report in reports)
|
||||||
{
|
{
|
||||||
DownloadDecision decision = null;
|
DownloadDecision decision = null;
|
||||||
_logger.Progress("Processing report {0}/{1}", reportNumber, reports.Count);
|
_logger.ProgressTrace("Processing report {0}/{1}", reportNumber, reports.Count);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Download
|
namespace NzbDrone.Core.Download
|
||||||
|
@ -38,7 +39,7 @@ namespace NzbDrone.Core.Download
|
||||||
|
|
||||||
downloadClient.DownloadNzb(remoteEpisode);
|
downloadClient.DownloadNzb(remoteEpisode);
|
||||||
|
|
||||||
_logger.Progress("Report sent to download client. {0}", downloadTitle);
|
_logger.ProgressInfo("Report sent to download client. {0}", downloadTitle);
|
||||||
_messageAggregator.PublishEvent(new EpisodeGrabbedEvent(remoteEpisode));
|
_messageAggregator.PublishEvent(new EpisodeGrabbedEvent(remoteEpisode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Download
|
namespace NzbDrone.Core.Download
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Marr.Data.QGen;
|
using Marr.Data.QGen;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Core.History
|
namespace NzbDrone.Core.History
|
||||||
|
|
|
@ -3,10 +3,10 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.Core.MediaFiles.Events;
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Core.History
|
namespace NzbDrone.Core.History
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
using System;
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
public class EpisodeSearchCommand : ICommand
|
public class EpisodeSearchCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
public int EpisodeId { get; set; }
|
public int EpisodeId { get; set; }
|
||||||
|
|
||||||
public EpisodeSearchCommand()
|
public override bool SendUpdatesToClient
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
|
@ -26,7 +27,7 @@ namespace NzbDrone.Core.IndexerSearch
|
||||||
var decisions = _nzbSearchService.EpisodeSearch(message.EpisodeId);
|
var decisions = _nzbSearchService.EpisodeSearch(message.EpisodeId);
|
||||||
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
||||||
|
|
||||||
_logger.Complete("Episode search completed. {0} reports downloaded.", downloaded.Count);
|
_logger.ProgressInfo("Episode search completed. {0} reports downloaded.", downloaded.Count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using NzbDrone.Core.DataAugmentation.Scene;
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -131,7 +132,7 @@ namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
var indexers = _indexerService.GetAvailableIndexers().ToList();
|
var indexers = _indexerService.GetAvailableIndexers().ToList();
|
||||||
|
|
||||||
_logger.Progress("Searching {0} indexers for {1}", indexers.Count, criteriaBase);
|
_logger.ProgressInfo("Searching {0} indexers for {1}", indexers.Count, criteriaBase);
|
||||||
|
|
||||||
var reports = new List<ReportInfo>();
|
var reports = new List<ReportInfo>();
|
||||||
var taskList = new List<Task>();
|
var taskList = new List<Task>();
|
||||||
|
|
|
@ -1,18 +1,21 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
public class SeasonSearchCommand : ICommand
|
public class SeasonSearchCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
public int SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
public int SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
|
|
||||||
public SeasonSearchCommand()
|
public override bool SendUpdatesToClient
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,8 @@
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
|
@ -25,7 +26,7 @@ namespace NzbDrone.Core.IndexerSearch
|
||||||
var decisions = _nzbSearchService.SeasonSearch(message.SeriesId, message.SeasonNumber);
|
var decisions = _nzbSearchService.SeasonSearch(message.SeriesId, message.SeasonNumber);
|
||||||
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
||||||
|
|
||||||
_logger.Complete("Season search completed. {0} reports downloaded.", downloaded.Count);
|
_logger.ProgressInfo("Season search completed. {0} reports downloaded.", downloaded.Count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,20 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
public class SeriesSearchCommand : ICommand
|
public class SeriesSearchCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
public int SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
|
|
||||||
public SeriesSearchCommand()
|
public override bool SendUpdatesToClient
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
|
@ -40,7 +41,7 @@ namespace NzbDrone.Core.IndexerSearch
|
||||||
downloadedCount += _downloadApprovedReports.DownloadApproved(decisions).Count;
|
downloadedCount += _downloadApprovedReports.DownloadApproved(decisions).Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Complete("Series search completed. {0} reports downloaded.", downloadedCount);
|
_logger.ProgressInfo("Series search completed. {0} reports downloaded.", downloadedCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers
|
namespace NzbDrone.Core.Indexers
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Common.Serializer;
|
using NzbDrone.Common.Serializer;
|
||||||
using NzbDrone.Core.Indexers.Newznab;
|
using NzbDrone.Core.Indexers.Newznab;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using Omu.ValueInjecter;
|
using Omu.ValueInjecter;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers
|
namespace NzbDrone.Core.Indexers
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers
|
namespace NzbDrone.Core.Indexers
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,16 +1,20 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers
|
namespace NzbDrone.Core.Indexers
|
||||||
{
|
{
|
||||||
public class RssSyncCommand : ICommand
|
public class RssSyncCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public RssSyncCommand()
|
public override bool SendUpdatesToClient
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,9 +1,10 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers
|
namespace NzbDrone.Core.Indexers
|
||||||
{
|
{
|
||||||
|
@ -33,13 +34,13 @@ namespace NzbDrone.Core.Indexers
|
||||||
|
|
||||||
public void Sync()
|
public void Sync()
|
||||||
{
|
{
|
||||||
_logger.Progress("Starting RSS Sync");
|
_logger.ProgressInfo("Starting RSS Sync");
|
||||||
|
|
||||||
var reports = _rssFetcherAndParser.Fetch();
|
var reports = _rssFetcherAndParser.Fetch();
|
||||||
var decisions = _downloadDecisionMaker.GetRssDecision(reports);
|
var decisions = _downloadDecisionMaker.GetRssDecision(reports);
|
||||||
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
var downloaded = _downloadApprovedReports.DownloadApproved(decisions);
|
||||||
|
|
||||||
_logger.Complete("RSS Sync Completed. Reports found: {0}, Reports downloaded: {1}", reports.Count, downloaded.Count());
|
_logger.ProgressInfo("RSS Sync Completed. Reports found: {0}, Reports downloaded: {1}", reports.Count, downloaded.Count());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(RssSyncCommand message)
|
public void Execute(RssSyncCommand message)
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation.Commands
|
namespace NzbDrone.Core.Instrumentation.Commands
|
||||||
{
|
{
|
||||||
public class ClearLogCommand : ICommand
|
public class ClearLogCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
public override bool SendUpdatesToClient
|
||||||
|
|
||||||
public ClearLogCommand()
|
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,16 +1,18 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation.Commands
|
namespace NzbDrone.Core.Instrumentation.Commands
|
||||||
{
|
{
|
||||||
public class DeleteLogFilesCommand : ICommand
|
public class DeleteLogFilesCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
public override bool SendUpdatesToClient
|
||||||
|
|
||||||
public DeleteLogFilesCommand()
|
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,16 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation.Commands
|
namespace NzbDrone.Core.Instrumentation.Commands
|
||||||
{
|
{
|
||||||
public class TrimLogCommand : ICommand
|
public class TrimLogCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public TrimLogCommand()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,8 +3,8 @@ using NLog.Config;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Layouts;
|
using NLog.Layouts;
|
||||||
using NLog.Targets;
|
using NLog.Targets;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,8 +5,8 @@ using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Instrumentation.Commands;
|
using NzbDrone.Core.Instrumentation.Commands;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Instrumentation.Commands;
|
using NzbDrone.Core.Instrumentation.Commands;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
using System;
|
||||||
|
using NLog;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Instrumentation
|
||||||
|
{
|
||||||
|
public static class LoggerExtensions
|
||||||
|
{
|
||||||
|
public static void ProgressInfo(this Logger logger, string message, params object[] args)
|
||||||
|
{
|
||||||
|
var formattedMessage = String.Format(message, args);
|
||||||
|
LogProgressMessage(logger, LogLevel.Info, formattedMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ProgressDebug(this Logger logger, string message, params object[] args)
|
||||||
|
{
|
||||||
|
var formattedMessage = String.Format(message, args);
|
||||||
|
LogProgressMessage(logger, LogLevel.Debug, formattedMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ProgressTrace(this Logger logger, string message, params object[] args)
|
||||||
|
{
|
||||||
|
var formattedMessage = String.Format(message, args);
|
||||||
|
LogProgressMessage(logger, LogLevel.Trace, formattedMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LogProgressMessage(Logger logger, LogLevel level, string message)
|
||||||
|
{
|
||||||
|
var logEvent = new LogEventInfo(level, logger.Name, message);
|
||||||
|
logEvent.Properties.Add("Status", "");
|
||||||
|
|
||||||
|
logger.Log(logEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,10 +3,10 @@ using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Config;
|
using NLog.Config;
|
||||||
using NLog.Targets;
|
using NLog.Targets;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Configuration.Events;
|
using NzbDrone.Core.Configuration.Events;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Jobs
|
namespace NzbDrone.Core.Jobs
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
using Timer = System.Timers.Timer;
|
using Timer = System.Timers.Timer;
|
||||||
using NzbDrone.Common.TPL;
|
using NzbDrone.Common.TPL;
|
||||||
|
|
||||||
|
|
|
@ -2,15 +2,15 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
using NzbDrone.Common.Messaging.Events;
|
|
||||||
using NzbDrone.Common.Messaging.Tracking;
|
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Configuration.Events;
|
using NzbDrone.Core.Configuration.Events;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Instrumentation.Commands;
|
using NzbDrone.Core.Instrumentation.Commands;
|
||||||
using NzbDrone.Core.Lifecycle;
|
using NzbDrone.Core.Lifecycle;
|
||||||
using NzbDrone.Core.MediaFiles.Commands;
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Events;
|
||||||
|
using NzbDrone.Core.Messaging.Tracking;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Tv.Commands;
|
using NzbDrone.Core.Tv.Commands;
|
||||||
using NzbDrone.Core.Update.Commands;
|
using NzbDrone.Core.Update.Commands;
|
||||||
|
@ -79,7 +79,7 @@ namespace NzbDrone.Core.Jobs
|
||||||
|
|
||||||
public void HandleAsync(CommandExecutedEvent message)
|
public void HandleAsync(CommandExecutedEvent message)
|
||||||
{
|
{
|
||||||
var scheduledTask = _scheduledTaskRepository.All().SingleOrDefault(c => c.TypeName == message.TrackedCommand.Command.GetType().FullName);
|
var scheduledTask = _scheduledTaskRepository.All().SingleOrDefault(c => c.TypeName == message.Command.GetType().FullName);
|
||||||
|
|
||||||
if (scheduledTask != null)
|
if (scheduledTask != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Lifecycle
|
namespace NzbDrone.Core.Lifecycle
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Lifecycle
|
namespace NzbDrone.Core.Lifecycle
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@ using System.Net;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Tv.Events;
|
using NzbDrone.Core.Tv.Events;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
|
{
|
||||||
|
public class BackendCommandAttribute : Attribute
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,22 +1,16 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class CleanMediaFileDb : ICommand
|
public class CleanMediaFileDb : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
public int SeriesId { get; private set; }
|
public int SeriesId { get; private set; }
|
||||||
|
|
||||||
public CleanMediaFileDb()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public CleanMediaFileDb(int seriesId)
|
public CleanMediaFileDb(int seriesId)
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
SeriesId = seriesId;
|
SeriesId = seriesId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Messaging;
|
using NzbDrone.Core.Messaging;
|
||||||
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class CleanUpRecycleBinCommand : ICommand
|
public class CleanUpRecycleBinCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public CleanUpRecycleBinCommand()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,16 +1,9 @@
|
||||||
using System;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Common;
|
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class DownloadedEpisodesScanCommand : ICommand
|
public class DownloadedEpisodesScanCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
|
|
||||||
public DownloadedEpisodesScanCommand()
|
|
||||||
{
|
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,24 +1,23 @@
|
||||||
using System;
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class RenameSeasonCommand : ICommand
|
public class RenameSeasonCommand : Command
|
||||||
{
|
{
|
||||||
public int SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
public int SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
|
|
||||||
public String CommandId { get; private set; }
|
public override bool SendUpdatesToClient
|
||||||
|
|
||||||
public RenameSeasonCommand()
|
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public RenameSeasonCommand(int seriesId, int seasonNumber)
|
public RenameSeasonCommand(int seriesId, int seasonNumber)
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
SeriesId = seriesId;
|
SeriesId = seriesId;
|
||||||
SeasonNumber = seasonNumber;
|
SeasonNumber = seasonNumber;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,26 @@
|
||||||
using System;
|
using NzbDrone.Core.Messaging;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Common.Messaging;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class RenameSeriesCommand : ICommand
|
public class RenameSeriesCommand : Command
|
||||||
{
|
{
|
||||||
public String CommandId { get; private set; }
|
|
||||||
public int SeriesId { get; set; }
|
public int SeriesId { get; set; }
|
||||||
|
|
||||||
|
public override bool SendUpdatesToClient
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public RenameSeriesCommand()
|
public RenameSeriesCommand()
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RenameSeriesCommand(int seriesId)
|
public RenameSeriesCommand(int seriesId)
|
||||||
{
|
{
|
||||||
CommandId = HashUtil.GenerateCommandId();
|
|
||||||
SeriesId = seriesId;
|
SeriesId = seriesId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue