Switched to SQLCE 4.0
This commit is contained in:
parent
5b2111ff11
commit
69239bc371
|
@ -33,4 +33,5 @@ _ReSharper*/
|
||||||
#NZBDrone specific
|
#NZBDrone specific
|
||||||
*.db
|
*.db
|
||||||
*Web.Publish.xml
|
*Web.Publish.xml
|
||||||
NzbDrone.Web/NzbDrone.Web.Publish.xml
|
NzbDrone.Web/NzbDrone.Web.Publish.xml
|
||||||
|
*.sdf
|
|
@ -70,4 +70,75 @@
|
||||||
<Abbreviation Text="SQ" />
|
<Abbreviation Text="SQ" />
|
||||||
</Naming2>
|
</Naming2>
|
||||||
</CodeStyleSettings>
|
</CodeStyleSettings>
|
||||||
|
<CustomStructuralPatterns>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<Comment>Replace with FluentAssertion</Comment>
|
||||||
|
<ReplacePattern>$arg$.Should().BeTrue();</ReplacePattern>
|
||||||
|
<SearchPattern><![CDATA[Assert.IsTrue($arg$);
|
||||||
|
]]></SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="excpected" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<Comment>Replace with FluentAssertion</Comment>
|
||||||
|
<ReplacePattern>$arg$.Should().BeFalse();</ReplacePattern>
|
||||||
|
<SearchPattern><![CDATA[Assert.IsFalse($arg$);
|
||||||
|
]]></SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="excpected" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<ReplacePattern>$actual$.Should().Be($excpected$);</ReplacePattern>
|
||||||
|
<SearchPattern><![CDATA[Assert.AreEqual($actual$, $excpected$);
|
||||||
|
]]></SearchPattern>
|
||||||
|
<Params>
|
||||||
|
<IgnoreBracesInSingleStatementBlocks>False</IgnoreBracesInSingleStatementBlocks>
|
||||||
|
<IgnoreParanthesisInExpressions>False</IgnoreParanthesisInExpressions>
|
||||||
|
<SmartMatchAssociativeExpressions>False</SmartMatchAssociativeExpressions>
|
||||||
|
<TreatReversedBinaryExpressionsEquivalent>Never</TreatReversedBinaryExpressionsEquivalent>
|
||||||
|
</Params>
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="excpected" Minimal="1" Maximal="1" />
|
||||||
|
<ArgumentPlaceholder Name="actual" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="HINT">
|
||||||
|
<ReplacePattern>$excpected$.Should().Be($actual$);</ReplacePattern>
|
||||||
|
<SearchPattern><![CDATA[$actual$.Should().Be($excpected$);
|
||||||
|
]]></SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="excpected" Minimal="1" Maximal="1" />
|
||||||
|
<ArgumentPlaceholder Name="actual" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<ReplacePattern>$arg$.Should().NotBeNull();</ReplacePattern>
|
||||||
|
<SearchPattern>Assert.IsNotNull($arg$);</SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="arg" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<ReplacePattern>$arg$.Should().NotBeEmpty();</ReplacePattern>
|
||||||
|
<SearchPattern>Assert.IsNotEmpty($arg$);</SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="arg" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
<Pattern Severity="SUGGESTION">
|
||||||
|
<ReplacePattern>$arg$.Should().BeEmpty();</ReplacePattern>
|
||||||
|
<SearchPattern>Assert.IsEmpty($arg$);</SearchPattern>
|
||||||
|
<Params />
|
||||||
|
<Placeholders>
|
||||||
|
<ArgumentPlaceholder Name="arg" Minimal="1" Maximal="1" />
|
||||||
|
</Placeholders>
|
||||||
|
</Pattern>
|
||||||
|
</CustomStructuralPatterns>
|
||||||
</Configuration>
|
</Configuration>
|
|
@ -284,6 +284,46 @@ namespace NzbDrone.Core.Test
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void RefreshEpisodeInfo_should_set_older_than_1900_to_null()
|
||||||
|
{
|
||||||
|
//Arrange
|
||||||
|
const int seriesId = 71663;
|
||||||
|
|
||||||
|
var fakeEpisodes = Builder<TvdbSeries>.CreateNew().With(
|
||||||
|
c => c.Episodes =
|
||||||
|
new List<TvdbEpisode>(Builder<TvdbEpisode>.CreateListOfSize(10).
|
||||||
|
WhereAll()
|
||||||
|
.Have(l => l.Language = new TvdbLanguage(0, "eng", "a"))
|
||||||
|
.WhereTheFirst(7).Have(e => e.FirstAired = new DateTime(1800, 1, 1))
|
||||||
|
.AndTheRemaining().Have(e => e.FirstAired = DateTime.Now)
|
||||||
|
.Build())
|
||||||
|
).With(c => c.Id = seriesId).Build();
|
||||||
|
|
||||||
|
var fakeSeries = Builder<Series>.CreateNew().With(c => c.SeriesId = seriesId).Build();
|
||||||
|
|
||||||
|
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
mocker.SetConstant(MockLib.GetEmptyDatabase());
|
||||||
|
|
||||||
|
mocker.GetMock<TvDbProvider>()
|
||||||
|
.Setup(c => c.GetSeries(seriesId, true))
|
||||||
|
.Returns(fakeEpisodes);
|
||||||
|
|
||||||
|
|
||||||
|
//Act
|
||||||
|
mocker.Resolve<EpisodeProvider>().RefreshEpisodeInfo(fakeSeries);
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
var storedEpisodes = mocker.Resolve<EpisodeProvider>().GetEpisodeBySeries(seriesId).ToList();
|
||||||
|
storedEpisodes.Should().HaveCount(10);
|
||||||
|
storedEpisodes.Where(e => e.AirDate == null).Should().HaveCount(7);
|
||||||
|
storedEpisodes.Where(e => e.AirDate != null).Should().HaveCount(3);
|
||||||
|
|
||||||
|
mocker.VerifyAllMocks();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void new_episodes_only_calls_Insert()
|
public void new_episodes_only_calls_Insert()
|
||||||
{
|
{
|
||||||
|
@ -595,7 +635,7 @@ namespace NzbDrone.Core.Test
|
||||||
var db = MockLib.GetEmptyDatabase();
|
var db = MockLib.GetEmptyDatabase();
|
||||||
mocker.SetConstant(db);
|
mocker.SetConstant(db);
|
||||||
|
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, 1, 1);
|
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, 1, 1);
|
||||||
|
|
||||||
|
@ -660,7 +700,7 @@ namespace NzbDrone.Core.Test
|
||||||
episode.EpisodeFile.Should().BeNull();
|
episode.EpisodeFile.Should().BeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -683,7 +723,7 @@ namespace NzbDrone.Core.Test
|
||||||
.Returns(fakeSeries);
|
.Returns(fakeSeries);
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate);
|
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate.Value);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First());
|
episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First());
|
||||||
|
@ -709,7 +749,7 @@ namespace NzbDrone.Core.Test
|
||||||
.Returns(fakeSeries);
|
.Returns(fakeSeries);
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate);
|
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate.Value);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First());
|
episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First());
|
||||||
|
@ -718,6 +758,6 @@ namespace NzbDrone.Core.Test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
// ReSharper disable RedundantUsingDirective
|
// ReSharper disable RedundantUsingDirective
|
||||||
using System;
|
using System;
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
using NzbDrone.Core.Repository;
|
using NzbDrone.Core.Repository;
|
||||||
|
@ -107,14 +108,14 @@ namespace NzbDrone.Core.Test
|
||||||
public void low_air_date()
|
public void low_air_date()
|
||||||
{
|
{
|
||||||
Episode episode = Builder<Episode>.CreateNew()
|
Episode episode = Builder<Episode>.CreateNew()
|
||||||
.With(e => e.AirDate = DateTime.Now.AddYears(-200))
|
.With(e => e.AirDate = DateTime.Now.AddDays(20))
|
||||||
.With(e => e.Ignored = false)
|
.With(e => e.Ignored = false)
|
||||||
.With(e => e.EpisodeFileId = 0)
|
.With(e => e.EpisodeFileId = 0)
|
||||||
.With(e => e.GrabDate = null)
|
.With(e => e.GrabDate = null)
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
Assert.AreEqual(EpisodeStatusType.NotAired, episode.Status);
|
episode.Status.Should().Be(EpisodeStatusType.NotAired);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -13,7 +13,7 @@ namespace NzbDrone.Core.Test
|
||||||
[TearDown]
|
[TearDown]
|
||||||
public void TearDown()
|
public void TearDown()
|
||||||
{
|
{
|
||||||
var filesToDelete = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.db", SearchOption.AllDirectories);
|
var filesToDelete = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories);
|
||||||
foreach (var file in filesToDelete)
|
foreach (var file in filesToDelete)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.Framework
|
||||||
|
|
||||||
if (String.IsNullOrWhiteSpace(fileName))
|
if (String.IsNullOrWhiteSpace(fileName))
|
||||||
{
|
{
|
||||||
fileName = Guid.NewGuid() + ".db";
|
fileName = Guid.NewGuid() + ".sdf";
|
||||||
}
|
}
|
||||||
|
|
||||||
var connectionString = Connection.GetConnectionString(fileName);
|
var connectionString = Connection.GetConnectionString(fileName);
|
||||||
|
|
|
@ -145,14 +145,13 @@ namespace NzbDrone.Core.Test
|
||||||
var result = mocker.Resolve<HistoryProvider>().GetBestQualityInHistory(history.EpisodeId);
|
var result = mocker.Resolve<HistoryProvider>().GetBestQualityInHistory(history.EpisodeId);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsNotNull(result);
|
result.Should().NotBeNull();
|
||||||
result.QualityType.Should().Be(QualityTypes.Bluray720p);
|
result.QualityType.Should().Be(QualityTypes.Bluray720p);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void add_item()
|
public void add_item()
|
||||||
{
|
{
|
||||||
//Arange
|
|
||||||
var mocker = new AutoMoqer();
|
var mocker = new AutoMoqer();
|
||||||
var db = MockLib.GetEmptyDatabase();
|
var db = MockLib.GetEmptyDatabase();
|
||||||
|
|
||||||
|
@ -181,13 +180,14 @@ namespace NzbDrone.Core.Test
|
||||||
var storedHistory = db.Fetch<History>();
|
var storedHistory = db.Fetch<History>();
|
||||||
|
|
||||||
storedHistory.Should().HaveCount(1);
|
storedHistory.Should().HaveCount(1);
|
||||||
Assert.AreEqual(history.Date, storedHistory.First().Date);
|
history.Date.Should().BeWithin(TimeSpan.FromMinutes(1)).Before(storedHistory.First().Date);
|
||||||
Assert.AreEqual(history.EpisodeId, storedHistory.First().EpisodeId);
|
|
||||||
Assert.AreEqual(history.SeriesId, storedHistory.First().SeriesId);
|
history.EpisodeId.Should().Be(storedHistory.First().EpisodeId);
|
||||||
Assert.AreEqual(history.NzbTitle, storedHistory.First().NzbTitle);
|
history.SeriesId.Should().Be(storedHistory.First().SeriesId);
|
||||||
Assert.AreEqual(history.Indexer, storedHistory.First().Indexer);
|
history.NzbTitle.Should().Be(storedHistory.First().NzbTitle);
|
||||||
Assert.AreEqual(history.Quality, storedHistory.First().Quality);
|
history.Indexer.Should().Be(storedHistory.First().Indexer);
|
||||||
Assert.AreEqual(history.IsProper, storedHistory.First().IsProper);
|
history.Quality.Should().Be(storedHistory.First().Quality);
|
||||||
|
history.IsProper.Should().Be(storedHistory.First().IsProper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using AutoMoq;
|
using AutoMoq;
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
|
@ -193,7 +194,7 @@ namespace NzbDrone.Core.Test
|
||||||
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
|
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ namespace NzbDrone.Core.Test
|
||||||
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
|
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test
|
||||||
var settings = timerProvider.All();
|
var settings = timerProvider.All();
|
||||||
Assert.IsNotEmpty(settings);
|
Assert.IsNotEmpty(settings);
|
||||||
Assert.AreNotEqual(DateTime.MinValue, settings[0].LastExecution);
|
Assert.AreNotEqual(DateTime.MinValue, settings[0].LastExecution);
|
||||||
Assert.IsTrue(settings[0].Success);
|
settings[0].Success.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -75,9 +75,8 @@ namespace NzbDrone.Core.Test
|
||||||
var firstRun = timerProvider.RunScheduled();
|
var firstRun = timerProvider.RunScheduled();
|
||||||
var secondRun = timerProvider.RunScheduled();
|
var secondRun = timerProvider.RunScheduled();
|
||||||
|
|
||||||
Assert.IsTrue(firstRun);
|
firstRun.Should().BeTrue();
|
||||||
Assert.IsTrue(secondRun);
|
secondRun.Should().BeTrue();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -97,9 +96,8 @@ namespace NzbDrone.Core.Test
|
||||||
Thread.Sleep(2000);
|
Thread.Sleep(2000);
|
||||||
var secondRun = timerProvider.QueueJob(typeof(FakeJob));
|
var secondRun = timerProvider.QueueJob(typeof(FakeJob));
|
||||||
|
|
||||||
Assert.IsTrue(firstRun);
|
firstRun.Should().BeTrue();
|
||||||
Assert.IsTrue(secondRun);
|
secondRun.Should().BeTrue();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -142,8 +140,8 @@ namespace NzbDrone.Core.Test
|
||||||
Thread.Sleep(2000);
|
Thread.Sleep(2000);
|
||||||
var secondRun = timerProvider.QueueJob(typeof(BrokenJob));
|
var secondRun = timerProvider.QueueJob(typeof(BrokenJob));
|
||||||
|
|
||||||
Assert.IsTrue(firstRun);
|
firstRun.Should().BeTrue();
|
||||||
Assert.IsTrue(secondRun);
|
secondRun.Should().BeTrue();
|
||||||
Thread.Sleep(2000);
|
Thread.Sleep(2000);
|
||||||
ExceptionVerification.ExcpectedErrors(2);
|
ExceptionVerification.ExcpectedErrors(2);
|
||||||
}
|
}
|
||||||
|
@ -174,7 +172,7 @@ namespace NzbDrone.Core.Test
|
||||||
thread1.Join();
|
thread1.Join();
|
||||||
thread2.Join();
|
thread2.Join();
|
||||||
|
|
||||||
Assert.IsTrue(firstRun);
|
firstRun.Should().BeTrue();
|
||||||
Assert.IsFalse(secondRun);
|
Assert.IsFalse(secondRun);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -230,13 +228,11 @@ namespace NzbDrone.Core.Test
|
||||||
//Assert
|
//Assert
|
||||||
|
|
||||||
timers.Should().HaveCount(1);
|
timers.Should().HaveCount(1);
|
||||||
Assert.AreEqual(fakeTimer.DefaultInterval, timers[0].Interval);
|
timers[0].Interval.Should().Be(fakeTimer.DefaultInterval);
|
||||||
Assert.AreEqual(fakeTimer.Name, timers[0].Name);
|
timers[0].Name.Should().Be(fakeTimer.Name);
|
||||||
Assert.AreEqual(fakeTimer.GetType().ToString(), timers[0].TypeName);
|
timers[0].TypeName.Should().Be(fakeTimer.GetType().ToString());
|
||||||
Assert.AreEqual(DateTime.MinValue, timers[0].LastExecution);
|
timers[0].LastExecution.Should().HaveYear(2000);
|
||||||
Assert.IsTrue(timers[0].Enable);
|
timers[0].Enable.Should().BeTrue();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -267,7 +263,7 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
timers.Should().HaveCount(1);
|
timers.Should().HaveCount(1);
|
||||||
Assert.IsTrue(timers[0].Enable);
|
timers[0].Enable.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -364,8 +360,8 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
var settings = timerProvider.All();
|
var settings = timerProvider.All();
|
||||||
Assert.IsNotEmpty(settings);
|
settings.Should().NotBeEmpty();
|
||||||
Assert.AreEqual(DateTime.MinValue, settings[0].LastExecution);
|
settings[0].LastExecution.Should().HaveYear(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|
|
@ -39,11 +39,10 @@ namespace NzbDrone.Core.Test
|
||||||
//Assert
|
//Assert
|
||||||
db.Fetch<Log>().Should().HaveCount(1);
|
db.Fetch<Log>().Should().HaveCount(1);
|
||||||
|
|
||||||
var logItem = db.Fetch<Log>().First();
|
var logItem = db.Fetch<Log>().First();
|
||||||
Assert.AreNotEqual(new DateTime(), logItem.Time);
|
Assert.AreNotEqual(new DateTime(), logItem.Time);
|
||||||
Assert.AreEqual(message, logItem.Message);
|
Assert.AreEqual(message, logItem.Message);
|
||||||
Assert.AreEqual(Logger.Name, logItem.Logger);
|
Assert.AreEqual(Logger.Name, logItem.Logger);
|
||||||
Assert.AreEqual(Logger.Name, logItem.Logger);
|
|
||||||
Assert.AreEqual(LogLevel.Info.Name, logItem.Level);
|
Assert.AreEqual(LogLevel.Info.Name, logItem.Level);
|
||||||
Assert.AreEqual("write_log", logItem.Method);
|
Assert.AreEqual("write_log", logItem.Method);
|
||||||
}
|
}
|
||||||
|
@ -149,14 +148,14 @@ namespace NzbDrone.Core.Test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void null_string_as_arg_should_not_fail()
|
public void null_string_as_arg_should_not_fail()
|
||||||
{
|
{
|
||||||
//setup
|
//setup
|
||||||
|
|
||||||
Logger Logger = LogManager.GetCurrentClassLogger();
|
Logger Logger = LogManager.GetCurrentClassLogger();
|
||||||
var epFile = new EpisodeFile();
|
var epFile = new EpisodeFile();
|
||||||
Logger.Trace("File {0} no longer exists on disk. removing from database.", epFile.Path);
|
Logger.Trace("File {0} no longer exists on disk. removing from database.", epFile.Path);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using NUnit.Framework;
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
using NzbDrone.Core.Repository.Quality;
|
using NzbDrone.Core.Repository.Quality;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
@ -55,9 +56,9 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.Bluray1080p, true);
|
var first = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
var second = new Quality(QualityTypes.Bluray1080p, true);
|
var second = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
|
|
||||||
Assert.IsTrue(first == second);
|
(first == second).Should().BeTrue();
|
||||||
Assert.IsTrue(first >= second);
|
(first >= second).Should().BeTrue();
|
||||||
Assert.IsTrue(first <= second);
|
(first <= second).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -66,7 +67,7 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.Bluray1080p, true);
|
var first = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
var second = new Quality(QualityTypes.Unknown, true);
|
var second = new Quality(QualityTypes.Unknown, true);
|
||||||
|
|
||||||
Assert.IsFalse(first == second);
|
(first == second).Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -75,7 +76,7 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.Bluray1080p, true);
|
var first = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
var second = new Quality(QualityTypes.Bluray1080p, false);
|
var second = new Quality(QualityTypes.Bluray1080p, false);
|
||||||
|
|
||||||
Assert.IsFalse(first == second);
|
(first == second).Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,7 +95,7 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.Bluray1080p, true);
|
var first = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
var second = new Quality(QualityTypes.Unknown, true);
|
var second = new Quality(QualityTypes.Unknown, true);
|
||||||
|
|
||||||
Assert.IsTrue(first != second);
|
(first != second).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -103,7 +104,7 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.Bluray1080p, true);
|
var first = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
var second = new Quality(QualityTypes.Bluray1080p, false);
|
var second = new Quality(QualityTypes.Bluray1080p, false);
|
||||||
|
|
||||||
Assert.IsTrue(first != second);
|
(first != second).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -112,8 +113,8 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.DVD, true);
|
var first = new Quality(QualityTypes.DVD, true);
|
||||||
var second = new Quality(QualityTypes.Bluray1080p, true);
|
var second = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
|
|
||||||
Assert.IsTrue(first < second);
|
(first < second).Should().BeTrue();
|
||||||
Assert.IsTrue(first <= second);
|
(first <= second).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -122,8 +123,8 @@ namespace NzbDrone.Core.Test
|
||||||
var first = new Quality(QualityTypes.DVD, true);
|
var first = new Quality(QualityTypes.DVD, true);
|
||||||
var second = new Quality(QualityTypes.Bluray1080p, true);
|
var second = new Quality(QualityTypes.Bluray1080p, true);
|
||||||
|
|
||||||
Assert.IsTrue(second > first);
|
(second > first).Should().BeTrue();
|
||||||
Assert.IsTrue(second >= first);
|
(second >= first).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,10 +54,9 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
var rootDirs = rootDirProvider.GetAll();
|
var rootDirs = rootDirProvider.GetAll();
|
||||||
Assert.IsNotEmpty(rootDirs);
|
rootDirs.Should().NotBeEmpty();
|
||||||
|
|
||||||
rootDirs.Should().HaveCount(1);
|
rootDirs.Should().HaveCount(1);
|
||||||
Assert.AreEqual(path, rootDirs.First().Path);
|
path.Should().Be(rootDirs.First().Path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,9 +76,8 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
var rootDirs = rootDirProvider.GetAll();
|
var rootDirs = rootDirProvider.GetAll();
|
||||||
Assert.IsNotEmpty(rootDirs);
|
|
||||||
rootDirs.Should().HaveCount(1);
|
rootDirs.Should().HaveCount(1);
|
||||||
Assert.AreEqual(newPath, rootDirs.First().Path);
|
newPath.Should().Be(rootDirs.First().Path);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -115,8 +113,8 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
var rootDir = rootDirProvider.GetRootDir(id);
|
var rootDir = rootDirProvider.GetRootDir(id);
|
||||||
Assert.AreEqual(1, rootDir.Id);
|
rootDir.Id.Should().Be(1);
|
||||||
Assert.AreEqual(path, rootDir.Path);
|
rootDir.Path.Should().Be(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -130,8 +128,8 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
var result = mocker.Resolve<RootDirProvider>().GetUnmappedFolders(path);
|
var result = mocker.Resolve<RootDirProvider>().GetUnmappedFolders(path);
|
||||||
|
|
||||||
Assert.IsNotNull(result);
|
result.Should().NotBeNull();
|
||||||
Assert.IsEmpty(result);
|
result.Should().BeEmpty();
|
||||||
|
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using AutoMoq;
|
using AutoMoq;
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
|
@ -63,7 +64,7 @@ namespace NzbDrone.Core.Test
|
||||||
"http://www.nzbclub.com/nzb_download.aspx?mid=1950232", "This is an Nzb");
|
"http://www.nzbclub.com/nzb_download.aspx?mid=1950232", "This is an Nzb");
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ namespace NzbDrone.Core.Test
|
||||||
"http://www.newzbin.com/browse/post/6107863/nzb", "This is an Nzb");
|
"http://www.newzbin.com/browse/post/6107863/nzb", "This is an Nzb");
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -187,7 +188,7 @@ namespace NzbDrone.Core.Test
|
||||||
bool result = mocker.Resolve<SabProvider>().IsInQueue("Ubuntu Test");
|
bool result = mocker.Resolve<SabProvider>().IsInQueue("Ubuntu Test");
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -332,7 +333,7 @@ namespace NzbDrone.Core.Test
|
||||||
"http://www.newzbin.com/browse/post/6107863/nzb", "Added by unit tests.");
|
"http://www.newzbin.com/browse/post/6107863/nzb", "Added by unit tests.");
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsTrue(result);
|
result.Should().BeTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -202,7 +202,7 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Act, Assert
|
//Act, Assert
|
||||||
var provider = mocker.Resolve<SeriesProvider>();
|
var provider = mocker.Resolve<SeriesProvider>();
|
||||||
Assert.IsTrue(provider.IsMonitored(12));
|
provider.IsMonitored(12).Should().BeTrue();
|
||||||
Assert.IsFalse(provider.IsMonitored(11));
|
Assert.IsFalse(provider.IsMonitored(11));
|
||||||
Assert.IsFalse(provider.IsMonitored(1));
|
Assert.IsFalse(provider.IsMonitored(1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using System.Data.SQLite;
|
using System.Data.SQLite;
|
||||||
|
using System.Data.SqlServerCe;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using MvcMiniProfiler.Data;
|
using MvcMiniProfiler.Data;
|
||||||
using PetaPoco;
|
using PetaPoco;
|
||||||
|
@ -21,14 +22,15 @@ namespace NzbDrone.Core.Datastore
|
||||||
|
|
||||||
public static string GetConnectionString(string path)
|
public static string GetConnectionString(string path)
|
||||||
{
|
{
|
||||||
return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path);
|
//return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path);
|
||||||
|
return String.Format("Data Source={0}", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String MainConnectionString
|
public static String MainConnectionString
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return GetConnectionString(Path.Combine(AppDataPath.FullName, "nzbdrone.db"));
|
return GetConnectionString(Path.Combine(AppDataPath.FullName, "nzbdrone.sdf"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ namespace NzbDrone.Core.Datastore
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.db"));
|
return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.sdf"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,9 +46,9 @@ namespace NzbDrone.Core.Datastore
|
||||||
public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true)
|
public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true)
|
||||||
{
|
{
|
||||||
MigrationsHelper.Run(connectionString, true);
|
MigrationsHelper.Run(connectionString, true);
|
||||||
var sqliteConnection = new SQLiteConnection(connectionString);
|
var sqliteConnection = new SqlCeConnection(connectionString);
|
||||||
DbConnection connection = sqliteConnection;
|
DbConnection connection = sqliteConnection;
|
||||||
|
|
||||||
if (profiled)
|
if (profiled)
|
||||||
{
|
{
|
||||||
connection = ProfiledDbConnection.Get(sqliteConnection);
|
connection = ProfiledDbConnection.Get(sqliteConnection);
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Data;
|
|
||||||
using Migrator.Framework;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Datastore.Migrations
|
|
||||||
{
|
|
||||||
|
|
||||||
[Migration(20110619)]
|
|
||||||
public class Migration20110619 : Migration
|
|
||||||
{
|
|
||||||
public override void Up()
|
|
||||||
{
|
|
||||||
if (Database.TableExists("Histories"))
|
|
||||||
{
|
|
||||||
Database.RemoveTable("Histories");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Down()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,8 +5,8 @@ using Migrator.Framework;
|
||||||
namespace NzbDrone.Core.Datastore.Migrations
|
namespace NzbDrone.Core.Datastore.Migrations
|
||||||
{
|
{
|
||||||
|
|
||||||
[Migration(20110604)]
|
[Migration(20110622)]
|
||||||
public class Migration20110616 : Migration
|
public class Migration20110622 : Migration
|
||||||
{
|
{
|
||||||
public override void Up()
|
public override void Up()
|
||||||
{
|
{
|
||||||
|
@ -17,12 +17,12 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
new Column("CleanTitle", DbType.String, ColumnProperty.Null),
|
new Column("CleanTitle", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Status", DbType.String, ColumnProperty.Null),
|
new Column("Status", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Overview", DbType.String, ColumnProperty.Null),
|
new Column("Overview", DbType.String, ColumnProperty.Null),
|
||||||
new Column("AirsDayOfWeek", DbType.Int16, ColumnProperty.Null),
|
new Column("AirsDayOfWeek", DbType.Int32, ColumnProperty.Null),
|
||||||
new Column("AirTimes", DbType.String, ColumnProperty.Null),
|
new Column("AirTimes", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Language", DbType.String, ColumnProperty.Null),
|
new Column("Language", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Path", DbType.String, ColumnProperty.NotNull),
|
new Column("Path", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("QualityProfileId", DbType.Int16, ColumnProperty.NotNull),
|
new Column("QualityProfileId", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("SeasonFolder", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("SeasonFolder", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("LastInfoSync", DbType.DateTime, ColumnProperty.Null),
|
new Column("LastInfoSync", DbType.DateTime, ColumnProperty.Null),
|
||||||
new Column("LastDiskSync", DbType.DateTime, ColumnProperty.Null)
|
new Column("LastDiskSync", DbType.DateTime, ColumnProperty.Null)
|
||||||
|
@ -33,8 +33,8 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
new Column("EpisodeId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
new Column("EpisodeId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("TvDbEpisodeId", DbType.Int32, ColumnProperty.Null),
|
new Column("TvDbEpisodeId", DbType.Int32, ColumnProperty.Null),
|
||||||
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull),
|
new Column("SeasonNumber", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("EpisodeNumber", DbType.Int16, ColumnProperty.NotNull),
|
new Column("EpisodeNumber", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("Title", DbType.String, ColumnProperty.Null),
|
new Column("Title", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Overview", DbType.String, ColumnProperty.Null),
|
new Column("Overview", DbType.String, ColumnProperty.Null),
|
||||||
new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
|
@ -50,11 +50,11 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
ColumnProperty.PrimaryKeyWithIdentity),
|
ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("Path", DbType.String, ColumnProperty.NotNull),
|
new Column("Path", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Quality", DbType.Int16, ColumnProperty.NotNull),
|
new Column("Quality", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("Proper", DbType.Int16, ColumnProperty.NotNull),
|
new Column("Proper", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("Size", DbType.Int64, ColumnProperty.NotNull),
|
new Column("Size", DbType.Int64, ColumnProperty.NotNull),
|
||||||
new Column("DateAdded", DbType.DateTime, ColumnProperty.NotNull),
|
new Column("DateAdded", DbType.DateTime, ColumnProperty.NotNull),
|
||||||
new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull)
|
new Column("SeasonNumber", DbType.Int32, ColumnProperty.NotNull)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,25 +73,25 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
|
|
||||||
Database.AddTable("History", new[]
|
Database.AddTable("History", new[]
|
||||||
{
|
{
|
||||||
new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKey),
|
new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("EpisodeId", DbType.Int32, ColumnProperty.NotNull),
|
new Column("EpisodeId", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("NzbTitle", DbType.String, ColumnProperty.NotNull),
|
new Column("NzbTitle", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Date", DbType.DateTime, ColumnProperty.NotNull),
|
new Column("Date", DbType.DateTime, ColumnProperty.NotNull),
|
||||||
new Column("Quality", DbType.Int16, ColumnProperty.NotNull),
|
new Column("Quality", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("IsProper", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("IsProper", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("Indexer", DbType.String, ColumnProperty.NotNull)
|
new Column("Indexer", DbType.String, ColumnProperty.NotNull)
|
||||||
});
|
});
|
||||||
|
|
||||||
Database.AddTable("RootDirs", new[]
|
Database.AddTable("RootDirs", new[]
|
||||||
{
|
{
|
||||||
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey),
|
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Path", DbType.String, ColumnProperty.NotNull)
|
new Column("Path", DbType.String, ColumnProperty.NotNull)
|
||||||
});
|
});
|
||||||
|
|
||||||
Database.AddTable("ExternalNotificationSettings", new[]
|
Database.AddTable("ExternalNotificationSettings", new[]
|
||||||
{
|
{
|
||||||
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey),
|
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Enabled", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("Enabled", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("NotifierName", DbType.String, ColumnProperty.NotNull),
|
new Column("NotifierName", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Name", DbType.String, ColumnProperty.NotNull)
|
new Column("Name", DbType.String, ColumnProperty.NotNull)
|
||||||
|
@ -99,7 +99,7 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
|
|
||||||
Database.AddTable("JobSettings", new[]
|
Database.AddTable("JobSettings", new[]
|
||||||
{
|
{
|
||||||
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey),
|
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Enable", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("Enable", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("TypeName", DbType.String, ColumnProperty.NotNull),
|
new Column("TypeName", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
||||||
|
@ -110,7 +110,7 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
|
|
||||||
Database.AddTable("QualityProfiles", new[]
|
Database.AddTable("QualityProfiles", new[]
|
||||||
{
|
{
|
||||||
new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKey),
|
new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Cutoff", DbType.Int32, ColumnProperty.NotNull),
|
new Column("Cutoff", DbType.Int32, ColumnProperty.NotNull),
|
||||||
new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull),
|
new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull),
|
||||||
|
@ -118,7 +118,7 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
|
|
||||||
Database.AddTable("Logs", new[]
|
Database.AddTable("Logs", new[]
|
||||||
{
|
{
|
||||||
new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKey),
|
new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Message", DbType.String, ColumnProperty.NotNull),
|
new Column("Message", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Time", DbType.DateTime, ColumnProperty.NotNull),
|
new Column("Time", DbType.DateTime, ColumnProperty.NotNull),
|
||||||
new Column("Logger", DbType.String, ColumnProperty.NotNull),
|
new Column("Logger", DbType.String, ColumnProperty.NotNull),
|
||||||
|
@ -130,7 +130,7 @@ namespace NzbDrone.Core.Datastore.Migrations
|
||||||
|
|
||||||
Database.AddTable("IndexerSettings", new[]
|
Database.AddTable("IndexerSettings", new[]
|
||||||
{
|
{
|
||||||
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey),
|
new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
|
||||||
new Column("Enable", DbType.Boolean, ColumnProperty.NotNull),
|
new Column("Enable", DbType.Boolean, ColumnProperty.NotNull),
|
||||||
new Column("IndexProviderType", DbType.String, ColumnProperty.NotNull),
|
new Column("IndexProviderType", DbType.String, ColumnProperty.NotNull),
|
||||||
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
new Column("Name", DbType.String, ColumnProperty.NotNull),
|
|
@ -1,5 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Data.SqlServerCe;
|
||||||
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
|
||||||
|
@ -16,6 +18,8 @@ namespace NzbDrone.Core.Datastore
|
||||||
if (_migrated.ContainsKey(connetionString)) return;
|
if (_migrated.ContainsKey(connetionString)) return;
|
||||||
_migrated.Add(connetionString, string.Empty);
|
_migrated.Add(connetionString, string.Empty);
|
||||||
|
|
||||||
|
EnsureDatabase(connetionString);
|
||||||
|
|
||||||
Logger.Info("Preparing run database migration");
|
Logger.Info("Preparing run database migration");
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -23,11 +27,11 @@ namespace NzbDrone.Core.Datastore
|
||||||
Migrator.Migrator migrator;
|
Migrator.Migrator migrator;
|
||||||
if (trace)
|
if (trace)
|
||||||
{
|
{
|
||||||
migrator = new Migrator.Migrator("Sqlite", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)), true, new MigrationLogger());
|
migrator = new Migrator.Migrator("sqlserverce", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)), true, new MigrationLogger());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
migrator = new Migrator.Migrator("Sqlite", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)));
|
migrator = new Migrator.Migrator("sqlserverce", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,8 +50,18 @@ namespace NzbDrone.Core.Datastore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void EnsureDatabase(string constr)
|
||||||
|
{
|
||||||
|
var connection = new SqlCeConnection(constr);
|
||||||
|
if (!File.Exists(connection.Database))
|
||||||
|
{
|
||||||
|
var engine = new SqlCeEngine(constr);
|
||||||
|
engine.CreateDatabase();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -24,6 +24,7 @@ using System.Reflection.Emit;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using MvcMiniProfiler;
|
||||||
|
|
||||||
namespace PetaPoco
|
namespace PetaPoco
|
||||||
{
|
{
|
||||||
|
@ -316,7 +317,7 @@ namespace PetaPoco
|
||||||
Oracle,
|
Oracle,
|
||||||
SQLite
|
SQLite
|
||||||
}
|
}
|
||||||
DBType _dbType = DBType.SQLite;
|
DBType _dbType = DBType.SqlServerCE;
|
||||||
|
|
||||||
// Common initialization
|
// Common initialization
|
||||||
private void CommonConstruct()
|
private void CommonConstruct()
|
||||||
|
@ -645,28 +646,31 @@ namespace PetaPoco
|
||||||
|
|
||||||
public int Execute(Sql sql)
|
public int Execute(Sql sql)
|
||||||
{
|
{
|
||||||
try
|
using (MiniProfiler.StepStatic("Peta Execute SQL"))
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, sql))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var result = cmd.ExecuteNonQuery();
|
using (var cmd = CreateCommand(_sharedConnection, sql))
|
||||||
OnExecutedCommand(cmd);
|
{
|
||||||
return result;
|
var result = cmd.ExecuteNonQuery();
|
||||||
|
OnExecutedCommand(cmd);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseSharedConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
catch (Exception x)
|
||||||
{
|
{
|
||||||
CloseSharedConnection();
|
OnException(x);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute and cast a scalar property
|
// Execute and cast a scalar property
|
||||||
|
@ -677,28 +681,31 @@ namespace PetaPoco
|
||||||
|
|
||||||
public T ExecuteScalar<T>(Sql sql)
|
public T ExecuteScalar<T>(Sql sql)
|
||||||
{
|
{
|
||||||
try
|
using (MiniProfiler.StepStatic("Peta ExecuteScalar<T>"))
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, sql))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
object val = cmd.ExecuteScalar();
|
using (var cmd = CreateCommand(_sharedConnection, sql))
|
||||||
OnExecutedCommand(cmd);
|
{
|
||||||
return (T)Convert.ChangeType(val, typeof(T));
|
object val = cmd.ExecuteScalar();
|
||||||
|
OnExecutedCommand(cmd);
|
||||||
|
return (T)Convert.ChangeType(val, typeof(T));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseSharedConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
catch (Exception x)
|
||||||
{
|
{
|
||||||
CloseSharedConnection();
|
OnException(x);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Regex rxSelect = new Regex(@"\A\s*(SELECT|EXECUTE|CALL)\s", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline);
|
Regex rxSelect = new Regex(@"\A\s*(SELECT|EXECUTE|CALL)\s", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline);
|
||||||
|
@ -887,50 +894,55 @@ namespace PetaPoco
|
||||||
|
|
||||||
public IEnumerable<T> Query<T>(Sql sql)
|
public IEnumerable<T> Query<T>(Sql sql)
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
using (MiniProfiler.StepStatic("Peta Query SQL"))
|
||||||
try
|
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, sql))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
IDataReader r;
|
using (var cmd = CreateCommand(_sharedConnection, sql))
|
||||||
var pd = PocoData.ForType(typeof(T));
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
r = cmd.ExecuteReader();
|
IDataReader r;
|
||||||
OnExecutedCommand(cmd);
|
var pd = PocoData.ForType(typeof(T));
|
||||||
}
|
try
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (r)
|
|
||||||
{
|
|
||||||
var factory = pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r) as Func<IDataReader, T>;
|
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
T poco;
|
r = cmd.ExecuteReader();
|
||||||
try
|
OnExecutedCommand(cmd);
|
||||||
{
|
}
|
||||||
if (!r.Read())
|
catch (Exception x)
|
||||||
yield break;
|
{
|
||||||
poco = factory(r);
|
OnException(x);
|
||||||
}
|
throw;
|
||||||
catch (Exception x)
|
}
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
yield return poco;
|
using (r)
|
||||||
|
{
|
||||||
|
var factory =
|
||||||
|
pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r)
|
||||||
|
as Func<IDataReader, T>;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
T poco;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!r.Read())
|
||||||
|
yield break;
|
||||||
|
poco = factory(r);
|
||||||
|
}
|
||||||
|
catch (Exception x)
|
||||||
|
{
|
||||||
|
OnException(x);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return poco;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
finally
|
{
|
||||||
{
|
CloseSharedConnection();
|
||||||
CloseSharedConnection();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1181,62 +1193,65 @@ namespace PetaPoco
|
||||||
// Actual implementation of the multi-poco query
|
// Actual implementation of the multi-poco query
|
||||||
public IEnumerable<TRet> Query<TRet>(Type[] types, object cb, string sql, params object[] args)
|
public IEnumerable<TRet> Query<TRet>(Type[] types, object cb, string sql, params object[] args)
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
using (MiniProfiler.StepStatic("Peta Query Type[]"))
|
||||||
try
|
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, sql, args))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
IDataReader r;
|
using (var cmd = CreateCommand(_sharedConnection, sql, args))
|
||||||
try
|
|
||||||
{
|
{
|
||||||
r = cmd.ExecuteReader();
|
IDataReader r;
|
||||||
OnExecutedCommand(cmd);
|
try
|
||||||
}
|
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
var factory = GetMultiPocoFactory<TRet>(types, sql, r);
|
|
||||||
if (cb == null)
|
|
||||||
cb = GetAutoMapper(types.ToArray());
|
|
||||||
bool bNeedTerminator = false;
|
|
||||||
using (r)
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
TRet poco;
|
r = cmd.ExecuteReader();
|
||||||
try
|
OnExecutedCommand(cmd);
|
||||||
{
|
|
||||||
if (!r.Read())
|
|
||||||
break;
|
|
||||||
poco = factory(r, cb);
|
|
||||||
}
|
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (poco != null)
|
|
||||||
yield return poco;
|
|
||||||
else
|
|
||||||
bNeedTerminator = true;
|
|
||||||
}
|
}
|
||||||
if (bNeedTerminator)
|
catch (Exception x)
|
||||||
{
|
{
|
||||||
var poco = (TRet)(cb as Delegate).DynamicInvoke(new object[types.Length]);
|
OnException(x);
|
||||||
if (poco != null)
|
throw;
|
||||||
yield return poco;
|
}
|
||||||
else
|
var factory = GetMultiPocoFactory<TRet>(types, sql, r);
|
||||||
yield break;
|
if (cb == null)
|
||||||
|
cb = GetAutoMapper(types.ToArray());
|
||||||
|
bool bNeedTerminator = false;
|
||||||
|
using (r)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
TRet poco;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!r.Read())
|
||||||
|
break;
|
||||||
|
poco = factory(r, cb);
|
||||||
|
}
|
||||||
|
catch (Exception x)
|
||||||
|
{
|
||||||
|
OnException(x);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (poco != null)
|
||||||
|
yield return poco;
|
||||||
|
else
|
||||||
|
bNeedTerminator = true;
|
||||||
|
}
|
||||||
|
if (bNeedTerminator)
|
||||||
|
{
|
||||||
|
var poco = (TRet)(cb as Delegate).DynamicInvoke(new object[types.Length]);
|
||||||
|
if (poco != null)
|
||||||
|
yield return poco;
|
||||||
|
else
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
finally
|
{
|
||||||
{
|
CloseSharedConnection();
|
||||||
CloseSharedConnection();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1355,172 +1370,175 @@ namespace PetaPoco
|
||||||
// the new id is returned.
|
// the new id is returned.
|
||||||
public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco)
|
public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco)
|
||||||
{
|
{
|
||||||
try
|
using (MiniProfiler.StepStatic("Peta Insert " + tableName))
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, ""))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var pd = PocoData.ForObject(poco, primaryKeyName);
|
using (var cmd = CreateCommand(_sharedConnection, ""))
|
||||||
var names = new List<string>();
|
|
||||||
var values = new List<string>();
|
|
||||||
var index = 0;
|
|
||||||
var versionName = "";
|
|
||||||
|
|
||||||
foreach (var i in pd.Columns)
|
|
||||||
{
|
{
|
||||||
// Don't insert result columns
|
var pd = PocoData.ForObject(poco, primaryKeyName);
|
||||||
if (i.Value.ResultColumn)
|
var names = new List<string>();
|
||||||
continue;
|
var values = new List<string>();
|
||||||
|
var index = 0;
|
||||||
|
var versionName = "";
|
||||||
|
|
||||||
// Don't insert the primary key (except under oracle where we need bring in the next sequence value)
|
foreach (var i in pd.Columns)
|
||||||
if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0)
|
|
||||||
{
|
{
|
||||||
if (_dbType == DBType.Oracle && !string.IsNullOrEmpty(pd.TableInfo.SequenceName))
|
// Don't insert result columns
|
||||||
|
if (i.Value.ResultColumn)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Don't insert the primary key (except under oracle where we need bring in the next sequence value)
|
||||||
|
if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0)
|
||||||
{
|
{
|
||||||
names.Add(i.Key);
|
if (_dbType == DBType.Oracle && !string.IsNullOrEmpty(pd.TableInfo.SequenceName))
|
||||||
values.Add(string.Format("{0}.nextval", pd.TableInfo.SequenceName));
|
{
|
||||||
|
names.Add(i.Key);
|
||||||
|
values.Add(string.Format("{0}.nextval", pd.TableInfo.SequenceName));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
|
names.Add(EscapeSqlIdentifier(i.Key));
|
||||||
|
values.Add(string.Format("{0}{1}", _paramPrefix, index++));
|
||||||
|
|
||||||
|
object val = i.Value.GetValue(poco);
|
||||||
|
if (i.Value.VersionColumn)
|
||||||
|
{
|
||||||
|
val = 1;
|
||||||
|
versionName = i.Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddParam(cmd, val, _paramPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
names.Add(EscapeSqlIdentifier(i.Key));
|
cmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
|
||||||
values.Add(string.Format("{0}{1}", _paramPrefix, index++));
|
EscapeTableName(tableName),
|
||||||
|
string.Join(",", names.ToArray()),
|
||||||
object val = i.Value.GetValue(poco);
|
string.Join(",", values.ToArray())
|
||||||
if (i.Value.VersionColumn)
|
|
||||||
{
|
|
||||||
val = 1;
|
|
||||||
versionName = i.Key;
|
|
||||||
}
|
|
||||||
|
|
||||||
AddParam(cmd, val, _paramPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
|
|
||||||
EscapeTableName(tableName),
|
|
||||||
string.Join(",", names.ToArray()),
|
|
||||||
string.Join(",", values.ToArray())
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!autoIncrement)
|
if (!autoIncrement)
|
||||||
{
|
{
|
||||||
DoPreExecute(cmd);
|
|
||||||
cmd.ExecuteNonQuery();
|
|
||||||
OnExecutedCommand(cmd);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
object id;
|
|
||||||
|
|
||||||
switch (_dbType)
|
|
||||||
{
|
|
||||||
case DBType.SqlServerCE:
|
|
||||||
DoPreExecute(cmd);
|
DoPreExecute(cmd);
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
OnExecutedCommand(cmd);
|
OnExecutedCommand(cmd);
|
||||||
id = ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;");
|
return true;
|
||||||
break;
|
}
|
||||||
case DBType.SqlServer:
|
|
||||||
cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;";
|
object id;
|
||||||
DoPreExecute(cmd);
|
|
||||||
id = cmd.ExecuteScalar();
|
switch (_dbType)
|
||||||
OnExecutedCommand(cmd);
|
{
|
||||||
break;
|
case DBType.SqlServerCE:
|
||||||
case DBType.PostgreSQL:
|
DoPreExecute(cmd);
|
||||||
if (primaryKeyName != null)
|
cmd.ExecuteNonQuery();
|
||||||
{
|
OnExecutedCommand(cmd);
|
||||||
cmd.CommandText += string.Format("returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName));
|
id = ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;");
|
||||||
|
break;
|
||||||
|
case DBType.SqlServer:
|
||||||
|
cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;";
|
||||||
DoPreExecute(cmd);
|
DoPreExecute(cmd);
|
||||||
id = cmd.ExecuteScalar();
|
id = cmd.ExecuteScalar();
|
||||||
}
|
OnExecutedCommand(cmd);
|
||||||
else
|
break;
|
||||||
{
|
case DBType.PostgreSQL:
|
||||||
id = -1;
|
if (primaryKeyName != null)
|
||||||
DoPreExecute(cmd);
|
{
|
||||||
cmd.ExecuteNonQuery();
|
cmd.CommandText += string.Format("returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName));
|
||||||
}
|
DoPreExecute(cmd);
|
||||||
OnExecutedCommand(cmd);
|
id = cmd.ExecuteScalar();
|
||||||
break;
|
}
|
||||||
case DBType.Oracle:
|
else
|
||||||
if (primaryKeyName != null)
|
{
|
||||||
{
|
id = -1;
|
||||||
cmd.CommandText += string.Format(" returning {0} into :newid", EscapeSqlIdentifier(primaryKeyName));
|
DoPreExecute(cmd);
|
||||||
var param = cmd.CreateParameter();
|
cmd.ExecuteNonQuery();
|
||||||
param.ParameterName = ":newid";
|
}
|
||||||
param.Value = DBNull.Value;
|
OnExecutedCommand(cmd);
|
||||||
param.Direction = ParameterDirection.ReturnValue;
|
break;
|
||||||
param.DbType = DbType.Int64;
|
case DBType.Oracle:
|
||||||
cmd.Parameters.Add(param);
|
if (primaryKeyName != null)
|
||||||
DoPreExecute(cmd);
|
{
|
||||||
cmd.ExecuteNonQuery();
|
cmd.CommandText += string.Format(" returning {0} into :newid", EscapeSqlIdentifier(primaryKeyName));
|
||||||
id = param.Value;
|
var param = cmd.CreateParameter();
|
||||||
}
|
param.ParameterName = ":newid";
|
||||||
else
|
param.Value = DBNull.Value;
|
||||||
{
|
param.Direction = ParameterDirection.ReturnValue;
|
||||||
id = -1;
|
param.DbType = DbType.Int64;
|
||||||
DoPreExecute(cmd);
|
cmd.Parameters.Add(param);
|
||||||
cmd.ExecuteNonQuery();
|
DoPreExecute(cmd);
|
||||||
}
|
cmd.ExecuteNonQuery();
|
||||||
OnExecutedCommand(cmd);
|
id = param.Value;
|
||||||
break;
|
}
|
||||||
case DBType.SQLite:
|
else
|
||||||
if (primaryKeyName != null)
|
{
|
||||||
{
|
id = -1;
|
||||||
cmd.CommandText += ";\nSELECT last_insert_rowid();";
|
DoPreExecute(cmd);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
OnExecutedCommand(cmd);
|
||||||
|
break;
|
||||||
|
case DBType.SQLite:
|
||||||
|
if (primaryKeyName != null)
|
||||||
|
{
|
||||||
|
cmd.CommandText += ";\nSELECT last_insert_rowid();";
|
||||||
|
DoPreExecute(cmd);
|
||||||
|
id = cmd.ExecuteScalar();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
id = -1;
|
||||||
|
DoPreExecute(cmd);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
OnExecutedCommand(cmd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cmd.CommandText += ";\nSELECT @@IDENTITY AS NewID;";
|
||||||
DoPreExecute(cmd);
|
DoPreExecute(cmd);
|
||||||
id = cmd.ExecuteScalar();
|
id = cmd.ExecuteScalar();
|
||||||
}
|
OnExecutedCommand(cmd);
|
||||||
else
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign the ID back to the primary key property
|
||||||
|
if (primaryKeyName != null)
|
||||||
|
{
|
||||||
|
PocoColumn pc;
|
||||||
|
if (pd.Columns.TryGetValue(primaryKeyName, out pc))
|
||||||
{
|
{
|
||||||
id = -1;
|
pc.SetValue(poco, pc.ChangeType(id));
|
||||||
DoPreExecute(cmd);
|
|
||||||
cmd.ExecuteNonQuery();
|
|
||||||
}
|
}
|
||||||
OnExecutedCommand(cmd);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
cmd.CommandText += ";\nSELECT @@IDENTITY AS NewID;";
|
|
||||||
DoPreExecute(cmd);
|
|
||||||
id = cmd.ExecuteScalar();
|
|
||||||
OnExecutedCommand(cmd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assign the ID back to the primary key property
|
|
||||||
if (primaryKeyName != null)
|
|
||||||
{
|
|
||||||
PocoColumn pc;
|
|
||||||
if (pd.Columns.TryGetValue(primaryKeyName, out pc))
|
|
||||||
{
|
|
||||||
pc.SetValue(poco, pc.ChangeType(id));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Assign the Version column
|
// Assign the Version column
|
||||||
if (!string.IsNullOrEmpty(versionName))
|
if (!string.IsNullOrEmpty(versionName))
|
||||||
{
|
|
||||||
PocoColumn pc;
|
|
||||||
if (pd.Columns.TryGetValue(versionName, out pc))
|
|
||||||
{
|
{
|
||||||
pc.SetValue(poco, pc.ChangeType(1));
|
PocoColumn pc;
|
||||||
|
if (pd.Columns.TryGetValue(versionName, out pc))
|
||||||
|
{
|
||||||
|
pc.SetValue(poco, pc.ChangeType(1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseSharedConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
catch (Exception x)
|
||||||
{
|
{
|
||||||
CloseSharedConnection();
|
OnException(x);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert an annotated poco object
|
// Insert an annotated poco object
|
||||||
|
@ -1546,95 +1564,102 @@ namespace PetaPoco
|
||||||
// Update a record with values from a poco. primary key value can be either supplied or read from the poco
|
// Update a record with values from a poco. primary key value can be either supplied or read from the poco
|
||||||
public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue)
|
public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue)
|
||||||
{
|
{
|
||||||
try
|
using (MiniProfiler.StepStatic("Peta Update " + tableName))
|
||||||
{
|
{
|
||||||
OpenSharedConnection();
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var cmd = CreateCommand(_sharedConnection, ""))
|
OpenSharedConnection();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
using (var cmd = CreateCommand(_sharedConnection, ""))
|
||||||
var index = 0;
|
|
||||||
var pd = PocoData.ForObject(poco, primaryKeyName);
|
|
||||||
string versionName = null;
|
|
||||||
object versionValue = null;
|
|
||||||
|
|
||||||
var primaryKeyValuePairs = GetPrimaryKeyValues(primaryKeyName, primaryKeyValue);
|
|
||||||
|
|
||||||
foreach (var i in pd.Columns)
|
|
||||||
{
|
{
|
||||||
// Don't update the primary key, but grab the value if we don't have it
|
var sb = new StringBuilder();
|
||||||
if (primaryKeyValue == null && primaryKeyValuePairs.ContainsKey(i.Key))
|
var index = 0;
|
||||||
|
var pd = PocoData.ForObject(poco, primaryKeyName);
|
||||||
|
string versionName = null;
|
||||||
|
object versionValue = null;
|
||||||
|
|
||||||
|
var primaryKeyValuePairs = GetPrimaryKeyValues(primaryKeyName, primaryKeyValue);
|
||||||
|
|
||||||
|
foreach (var i in pd.Columns)
|
||||||
{
|
{
|
||||||
primaryKeyValuePairs[i.Key] = i.Value.PropertyInfo.GetValue(poco, null);
|
// Don't update the primary key, but grab the value if we don't have it
|
||||||
continue;
|
if (primaryKeyValue == null && primaryKeyValuePairs.ContainsKey(i.Key))
|
||||||
|
{
|
||||||
|
primaryKeyValuePairs[i.Key] = i.Value.PropertyInfo.GetValue(poco, null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dont update result only columns
|
||||||
|
if (i.Value.ResultColumn)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
object value = i.Value.PropertyInfo.GetValue(poco, null);
|
||||||
|
|
||||||
|
if (i.Value.VersionColumn)
|
||||||
|
{
|
||||||
|
versionName = i.Key;
|
||||||
|
versionValue = value;
|
||||||
|
value = Convert.ToInt64(value) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the sql
|
||||||
|
if (index > 0)
|
||||||
|
sb.Append(", ");
|
||||||
|
sb.AppendFormat("{0} = {1}{2}", EscapeSqlIdentifier(i.Key), _paramPrefix, index++);
|
||||||
|
|
||||||
|
// Store the parameter in the command
|
||||||
|
AddParam(cmd, value, _paramPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dont update result only columns
|
cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2}",
|
||||||
if (i.Value.ResultColumn)
|
EscapeSqlIdentifier(tableName), sb.ToString(),
|
||||||
continue;
|
BuildPrimaryKeySql(primaryKeyValuePairs, ref index));
|
||||||
|
|
||||||
object value = i.Value.PropertyInfo.GetValue(poco, null);
|
foreach (var keyValue in primaryKeyValuePairs)
|
||||||
|
|
||||||
if (i.Value.VersionColumn)
|
|
||||||
{
|
{
|
||||||
versionName = i.Key;
|
AddParam(cmd, keyValue.Value, _paramPrefix);
|
||||||
versionValue = value;
|
|
||||||
value = Convert.ToInt64(value) + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the sql
|
if (!string.IsNullOrEmpty(versionName))
|
||||||
if (index > 0)
|
|
||||||
sb.Append(", ");
|
|
||||||
sb.AppendFormat("{0} = {1}{2}", EscapeSqlIdentifier(i.Key), _paramPrefix, index++);
|
|
||||||
|
|
||||||
// Store the parameter in the command
|
|
||||||
AddParam(cmd, value, _paramPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2}",
|
|
||||||
EscapeSqlIdentifier(tableName), sb.ToString(), BuildPrimaryKeySql(primaryKeyValuePairs, ref index));
|
|
||||||
|
|
||||||
foreach (var keyValue in primaryKeyValuePairs)
|
|
||||||
{
|
|
||||||
AddParam(cmd, keyValue.Value, _paramPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(versionName))
|
|
||||||
{
|
|
||||||
cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix, index++);
|
|
||||||
AddParam(cmd, versionValue, _paramPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
DoPreExecute(cmd);
|
|
||||||
|
|
||||||
// Do it
|
|
||||||
var result = cmd.ExecuteNonQuery();
|
|
||||||
OnExecutedCommand(cmd);
|
|
||||||
|
|
||||||
// Set Version
|
|
||||||
if (!string.IsNullOrEmpty(versionName))
|
|
||||||
{
|
|
||||||
PocoColumn pc;
|
|
||||||
if (pd.Columns.TryGetValue(versionName, out pc))
|
|
||||||
{
|
{
|
||||||
pc.PropertyInfo.SetValue(poco, Convert.ChangeType(Convert.ToInt64(versionValue) + 1, pc.PropertyInfo.PropertyType), null);
|
cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix,
|
||||||
|
index++);
|
||||||
|
AddParam(cmd, versionValue, _paramPrefix);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
DoPreExecute(cmd);
|
||||||
|
|
||||||
|
// Do it
|
||||||
|
var result = cmd.ExecuteNonQuery();
|
||||||
|
OnExecutedCommand(cmd);
|
||||||
|
|
||||||
|
// Set Version
|
||||||
|
if (!string.IsNullOrEmpty(versionName))
|
||||||
|
{
|
||||||
|
PocoColumn pc;
|
||||||
|
if (pd.Columns.TryGetValue(versionName, out pc))
|
||||||
|
{
|
||||||
|
pc.PropertyInfo.SetValue(poco,
|
||||||
|
Convert.ChangeType(Convert.ToInt64(versionValue) + 1,
|
||||||
|
pc.PropertyInfo.PropertyType), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CloseSharedConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
catch (Exception x)
|
||||||
{
|
{
|
||||||
CloseSharedConnection();
|
OnException(x);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception x)
|
|
||||||
{
|
|
||||||
OnException(x);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string BuildPrimaryKeySql(Dictionary<string, object> primaryKeyValuePair, ref int index)
|
private string BuildPrimaryKeySql(Dictionary<string, object> primaryKeyValuePair, ref int index)
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
using System;
|
using System;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Targets;
|
using NLog.Targets;
|
||||||
|
using NLog.Targets.Wrappers;
|
||||||
using PetaPoco;
|
using PetaPoco;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Instrumentation
|
namespace NzbDrone.Core.Instrumentation
|
||||||
{
|
{
|
||||||
|
|
||||||
public class SubsonicTarget : Target
|
public class SubsonicTarget : Target
|
||||||
{
|
{
|
||||||
private readonly IDatabase _database;
|
private readonly IDatabase _database;
|
||||||
|
@ -14,6 +16,8 @@ namespace NzbDrone.Core.Instrumentation
|
||||||
_database = database;
|
_database = database;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected override void Write(LogEventInfo logEvent)
|
protected override void Write(LogEventInfo logEvent)
|
||||||
{
|
{
|
||||||
var log = new Log();
|
var log = new Log();
|
||||||
|
|
|
@ -7,14 +7,14 @@ namespace NzbDrone.Core.Model
|
||||||
public class EpisodeParseResult
|
public class EpisodeParseResult
|
||||||
{
|
{
|
||||||
internal string CleanTitle { get; set; }
|
internal string CleanTitle { get; set; }
|
||||||
|
|
||||||
public string EpisodeTitle { get; set; }
|
public string EpisodeTitle { get; set; }
|
||||||
|
|
||||||
internal int SeasonNumber { get; set; }
|
internal int SeasonNumber { get; set; }
|
||||||
|
|
||||||
internal List<int> EpisodeNumbers { get; set; }
|
internal List<int> EpisodeNumbers { get; set; }
|
||||||
|
|
||||||
internal DateTime AirDate { get; set; }
|
internal DateTime? AirDate { get; set; }
|
||||||
|
|
||||||
public Quality Quality { get; set; }
|
public Quality Quality { get; set; }
|
||||||
|
|
||||||
|
@ -30,11 +30,14 @@ namespace NzbDrone.Core.Model
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
if (EpisodeNumbers == null)
|
if (AirDate != null && EpisodeNumbers == null)
|
||||||
return string.Format("{0} - {1} {2}", CleanTitle, AirDate.ToShortDateString(), Quality);
|
return string.Format("{0} - {1} {2}", CleanTitle, AirDate.Value.ToShortDateString(), Quality);
|
||||||
|
|
||||||
return string.Format("{0} - S{1:00}E{2} {3}", CleanTitle, SeasonNumber,
|
if (EpisodeNumbers != null)
|
||||||
String.Join("-", EpisodeNumbers), Quality);
|
return string.Format("{0} - S{1:00}E{2} {3}", CleanTitle, SeasonNumber,
|
||||||
|
String.Join("-", EpisodeNumbers), Quality);
|
||||||
|
|
||||||
|
return NzbTitle;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,6 +159,7 @@
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\Libraries\System.Data.SQLite.dll</HintPath>
|
<HintPath>..\Libraries\System.Data.SQLite.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
|
@ -176,8 +177,7 @@
|
||||||
<Compile Include="Datastore\MigrationLogger.cs" />
|
<Compile Include="Datastore\MigrationLogger.cs" />
|
||||||
<Compile Include="Datastore\MigrationsHelper.cs" />
|
<Compile Include="Datastore\MigrationsHelper.cs" />
|
||||||
<Compile Include="Datastore\CustomeMapper.cs" />
|
<Compile Include="Datastore\CustomeMapper.cs" />
|
||||||
<Compile Include="Datastore\Migrations\Migration20110619.cs" />
|
<Compile Include="Datastore\Migrations\Migration20110622.cs" />
|
||||||
<Compile Include="Datastore\Migrations\Migration20110616.cs" />
|
|
||||||
<Compile Include="Datastore\SqliteProvider.cs" />
|
<Compile Include="Datastore\SqliteProvider.cs" />
|
||||||
<Compile Include="Fluent.cs" />
|
<Compile Include="Fluent.cs" />
|
||||||
<Compile Include="Helpers\EpisodeSortingHelper.cs" />
|
<Compile Include="Helpers\EpisodeSortingHelper.cs" />
|
||||||
|
|
|
@ -278,7 +278,7 @@ namespace NzbDrone.Core.Providers.Core
|
||||||
{
|
{
|
||||||
string value;
|
string value;
|
||||||
|
|
||||||
var dbValue = _database.SingleOrDefault<Config>("WHERE Key=@0", key);
|
var dbValue = _database.SingleOrDefault<Config>("WHERE [Key] =@0", key);
|
||||||
|
|
||||||
if (dbValue != null && !String.IsNullOrEmpty(dbValue.Value))
|
if (dbValue != null && !String.IsNullOrEmpty(dbValue.Value))
|
||||||
return dbValue.Value;
|
return dbValue.Value;
|
||||||
|
@ -308,7 +308,7 @@ namespace NzbDrone.Core.Providers.Core
|
||||||
|
|
||||||
Logger.Debug("Writing Setting to file. Key:'{0}' Value:'{1}'", key, value);
|
Logger.Debug("Writing Setting to file. Key:'{0}' Value:'{1}'", key, value);
|
||||||
|
|
||||||
var dbValue = _database.SingleOrDefault<Config>("WHERE KEY=@0", key);
|
var dbValue = _database.SingleOrDefault<Config>("WHERE [KEY]=@0", key);
|
||||||
|
|
||||||
if (dbValue == null)
|
if (dbValue == null)
|
||||||
{
|
{
|
||||||
|
@ -317,7 +317,11 @@ namespace NzbDrone.Core.Providers.Core
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dbValue.Value = value;
|
dbValue.Value = value;
|
||||||
_database.Update(dbValue);
|
using (var tran = _database.GetTransaction())
|
||||||
|
{
|
||||||
|
_database.Update(dbValue);
|
||||||
|
tran.Complete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,9 +113,9 @@ namespace NzbDrone.Core.Providers
|
||||||
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
||||||
{
|
{
|
||||||
var episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.SeasonNumber, episodeNumber);
|
var episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.SeasonNumber, episodeNumber);
|
||||||
if (episodeInfo == null)
|
if (episodeInfo == null && parseResult.AirDate != null)
|
||||||
{
|
{
|
||||||
episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.AirDate);
|
episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.AirDate.Value);
|
||||||
}
|
}
|
||||||
//if still null we should add the temp episode
|
//if still null we should add the temp episode
|
||||||
if (episodeInfo == null && autoAddNew)
|
if (episodeInfo == null && autoAddNew)
|
||||||
|
@ -209,12 +209,16 @@ namespace NzbDrone.Core.Providers
|
||||||
|
|
||||||
episodeToUpdate.SeriesId = series.SeriesId;
|
episodeToUpdate.SeriesId = series.SeriesId;
|
||||||
episodeToUpdate.TvDbEpisodeId = episode.Id;
|
episodeToUpdate.TvDbEpisodeId = episode.Id;
|
||||||
episodeToUpdate.AirDate = episode.FirstAired.Date;
|
|
||||||
episodeToUpdate.EpisodeNumber = episode.EpisodeNumber;
|
episodeToUpdate.EpisodeNumber = episode.EpisodeNumber;
|
||||||
episodeToUpdate.SeasonNumber = episode.SeasonNumber;
|
episodeToUpdate.SeasonNumber = episode.SeasonNumber;
|
||||||
episodeToUpdate.Title = episode.EpisodeName;
|
episodeToUpdate.Title = episode.EpisodeName;
|
||||||
episodeToUpdate.Overview = episode.Overview;
|
episodeToUpdate.Overview = episode.Overview;
|
||||||
|
|
||||||
|
if (episode.FirstAired.Year > 1900)
|
||||||
|
{
|
||||||
|
episodeToUpdate.AirDate = episode.FirstAired.Date;
|
||||||
|
}
|
||||||
|
|
||||||
successCount++;
|
successCount++;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -292,7 +292,7 @@ namespace NzbDrone.Core.Providers.Jobs
|
||||||
TypeName = timer.GetType().ToString(),
|
TypeName = timer.GetType().ToString(),
|
||||||
Name = timerProviderLocal.Name,
|
Name = timerProviderLocal.Name,
|
||||||
Interval = timerProviderLocal.DefaultInterval,
|
Interval = timerProviderLocal.DefaultInterval,
|
||||||
LastExecution = DateTime.MinValue
|
LastExecution = new DateTime(2000, 1, 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
SaveSettings(settings);
|
SaveSettings(settings);
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace NzbDrone.Core.Providers
|
||||||
{
|
{
|
||||||
var allEpisodes = _episodeProvider.GetEpisodeBySeries(seriesId).ToList();
|
var allEpisodes = _episodeProvider.GetEpisodeBySeries(seriesId).ToList();
|
||||||
|
|
||||||
var episodeTotal = allEpisodes.Where(e => !e.Ignored && e.AirDate <= DateTime.Today && e.AirDate.Year > 1900).ToList();
|
var episodeTotal = allEpisodes.Where(e => !e.Ignored && e.AirDate != null && e.AirDate <= DateTime.Today).ToList();
|
||||||
var avilableEpisodes = episodeTotal.Where(e => e.EpisodeFileId > 0).ToList();
|
var avilableEpisodes = episodeTotal.Where(e => e.EpisodeFileId > 0).ToList();
|
||||||
|
|
||||||
return new Tuple<int, int>(avilableEpisodes.Count, episodeTotal.Count);
|
return new Tuple<int, int>(avilableEpisodes.Count, episodeTotal.Count);
|
||||||
|
|
|
@ -49,14 +49,15 @@ namespace NzbDrone.Core.Providers
|
||||||
if (!ignoreSpecials)
|
if (!ignoreSpecials)
|
||||||
seasonNumber = -1;
|
seasonNumber = -1;
|
||||||
|
|
||||||
var series = _database.Fetch<Series, QualityProfile>(@"SELECT Series.*, COUNT (NULLIF(Ignored, 1)) AS EpisodeCount,
|
var series = _database
|
||||||
SUM(CASE WHEN Ignored = 0 AND EpisodeFileId > 0 THEN 1 ELSE 0 END) as EpisodeFileCount,
|
.Fetch<Series, QualityProfile>(@"SELECT Series.*, SUM(CASE WHEN Ignored = 0 THEN 1 ELSE 0 END) AS EpisodeCount,
|
||||||
COUNT (DISTINCT(NULLIF(SeasonNumber, @0))) as SeasonCount,
|
SUM(CASE WHEN Ignored = 0 AND EpisodeFileId > 0 THEN 1 ELSE 0 END) as EpisodeFileCount,
|
||||||
QualityProfiles.*
|
COUNT (DISTINCT(CASE WHEN SeasonNumber = 0 THEN null ELSE SeasonNumber END)) as SeasonCount,
|
||||||
FROM Series
|
QualityProfiles.*
|
||||||
INNER JOIN QualityProfiles ON Series.QualityProfileId = QualityProfiles.QualityProfileId
|
FROM Series
|
||||||
JOIN Episodes ON Series.SeriesId = Episodes.SeriesId
|
INNER JOIN QualityProfiles ON Series.QualityProfileId = QualityProfiles.QualityProfileId
|
||||||
GROUP BY seriesId", seasonNumber);
|
JOIN Episodes ON Series.SeriesId = Episodes.SeriesId
|
||||||
|
GROUP BY seriesId");
|
||||||
|
|
||||||
return series;
|
return series;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace NzbDrone.Core.Repository
|
||||||
public int SeasonNumber { get; set; }
|
public int SeasonNumber { get; set; }
|
||||||
public int EpisodeNumber { get; set; }
|
public int EpisodeNumber { get; set; }
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
public DateTime AirDate { get; set; }
|
public DateTime? AirDate { get; set; }
|
||||||
|
|
||||||
public string Overview { get; set; }
|
public string Overview { get; set; }
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ namespace NzbDrone.Core.Repository
|
||||||
|
|
||||||
if (Ignored) return EpisodeStatusType.Ignored;
|
if (Ignored) return EpisodeStatusType.Ignored;
|
||||||
|
|
||||||
if (AirDate.Date.Year > 1900 && DateTime.Now.Date >= AirDate.Date)
|
if (AirDate != null && AirDate.Value.Date < DateTime.Now)
|
||||||
{
|
{
|
||||||
return EpisodeStatusType.Missing;
|
return EpisodeStatusType.Missing;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
EpisodeTitle = e.Title,
|
EpisodeTitle = e.Title,
|
||||||
Overview = e.Overview,
|
Overview = e.Overview,
|
||||||
SeriesTitle = e.Series.Title,
|
SeriesTitle = e.Series.Title,
|
||||||
AirDate = e.AirDate,
|
AirDate = e.AirDate.Value,
|
||||||
});
|
});
|
||||||
|
|
||||||
return View(new GridModel(missing));
|
return View(new GridModel(missing));
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
|
using MvcMiniProfiler;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Providers.Jobs;
|
using NzbDrone.Core.Providers.Jobs;
|
||||||
using NzbDrone.Core.Repository;
|
using NzbDrone.Core.Repository;
|
||||||
|
@ -119,8 +120,11 @@ namespace NzbDrone.Web.Controllers
|
||||||
[GridAction]
|
[GridAction]
|
||||||
public ActionResult _AjaxSeasonGrid(int seriesId, int seasonNumber)
|
public ActionResult _AjaxSeasonGrid(int seriesId, int seasonNumber)
|
||||||
{
|
{
|
||||||
var episodes = GetEpisodeModels(_episodeProvider.GetEpisodesBySeason(seriesId, seasonNumber));
|
using (MiniProfiler.StepStatic("Controller"))
|
||||||
return View(new GridModel(episodes));
|
{
|
||||||
|
var episodes = GetEpisodeModels(_episodeProvider.GetEpisodesBySeason(seriesId, seasonNumber));
|
||||||
|
return View(new GridModel(episodes));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActionResult SearchForSeries(string seriesName)
|
public ActionResult SearchForSeries(string seriesName)
|
||||||
|
@ -240,7 +244,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
SeasonNumber = e.SeasonNumber,
|
SeasonNumber = e.SeasonNumber,
|
||||||
Title = e.Title,
|
Title = e.Title,
|
||||||
Overview = e.Overview,
|
Overview = e.Overview,
|
||||||
AirDate = e.AirDate,
|
AirDate = e.AirDate.Value,
|
||||||
Path = episodePath,
|
Path = episodePath,
|
||||||
EpisodeFileId = episodeFileId,
|
EpisodeFileId = episodeFileId,
|
||||||
Status = e.Status.ToString(),
|
Status = e.Status.ToString(),
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
EpisodeNumber = u.EpisodeNumber,
|
EpisodeNumber = u.EpisodeNumber,
|
||||||
Title = u.Title,
|
Title = u.Title,
|
||||||
Overview = u.Overview,
|
Overview = u.Overview,
|
||||||
AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
||||||
});
|
});
|
||||||
|
|
||||||
return View(new GridModel(upcoming));
|
return View(new GridModel(upcoming));
|
||||||
|
@ -55,7 +55,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
EpisodeNumber = u.EpisodeNumber,
|
EpisodeNumber = u.EpisodeNumber,
|
||||||
Title = u.Title,
|
Title = u.Title,
|
||||||
Overview = u.Overview,
|
Overview = u.Overview,
|
||||||
AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
||||||
});
|
});
|
||||||
|
|
||||||
return View(new GridModel(upcoming));
|
return View(new GridModel(upcoming));
|
||||||
|
@ -73,7 +73,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
EpisodeNumber = u.EpisodeNumber,
|
EpisodeNumber = u.EpisodeNumber,
|
||||||
Title = u.Title,
|
Title = u.Title,
|
||||||
Overview = u.Overview,
|
Overview = u.Overview,
|
||||||
AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
||||||
});
|
});
|
||||||
|
|
||||||
return View(new GridModel(upcoming));
|
return View(new GridModel(upcoming));
|
||||||
|
@ -91,7 +91,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
EpisodeNumber = u.EpisodeNumber,
|
EpisodeNumber = u.EpisodeNumber,
|
||||||
Title = u.Title,
|
Title = u.Title,
|
||||||
Overview = u.Overview,
|
Overview = u.Overview,
|
||||||
AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay)
|
||||||
});
|
});
|
||||||
|
|
||||||
return View(new GridModel(upcoming));
|
return View(new GridModel(upcoming));
|
||||||
|
|
|
@ -12,6 +12,7 @@ using Ninject.Web.Mvc;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Core;
|
using NzbDrone.Core;
|
||||||
using NzbDrone.Core.Instrumentation;
|
using NzbDrone.Core.Instrumentation;
|
||||||
|
using Telerik.Web.Mvc;
|
||||||
|
|
||||||
namespace NzbDrone.Web
|
namespace NzbDrone.Web
|
||||||
{
|
{
|
||||||
|
@ -36,7 +37,7 @@ namespace NzbDrone.Web
|
||||||
protected override void OnApplicationStarted()
|
protected override void OnApplicationStarted()
|
||||||
{
|
{
|
||||||
base.OnApplicationStarted();
|
base.OnApplicationStarted();
|
||||||
|
WebAssetDefaultSettings.UseTelerikContentDeliveryNetwork = true;
|
||||||
RegisterRoutes(RouteTable.Routes);
|
RegisterRoutes(RouteTable.Routes);
|
||||||
//base.OnApplicationStarted();
|
//base.OnApplicationStarted();
|
||||||
AreaRegistration.RegisterAllAreas();
|
AreaRegistration.RegisterAllAreas();
|
||||||
|
|
|
@ -6,36 +6,7 @@
|
||||||
Series
|
Series
|
||||||
}
|
}
|
||||||
|
|
||||||
<script type="text/javascript" src="../../Scripts/doTimeout.js"></script>
|
|
||||||
<script>
|
|
||||||
(function ($) {
|
|
||||||
$.fn.episodeProgress = function (episodes, totalEpisodes) {
|
|
||||||
return this.each(
|
|
||||||
function () {
|
|
||||||
var div = $(this);
|
|
||||||
var progressBar = div.find(".progress");
|
|
||||||
|
|
||||||
var width = Math.round(episodes / totalEpisodes * 100);
|
|
||||||
|
|
||||||
progressBar.css("width", width + "%");
|
|
||||||
|
|
||||||
if (width > 97) {
|
|
||||||
progressBar.css("-khtml-border-top-right-radius", "7px");
|
|
||||||
progressBar.css("border-top-right-radius", "7px");
|
|
||||||
progressBar.css("-moz-border-top-right-radius", "7px");
|
|
||||||
progressBar.css("-webkit-border-top-right-radius", "7px");
|
|
||||||
|
|
||||||
progressBar.css("-khtml-border-bottom-right-radius", "7px");
|
|
||||||
progressBar.css("border-bottom-right-radius", "7px");
|
|
||||||
progressBar.css("-moz-border-bottom-right-radius", "7px");
|
|
||||||
progressBar.css("-webkit-border-bottom-right-radius", "7px");
|
|
||||||
}
|
|
||||||
|
|
||||||
div.find(".progressText").html(episodes + " / " + totalEpisodes);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
})(jQuery);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* progress bar container */
|
/* progress bar container */
|
||||||
|
@ -191,4 +162,35 @@
|
||||||
|
|
||||||
$("#progressbar_" + seriesId).episodeProgress(episodeFileCount, episodeCount);
|
$("#progressbar_" + seriesId).episodeProgress(episodeFileCount, episodeCount);
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="../../Scripts/doTimeout.js"></script>
|
||||||
|
<script>
|
||||||
|
(function ($) {
|
||||||
|
$.fn.episodeProgress = function (episodes, totalEpisodes) {
|
||||||
|
return this.each(
|
||||||
|
function () {
|
||||||
|
var div = $(this);
|
||||||
|
var progressBar = div.find(".progress");
|
||||||
|
|
||||||
|
var width = Math.round(episodes / totalEpisodes * 100);
|
||||||
|
|
||||||
|
progressBar.css("width", width + "%");
|
||||||
|
|
||||||
|
if (width > 97) {
|
||||||
|
progressBar.css("-khtml-border-top-right-radius", "7px");
|
||||||
|
progressBar.css("border-top-right-radius", "7px");
|
||||||
|
progressBar.css("-moz-border-top-right-radius", "7px");
|
||||||
|
progressBar.css("-webkit-border-top-right-radius", "7px");
|
||||||
|
|
||||||
|
progressBar.css("-khtml-border-bottom-right-radius", "7px");
|
||||||
|
progressBar.css("border-bottom-right-radius", "7px");
|
||||||
|
progressBar.css("-moz-border-bottom-right-radius", "7px");
|
||||||
|
progressBar.css("-webkit-border-bottom-right-radius", "7px");
|
||||||
|
}
|
||||||
|
|
||||||
|
div.find(".progressText").html(episodes + " / " + totalEpisodes);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
})(jQuery);
|
||||||
</script>
|
</script>
|
Loading…
Reference in New Issue