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

1
.gitignore vendored
View File

@ -34,3 +34,4 @@ _ReSharper*/
*.db
*Web.Publish.xml
NzbDrone.Web/NzbDrone.Web.Publish.xml
*.sdf

View File

@ -70,4 +70,75 @@
<Abbreviation Text="SQ" />
</Naming2>
</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>

View File

@ -284,6 +284,46 @@ namespace NzbDrone.Core.Test
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]
public void new_episodes_only_calls_Insert()
{
@ -683,7 +723,7 @@ namespace NzbDrone.Core.Test
.Returns(fakeSeries);
//Act
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate);
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate.Value);
//Assert
episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First());
@ -709,7 +749,7 @@ namespace NzbDrone.Core.Test
.Returns(fakeSeries);
//Act
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate);
var episode = mocker.Resolve<EpisodeProvider>().GetEpisode(1, fakeEpisodes[0].AirDate.Value);
//Assert
episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First());

View File

@ -2,6 +2,7 @@
// ReSharper disable RedundantUsingDirective
using System;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Model;
using NzbDrone.Core.Repository;
@ -107,14 +108,14 @@ namespace NzbDrone.Core.Test
public void low_air_date()
{
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.EpisodeFileId = 0)
.With(e => e.GrabDate = null)
.Build();
Assert.AreEqual(EpisodeStatusType.NotAired, episode.Status);
episode.Status.Should().Be(EpisodeStatusType.NotAired);
}
}
}

View File

@ -13,7 +13,7 @@ namespace NzbDrone.Core.Test
[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)
{
try

View File

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.Framework
if (String.IsNullOrWhiteSpace(fileName))
{
fileName = Guid.NewGuid() + ".db";
fileName = Guid.NewGuid() + ".sdf";
}
var connectionString = Connection.GetConnectionString(fileName);

View File

@ -145,14 +145,13 @@ namespace NzbDrone.Core.Test
var result = mocker.Resolve<HistoryProvider>().GetBestQualityInHistory(history.EpisodeId);
//Assert
Assert.IsNotNull(result);
result.Should().NotBeNull();
result.QualityType.Should().Be(QualityTypes.Bluray720p);
}
[Test]
public void add_item()
{
//Arange
var mocker = new AutoMoqer();
var db = MockLib.GetEmptyDatabase();
@ -181,13 +180,14 @@ namespace NzbDrone.Core.Test
var storedHistory = db.Fetch<History>();
storedHistory.Should().HaveCount(1);
Assert.AreEqual(history.Date, storedHistory.First().Date);
Assert.AreEqual(history.EpisodeId, storedHistory.First().EpisodeId);
Assert.AreEqual(history.SeriesId, storedHistory.First().SeriesId);
Assert.AreEqual(history.NzbTitle, storedHistory.First().NzbTitle);
Assert.AreEqual(history.Indexer, storedHistory.First().Indexer);
Assert.AreEqual(history.Quality, storedHistory.First().Quality);
Assert.AreEqual(history.IsProper, storedHistory.First().IsProper);
history.Date.Should().BeWithin(TimeSpan.FromMinutes(1)).Before(storedHistory.First().Date);
history.EpisodeId.Should().Be(storedHistory.First().EpisodeId);
history.SeriesId.Should().Be(storedHistory.First().SeriesId);
history.NzbTitle.Should().Be(storedHistory.First().NzbTitle);
history.Indexer.Should().Be(storedHistory.First().Indexer);
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 AutoMoq;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Model;
@ -193,7 +194,7 @@ namespace NzbDrone.Core.Test
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
//Assert
Assert.IsTrue(result);
result.Should().BeTrue();
mocker.VerifyAllMocks();
}
@ -219,7 +220,7 @@ namespace NzbDrone.Core.Test
bool result = mocker.Resolve<InventoryProvider>().IsQualityNeeded(parseResultSingle);
//Assert
Assert.IsTrue(result);
result.Should().BeTrue();
mocker.VerifyAllMocks();
}

View File

