Switched to SQLCE 4.0

This commit is contained in:
kay.one 2011-06-22 23:56:17 -07:00
parent 5b2111ff11
commit 69239bc371
33 changed files with 646 additions and 497 deletions

3
.gitignore vendored
View File

@ -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

View File

@ -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>

View File

@ -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
} }
} }
} }

View File

@ -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);
} }
} }
} }

View File

@ -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

View File

@ -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);

View File

@ -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);
} }
} }
} }

View File

@ -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();
} }

View File

@ -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]

View File

@ -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);

View File

@ -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();
} }
} }

View File

@ -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();
} }

View File

@ -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();
} }
} }
} }

View File

@ -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));
} }

View File

@ -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);

View File

@ -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();
}
}
}

View File

@ -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),

View File

@ -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();
}
}
} }
} }

View File

@ -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)

View File

@ -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();

View File

@ -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;
} }
} }

View File

@ -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" />

View File

@ -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();
}
} }
} }
} }

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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));

View File

@ -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(),

View File

@ -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));

View File

@ -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();

View File

@ -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>