@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test
var settings = timerProvider.All();
Assert.IsNotEmpty(settings);
Assert.AreNotEqual(DateTime.MinValue, settings[0].LastExecution);
Assert.IsTrue(settings[0].Success);
settings[0].Success.Should().BeTrue();
}
[Test]
@ -75,9 +75,8 @@ namespace NzbDrone.Core.Test
var firstRun = timerProvider.RunScheduled();
var secondRun = timerProvider.RunScheduled();
Assert.IsTrue(firstRun);
Assert.IsTrue(secondRun);
firstRun.Should().BeTrue();
secondRun.Should().BeTrue();
}
[Test]
@ -97,9 +96,8 @@ namespace NzbDrone.Core.Test
Thread.Sleep(2000);
var secondRun = timerProvider.QueueJob(typeof(FakeJob));
Assert.IsTrue(firstRun);
Assert.IsTrue(secondRun);
firstRun.Should().BeTrue();
secondRun.Should().BeTrue();
}
[Test]
@ -142,8 +140,8 @@ namespace NzbDrone.Core.Test
Thread.Sleep(2000);
var secondRun = timerProvider.QueueJob(typeof(BrokenJob));
Assert.IsTrue(firstRun);
Assert.IsTrue(secondRun);
firstRun.Should().BeTrue();
secondRun.Should().BeTrue();
Thread.Sleep(2000);
ExceptionVerification.ExcpectedErrors(2);
}
@ -174,7 +172,7 @@ namespace NzbDrone.Core.Test
thread1.Join();
thread2.Join();
Assert.IsTrue(firstRun);
firstRun.Should().BeTrue();
Assert.IsFalse(secondRun);
}
@ -230,13 +228,11 @@ namespace NzbDrone.Core.Test
//Assert
timers.Should().HaveCount(1);
Assert.AreEqual(fakeTimer.DefaultInterval, timers[0].Interval);
Assert.AreEqual(fakeTimer.Name, timers[0].Name);
Assert.AreEqual(fakeTimer.GetType().ToString(), timers[0].TypeName);
Assert.AreEqual(DateTime.MinValue, timers[0].LastExecution);
Assert.IsTrue(timers[0].Enable);
timers[0].Interval.Should().Be(fakeTimer.DefaultInterval);
timers[0].Name.Should().Be(fakeTimer.Name);
timers[0].TypeName.Should().Be(fakeTimer.GetType().ToString());
timers[0].LastExecution.Should().HaveYear(2000);
timers[0].Enable.Should().BeTrue();
}
[Test]
@ -267,7 +263,7 @@ namespace NzbDrone.Core.Test
//Assert
timers.Should().HaveCount(1);
Assert.IsTrue(timers[0].Enable);
timers[0].Enable.Should().BeTrue();
}
[Test]
@ -364,8 +360,8 @@ namespace NzbDrone.Core.Test
//Assert
var settings = timerProvider.All();
Assert.IsNotEmpty(settings);
Assert.AreEqual(DateTime.MinValue, settings[0].LastExecution);
settings.Should().NotBeEmpty();
settings[0].LastExecution.Should().HaveYear(2000);
}
[Test]

View File

@ -43,7 +43,6 @@ namespace NzbDrone.Core.Test
Assert.AreNotEqual(new DateTime(), logItem.Time);
Assert.AreEqual(message, logItem.Message);
Assert.AreEqual(Logger.Name, logItem.Logger);
Assert.AreEqual(Logger.Name, logItem.Logger);
Assert.AreEqual(LogLevel.Info.Name, logItem.Level);
Assert.AreEqual("write_log", logItem.Method);
}

View File

@ -1,4 +1,5 @@
using NUnit.Framework;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Model;
using NzbDrone.Core.Repository.Quality;
using NzbDrone.Core.Test.Framework;
@ -55,9 +56,9 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.Bluray1080p, true);
var second = new Quality(QualityTypes.Bluray1080p, true);
Assert.IsTrue(first == second);
Assert.IsTrue(first >= second);
Assert.IsTrue(first <= second);
(first == second).Should().BeTrue();
(first >= second).Should().BeTrue();
(first <= second).Should().BeTrue();
}
[Test]
@ -66,7 +67,7 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.Bluray1080p, true);
var second = new Quality(QualityTypes.Unknown, true);
Assert.IsFalse(first == second);
(first == second).Should().BeFalse();
}
[Test]
@ -75,7 +76,7 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.Bluray1080p, true);
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 second = new Quality(QualityTypes.Unknown, true);
Assert.IsTrue(first != second);
(first != second).Should().BeTrue();
}
[Test]
@ -103,7 +104,7 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.Bluray1080p, true);
var second = new Quality(QualityTypes.Bluray1080p, false);
Assert.IsTrue(first != second);
(first != second).Should().BeTrue();
}
[Test]
@ -112,8 +113,8 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.DVD, true);
var second = new Quality(QualityTypes.Bluray1080p, true);
Assert.IsTrue(first < second);
Assert.IsTrue(first <= second);
(first < second).Should().BeTrue();
(first <= second).Should().BeTrue();
}
[Test]
@ -122,8 +123,8 @@ namespace NzbDrone.Core.Test
var first = new Quality(QualityTypes.DVD, true);
var second = new Quality(QualityTypes.Bluray1080p, true);
Assert.IsTrue(second > first);
Assert.IsTrue(second >= first);
(second > first).Should().BeTrue();
(second >= first).Should().BeTrue();
}
}

View File

@ -54,10 +54,9 @@ namespace NzbDrone.Core.Test
//Assert
var rootDirs = rootDirProvider.GetAll();
Assert.IsNotEmpty(rootDirs);
rootDirs.Should().NotBeEmpty();
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
var rootDirs = rootDirProvider.GetAll();
Assert.IsNotEmpty(rootDirs);
rootDirs.Should().HaveCount(1);
Assert.AreEqual(newPath, rootDirs.First().Path);
newPath.Should().Be(rootDirs.First().Path);
}
[Test]
@ -115,8 +113,8 @@ namespace NzbDrone.Core.Test
//Assert
var rootDir = rootDirProvider.GetRootDir(id);
Assert.AreEqual(1, rootDir.Id);
Assert.AreEqual(path, rootDir.Path);
rootDir.Id.Should().Be(1);
rootDir.Path.Should().Be(path);
}
[Test]
@ -130,8 +128,8 @@ namespace NzbDrone.Core.Test
var result = mocker.Resolve<RootDirProvider>().GetUnmappedFolders(path);
Assert.IsNotNull(result);
Assert.IsEmpty(result);
result.Should().NotBeNull();
result.Should().BeEmpty();
mocker.VerifyAllMocks();
}

View File

@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using AutoMoq;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
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");
//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");
//Assert
Assert.IsTrue(result);
result.Should().BeTrue();
}
[Test]
@ -187,7 +188,7 @@ namespace NzbDrone.Core.Test
bool result = mocker.Resolve<SabProvider>().IsInQueue("Ubuntu Test");
//Assert
Assert.IsTrue(result);
result.Should().BeTrue();
}
[Test]
@ -332,7 +333,7 @@ namespace NzbDrone.Core.Test
"http://www.newzbin.com/browse/post/6107863/nzb", "Added by unit tests.");
//Assert
Assert.IsTrue(result);
result.Should().BeTrue();
}
}
}

View File

@ -202,7 +202,7 @@ namespace NzbDrone.Core.Test
//Act, Assert
var provider = mocker.Resolve<SeriesProvider>();
Assert.IsTrue(provider.IsMonitored(12));
provider.IsMonitored(12).Should().BeTrue();
Assert.IsFalse(provider.IsMonitored(11));
Assert.IsFalse(provider.IsMonitored(1));
}

View File

@ -2,6 +2,7 @@
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Data.SqlServerCe;
using System.IO;
using MvcMiniProfiler.Data;
using PetaPoco;
@ -21,14 +22,15 @@ namespace NzbDrone.Core.Datastore
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
{
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
{
return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.db"));
return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.sdf"));
}
}
@ -44,7 +46,7 @@ namespace NzbDrone.Core.Datastore
public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true)
{
MigrationsHelper.Run(connectionString, true);
var sqliteConnection = new SQLiteConnection(connectionString);
var sqliteConnection = new SqlCeConnection(connectionString);
DbConnection connection = sqliteConnection;
if (profiled)

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
{
[Migration(20110604)]
public class Migration20110616 : Migration
[Migration(20110622)]
public class Migration20110622 : Migration
{
public override void Up()
{
@ -17,12 +17,12 @@ namespace NzbDrone.Core.Datastore.Migrations
new Column("CleanTitle", DbType.String, ColumnProperty.Null),
new Column("Status", 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("Language", DbType.String, ColumnProperty.Null),
new Column("Path", DbType.String, 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("LastInfoSync", 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("TvDbEpisodeId", DbType.Int32, ColumnProperty.Null),
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull),
new Column("EpisodeNumber", DbType.Int16, ColumnProperty.NotNull),
new Column("SeasonNumber", DbType.Int32, ColumnProperty.NotNull),
new Column("EpisodeNumber", DbType.Int32, ColumnProperty.NotNull),
new Column("Title", DbType.String, ColumnProperty.Null),
new Column("Overview", DbType.String, ColumnProperty.Null),
new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull),
@ -50,11 +50,11 @@ namespace NzbDrone.Core.Datastore.Migrations
ColumnProperty.PrimaryKeyWithIdentity),
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
new Column("Path", DbType.String, ColumnProperty.NotNull),
new Column("Quality", DbType.Int16, ColumnProperty.NotNull),
new Column("Proper", DbType.Int16, ColumnProperty.NotNull),
new Column("Quality", DbType.Int32, ColumnProperty.NotNull),
new Column("Proper", DbType.Int32, ColumnProperty.NotNull),
new Column("Size", DbType.Int64, 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[]
{
new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKey),
new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity),
new Column("EpisodeId", DbType.Int32, ColumnProperty.NotNull),
new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull),
new Column("NzbTitle", DbType.String, 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("Indexer", DbType.String, ColumnProperty.NotNull)
});
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)
});
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("NotifierName", DbType.String, ColumnProperty.NotNull),
new Column("Name", DbType.String, ColumnProperty.NotNull)
@ -99,7 +99,7 @@ namespace NzbDrone.Core.Datastore.Migrations
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("TypeName", DbType.String, ColumnProperty.NotNull),
new Column("Name", DbType.String, ColumnProperty.NotNull),
@ -110,7 +110,7 @@ namespace NzbDrone.Core.Datastore.Migrations
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("Cutoff", DbType.Int32, ColumnProperty.NotNull),
new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull),
@ -118,7 +118,7 @@ namespace NzbDrone.Core.Datastore.Migrations
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("Time", DbType.DateTime, ColumnProperty.NotNull),
new Column("Logger", DbType.String, ColumnProperty.NotNull),
@ -130,7 +130,7 @@ namespace NzbDrone.Core.Datastore.Migrations
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("IndexProviderType", DbType.String, ColumnProperty.NotNull),
new Column("Name", DbType.String, ColumnProperty.NotNull),

View File

@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data.SqlServerCe;
using System.IO;
using System.Reflection;
using NLog;
@ -16,6 +18,8 @@ namespace NzbDrone.Core.Datastore
if (_migrated.ContainsKey(connetionString)) return;
_migrated.Add(connetionString, string.Empty);
EnsureDatabase(connetionString);
Logger.Info("Preparing run database migration");
try
@ -23,11 +27,11 @@ namespace NzbDrone.Core.Datastore
Migrator.Migrator migrator;
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
{
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.RegularExpressions;
using System.Threading;
using MvcMiniProfiler;
namespace PetaPoco
{
@ -316,7 +317,7 @@ namespace PetaPoco
Oracle,
SQLite
}
DBType _dbType = DBType.SQLite;
DBType _dbType = DBType.SqlServerCE;
// Common initialization
private void CommonConstruct()
@ -644,6 +645,8 @@ namespace PetaPoco
}
public int Execute(Sql sql)
{
using (MiniProfiler.StepStatic("Peta Execute SQL"))
{
try
{
@ -668,6 +671,7 @@ namespace PetaPoco
throw;
}
}
}
// Execute and cast a scalar property
public T ExecuteScalar<T>(string sql, params object[] args)
@ -676,6 +680,8 @@ namespace PetaPoco
}
public T ExecuteScalar<T>(Sql sql)
{
using (MiniProfiler.StepStatic("Peta ExecuteScalar<T>"))
{
try
{
@ -700,6 +706,7 @@ namespace PetaPoco
throw;
}
}
}
Regex rxSelect = new Regex(@"\A\s*(SELECT|EXECUTE|CALL)\s", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline);
Regex rxFrom = new Regex(@"\A\s*FROM\s", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline);
@ -886,6 +893,8 @@ namespace PetaPoco
}
public IEnumerable<T> Query<T>(Sql sql)
{
using (MiniProfiler.StepStatic("Peta Query SQL"))
{
OpenSharedConnection();
try
@ -907,7 +916,9 @@ namespace PetaPoco
using (r)
{
var factory = pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r) as Func<IDataReader, T>;
var factory =
pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r)
as Func<IDataReader, T>;
while (true)
{
T poco;
@ -933,6 +944,7 @@ namespace PetaPoco
CloseSharedConnection();
}
}
}
// Multi Fetch
public List<TRet> Fetch<T1, T2, TRet>(Func<T1, T2, TRet> cb, string sql, params object[] args) { return Query<T1, T2, TRet>(cb, sql, args).ToList(); }
@ -1180,6 +1192,8 @@ namespace PetaPoco
// Actual implementation of the multi-poco query
public IEnumerable<TRet> Query<TRet>(Type[] types, object cb, string sql, params object[] args)
{
using (MiniProfiler.StepStatic("Peta Query Type[]"))
{
OpenSharedConnection();
try
@ -1239,6 +1253,7 @@ namespace PetaPoco
CloseSharedConnection();
}
}
}
public bool Exists<T>(object primaryKey)
{
@ -1354,6 +1369,8 @@ namespace PetaPoco
// as the primary key the id of the new record is assigned to it. Either way,
// the new id is returned.
public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco)
{
using (MiniProfiler.StepStatic("Peta Insert " + tableName))
{
try
{
@ -1522,6 +1539,7 @@ namespace PetaPoco
throw;
}
}
}
// Insert an annotated poco object
public object Insert(object poco)
@ -1545,6 +1563,8 @@ namespace PetaPoco
// 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)
{
using (MiniProfiler.StepStatic("Peta Update " + tableName))
{
try
{
@ -1593,7 +1613,8 @@ namespace PetaPoco
}
cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2}",
EscapeSqlIdentifier(tableName), sb.ToString(), BuildPrimaryKeySql(primaryKeyValuePairs, ref index));
EscapeSqlIdentifier(tableName), sb.ToString(),
BuildPrimaryKeySql(primaryKeyValuePairs, ref index));
foreach (var keyValue in primaryKeyValuePairs)
{
@ -1602,7 +1623,8 @@ namespace PetaPoco
if (!string.IsNullOrEmpty(versionName))
{
cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix, index++);
cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix,
index++);
AddParam(cmd, versionValue, _paramPrefix);
}
@ -1618,7 +1640,9 @@ namespace PetaPoco
PocoColumn pc;
if (pd.Columns.TryGetValue(versionName, out pc))
{
pc.PropertyInfo.SetValue(poco, Convert.ChangeType(Convert.ToInt64(versionValue) + 1, pc.PropertyInfo.PropertyType), null);
pc.PropertyInfo.SetValue(poco,
Convert.ChangeType(Convert.ToInt64(versionValue) + 1,
pc.PropertyInfo.PropertyType), null);
}
}
@ -1636,6 +1660,7 @@ namespace PetaPoco
throw;
}
}
}
private string BuildPrimaryKeySql(Dictionary<string, object> primaryKeyValuePair, ref int index)
{

View File

@ -1,10 +1,12 @@
using System;
using NLog;
using NLog.Targets;
using NLog.Targets.Wrappers;
using PetaPoco;
namespace NzbDrone.Core.Instrumentation
{
public class SubsonicTarget : Target
{
private readonly IDatabase _database;
@ -14,6 +16,8 @@ namespace NzbDrone.Core.Instrumentation
_database = database;
}
protected override void Write(LogEventInfo logEvent)
{
var log = new Log();

View File

@ -14,7 +14,7 @@ namespace NzbDrone.Core.Model
internal List<int> EpisodeNumbers { get; set; }
internal DateTime AirDate { get; set; }
internal DateTime? AirDate { get; set; }
public Quality Quality { get; set; }
@ -30,12 +30,15 @@ namespace NzbDrone.Core.Model
public override string ToString()
{
if (EpisodeNumbers == null)
return string.Format("{0} - {1} {2}", CleanTitle, AirDate.ToShortDateString(), Quality);
if (AirDate != null && EpisodeNumbers == null)
return string.Format("{0} - {1} {2}", CleanTitle, AirDate.Value.ToShortDateString(), Quality);
if (EpisodeNumbers != null)
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>
<HintPath>..\Libraries\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
@ -176,8 +177,7 @@
<Compile Include="Datastore\MigrationLogger.cs" />
<Compile Include="Datastore\MigrationsHelper.cs" />
<Compile Include="Datastore\CustomeMapper.cs" />
<Compile Include="Datastore\Migrations\Migration20110619.cs" />
<Compile Include="Datastore\Migrations\Migration20110616.cs" />
<Compile Include="Datastore\Migrations\Migration20110622.cs" />
<Compile Include="Datastore\SqliteProvider.cs" />
<Compile Include="Fluent.cs" />
<Compile Include="Helpers\EpisodeSortingHelper.cs" />

View File

@ -278,7 +278,7 @@ namespace NzbDrone.Core.Providers.Core
{
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))
return dbValue.Value;
@ -308,7 +308,7 @@ namespace NzbDrone.Core.Providers.Core
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)
{
@ -317,7 +317,11 @@ namespace NzbDrone.Core.Providers.Core
else
{
dbValue.Value = value;
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)
{
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 (episodeInfo == null && autoAddNew)
@ -209,12 +209,16 @@ namespace NzbDrone.Core.Providers
episodeToUpdate.SeriesId = series.SeriesId;
episodeToUpdate.TvDbEpisodeId = episode.Id;
episodeToUpdate.AirDate = episode.FirstAired.Date;
episodeToUpdate.EpisodeNumber = episode.EpisodeNumber;
episodeToUpdate.SeasonNumber = episode.SeasonNumber;
episodeToUpdate.Title = episode.EpisodeName;
episodeToUpdate.Overview = episode.Overview;
if (episode.FirstAired.Year > 1900)
{
episodeToUpdate.AirDate = episode.FirstAired.Date;
}
successCount++;
}
catch (Exception e)

View File

@ -292,7 +292,7 @@ namespace NzbDrone.Core.Providers.Jobs
TypeName = timer.GetType().ToString(),
Name = timerProviderLocal.Name,
Interval = timerProviderLocal.DefaultInterval,
LastExecution = DateTime.MinValue
LastExecution = new DateTime(2000, 1, 1)
};
SaveSettings(settings);

View File

@ -72,7 +72,7 @@ namespace NzbDrone.Core.Providers
{
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();
return new Tuple<int, int>(avilableEpisodes.Count, episodeTotal.Count);

View File

@ -49,14 +49,15 @@ namespace NzbDrone.Core.Providers
if (!ignoreSpecials)
seasonNumber = -1;
var series = _database.Fetch<Series, QualityProfile>(@"SELECT Series.*, COUNT (NULLIF(Ignored, 1)) AS EpisodeCount,
var series = _database
.Fetch<Series, QualityProfile>(@"SELECT Series.*, SUM(CASE WHEN Ignored = 0 THEN 1 ELSE 0 END) AS EpisodeCount,
SUM(CASE WHEN Ignored = 0 AND EpisodeFileId > 0 THEN 1 ELSE 0 END) as EpisodeFileCount,
COUNT (DISTINCT(NULLIF(SeasonNumber, @0))) as SeasonCount,
COUNT (DISTINCT(CASE WHEN SeasonNumber = 0 THEN null ELSE SeasonNumber END)) as SeasonCount,
QualityProfiles.*
FROM Series
INNER JOIN QualityProfiles ON Series.QualityProfileId = QualityProfiles.QualityProfileId
JOIN Episodes ON Series.SeriesId = Episodes.SeriesId
GROUP BY seriesId", seasonNumber);
GROUP BY seriesId");
return series;
}

View File

@ -17,7 +17,7 @@ namespace NzbDrone.Core.Repository
public int SeasonNumber { get; set; }
public int EpisodeNumber { get; set; }
public string Title { get; set; }
public DateTime AirDate { get; set; }
public DateTime? AirDate { get; set; }
public string Overview { get; set; }
@ -47,7 +47,7 @@ namespace NzbDrone.Core.Repository
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;
}

View File

@ -37,7 +37,7 @@ namespace NzbDrone.Web.Controllers
EpisodeTitle = e.Title,
Overview = e.Overview,
SeriesTitle = e.Series.Title,
AirDate = e.AirDate,
AirDate = e.AirDate.Value,
});
return View(new GridModel(missing));

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using MvcMiniProfiler;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Jobs;
using NzbDrone.Core.Repository;
@ -118,10 +119,13 @@ namespace NzbDrone.Web.Controllers
[GridAction]
public ActionResult _AjaxSeasonGrid(int seriesId, int seasonNumber)
{
using (MiniProfiler.StepStatic("Controller"))
{
var episodes = GetEpisodeModels(_episodeProvider.GetEpisodesBySeason(seriesId, seasonNumber));
return View(new GridModel(episodes));
}
}
public ActionResult SearchForSeries(string seriesName)
{
@ -240,7 +244,7 @@ namespace NzbDrone.Web.Controllers
SeasonNumber = e.SeasonNumber,
Title = e.Title,
Overview = e.Overview,
AirDate = e.AirDate,
AirDate = e.AirDate.Value,
Path = episodePath,
EpisodeFileId = episodeFileId,
Status = e.Status.ToString(),

View File

@ -37,7 +37,7 @@ namespace NzbDrone.Web.Controllers
EpisodeNumber = u.EpisodeNumber,
Title = u.Title,
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));
@ -55,7 +55,7 @@ namespace NzbDrone.Web.Controllers
EpisodeNumber = u.EpisodeNumber,
Title = u.Title,
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));
@ -73,7 +73,7 @@ namespace NzbDrone.Web.Controllers
EpisodeNumber = u.EpisodeNumber,
Title = u.Title,
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));
@ -91,7 +91,7 @@ namespace NzbDrone.Web.Controllers
EpisodeNumber = u.EpisodeNumber,
Title = u.Title,
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));

View File

@ -12,6 +12,7 @@ using Ninject.Web.Mvc;
using NLog;
using NzbDrone.Core;
using NzbDrone.Core.Instrumentation;
using Telerik.Web.Mvc;
namespace NzbDrone.Web
{
@ -36,7 +37,7 @@ namespace NzbDrone.Web
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
WebAssetDefaultSettings.UseTelerikContentDeliveryNetwork = true;
RegisterRoutes(RouteTable.Routes);
//base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();

View File

@ -6,36 +6,7 @@
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>
/* progress bar container */
@ -192,3 +163,34 @@
$("#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>