From f4801901a7f2505ec1151412d5e2fa2d16b4fc3b Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Fri, 17 Jun 2011 17:11:12 -0700 Subject: [PATCH] LogProvider now usues petapoco --- NzbDrone.Core.Test/LogProviderTest.cs | 154 ++++++++++++++++++ NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 1 + NzbDrone.Core.Test/RepoTest.cs | 99 ----------- NzbDrone.Core/CentralDispatch.cs | 5 +- .../Datastore/Migrations/Migration.cs | 94 ++++++----- NzbDrone.Core/Instrumentation/Log.cs | 11 +- NzbDrone.Core/Instrumentation/LogProvider.cs | 18 +- .../Instrumentation/SubsonicTarget.cs | 9 +- 8 files changed, 234 insertions(+), 157 deletions(-) create mode 100644 NzbDrone.Core.Test/LogProviderTest.cs diff --git a/NzbDrone.Core.Test/LogProviderTest.cs b/NzbDrone.Core.Test/LogProviderTest.cs new file mode 100644 index 000000000..f1066e91e --- /dev/null +++ b/NzbDrone.Core.Test/LogProviderTest.cs @@ -0,0 +1,154 @@ +// ReSharper disable RedundantUsingDirective +using System; +using System.Linq; +using FizzWare.NBuilder; +using FluentAssertions; +using NLog; +using NLog.Config; +using NUnit.Framework; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Instrumentation; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Test.Framework; + + +namespace NzbDrone.Core.Test +{ + [TestFixture] + // ReSharper disable InconsistentNaming + public class LogProviderTest : TestBase + { + + + [Test] + public void write_log() + { + //setup + var message = Guid.NewGuid().ToString(); + + var db = MockLib.GetEmptyDatabase(true); + + var sonicTarget = new SubsonicTarget(db); + + LogManager.Configuration.AddTarget("DbLogger", sonicTarget); + LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); + LogManager.Configuration.Reload(); + + Logger Logger = LogManager.GetCurrentClassLogger(); + //Act + + Logger.Info(message); + + //Assert + db.Fetch().Should().HaveCount(1); + + var logItem = db.Fetch().First(); + 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); + } + + + [Test] + public void clearLog() + { + //setup + var db = MockLib.GetEmptyDatabase(true); + + var sonicTarget = new SubsonicTarget(db); + + LogManager.Configuration.AddTarget("DbLogger", sonicTarget); + LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); + LogManager.Configuration.Reload(); + + Logger Logger = LogManager.GetCurrentClassLogger(); + //Act + + for (int i = 0; i < 10; i++) + { + Logger.Info("Test"); + } + + + + //Assert + var provider = new LogProvider(db); + provider.GetAllLogs().Should().HaveCount(10); + provider.DeleteAll(); + provider.GetAllLogs().Should().HaveCount(1); + } + + + + [Test] + public void write_log_exception() + { + //setup + var message = Guid.NewGuid().ToString(); + + var db = MockLib.GetEmptyDatabase(true); + + var sonicTarget = new SubsonicTarget(db); + + LogManager.Configuration.AddTarget("DbLogger", sonicTarget); + LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); + LogManager.Configuration.Reload(); + + Logger Logger = LogManager.GetCurrentClassLogger(); + + var ex = new InvalidOperationException("Fake Exception"); + //Act + + Logger.ErrorException(message, ex); + + //Assert + db.Fetch().Should().HaveCount(1); + + var logItem = db.Fetch().First(); + Assert.AreNotEqual(new DateTime(), logItem.Time); + Assert.AreEqual(message + ": " + ex.Message, logItem.Message); + Assert.AreEqual(Logger.Name, logItem.Logger); + Assert.AreEqual(LogLevel.Error.Name, logItem.Level); + Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType); + Assert.AreEqual(ex.ToString(), logItem.Exception); + ExceptionVerification.ExcpectedErrors(1); + } + + [Test] + public void write_log_exception_no_message_should_use_exception_message() + { + //setup + var message = String.Empty; + + var db = MockLib.GetEmptyDatabase(true); + + var sonicTarget = new SubsonicTarget(db); + + LogManager.Configuration.AddTarget("DbLogger", sonicTarget); + LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); + LogManager.Configuration.Reload(); + + Logger Logger = LogManager.GetCurrentClassLogger(); + + var ex = new InvalidOperationException("Fake Exception"); + //Act + + Logger.ErrorException(message, ex); + + //Assert + db.Fetch().Should().HaveCount(1); + + var logItem = db.Fetch().First(); + Assert.AreNotEqual(new DateTime(), logItem.Time); + Assert.AreEqual(ex.Message, logItem.Message); + Assert.AreEqual(Logger.Name, logItem.Logger); + Assert.AreEqual(LogLevel.Error.Name, logItem.Level); + Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType); + Assert.AreEqual(ex.ToString(), logItem.Exception); + ExceptionVerification.ExcpectedErrors(1); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 5da8f2dc0..a4b6667a5 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -91,6 +91,7 @@ + diff --git a/NzbDrone.Core.Test/RepoTest.cs b/NzbDrone.Core.Test/RepoTest.cs index c206d4136..81031f6d1 100644 --- a/NzbDrone.Core.Test/RepoTest.cs +++ b/NzbDrone.Core.Test/RepoTest.cs @@ -105,104 +105,5 @@ namespace NzbDrone.Core.Test Console.WriteLine(new Series().ToString()); Console.WriteLine(new EpisodeFile().ToString()); } - - [Test] - public void write_log() - { - //setup - var message = Guid.NewGuid().ToString(); - - var sonicRepo = MockLib.GetEmptyRepository(true); - - var sonicTarget = new SubsonicTarget(sonicRepo); - - LogManager.Configuration.AddTarget("DbLogger", sonicTarget); - LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); - LogManager.Configuration.Reload(); - - Logger Logger = LogManager.GetCurrentClassLogger(); - //Act - - Logger.Info(message); - - //Assert - sonicRepo.All().Should().HaveCount(1); - - var logItem = sonicRepo.All().First(); - 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); - - - } - - [Test] - public void write_log_exception() - { - //setup - var message = Guid.NewGuid().ToString(); - - var sonicRepo = MockLib.GetEmptyRepository(true); - - var sonicTarget = new SubsonicTarget(sonicRepo); - LogManager.Configuration.AddTarget("DbLogger", sonicTarget); - LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); - LogManager.Configuration.Reload(); - - Logger Logger = LogManager.GetCurrentClassLogger(); - - var ex = new InvalidOperationException("Fake Exception"); - //Act - - Logger.ErrorException(message, ex); - - //Assert - sonicRepo.All().Should().HaveCount(1); - - var logItem = sonicRepo.All().First(); - Assert.AreNotEqual(new DateTime(), logItem.Time); - Assert.AreEqual(message + ": " + ex.Message, logItem.Message); - Assert.AreEqual(Logger.Name, logItem.Logger); - Assert.AreEqual(LogLevel.Error.Name, logItem.Level); - Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType); - Assert.AreEqual(ex.ToString(), logItem.Exception); - ExceptionVerification.ExcpectedErrors(1); - } - - [Test] - public void write_log_exception_no_message_should_use_exception_message() - { - //setup - var message = String.Empty; - - var sonicRepo = MockLib.GetEmptyRepository(true); - - var sonicTarget = new SubsonicTarget(sonicRepo); - LogManager.Configuration.AddTarget("DbLogger", sonicTarget); - LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, sonicTarget)); - LogManager.Configuration.Reload(); - - Logger Logger = LogManager.GetCurrentClassLogger(); - - var ex = new InvalidOperationException("Fake Exception"); - //Act - - Logger.ErrorException(message, ex); - - //Assert - sonicRepo.All().Should().HaveCount(1); - - var logItem = sonicRepo.All().First(); - Assert.AreNotEqual(new DateTime(), logItem.Time); - Assert.AreEqual(ex.Message, logItem.Message); - Assert.AreEqual(Logger.Name, logItem.Logger); - Assert.AreEqual(LogLevel.Error.Name, logItem.Level); - Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType); - Assert.AreEqual(ex.ToString(), logItem.Exception); - ExceptionVerification.ExcpectedErrors(1); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 8a90b16fa..e3cc1d12c 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -69,9 +69,10 @@ namespace NzbDrone.Core _kernel = new StandardKernel(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString)).InRequestScope(); + _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); + _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InRequestScope(); + _kernel.Bind().ToConstant(Connection.CreateSimpleRepository(Connection.MainConnectionString)).InSingletonScope(); - _kernel.Bind().ToConstant(Connection.CreateSimpleRepository(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); - _kernel.Bind().ToConstant(Connection.CreateSimpleRepository(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); } } diff --git a/NzbDrone.Core/Datastore/Migrations/Migration.cs b/NzbDrone.Core/Datastore/Migrations/Migration.cs index a09611225..0b4f50087 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration.cs @@ -41,12 +41,12 @@ namespace NzbDrone.Core.Datastore.Migrations { new Column("SeriesId", DbType.Int32, ColumnProperty.PrimaryKey), new Column("Title", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("CleanTitle", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("CleanTitle", DbType.String, ColumnProperty.NotNull, String.Empty), new Column("Status", DbType.String, ColumnProperty.Null), - new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), new Column("AirsDayOfWeek", DbType.Int16, ColumnProperty.Null), - new Column("AirTimes", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("Language", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("AirTimes", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Language", DbType.String, ColumnProperty.NotNull, String.Empty), new Column("Path", DbType.String, ColumnProperty.NotNull), new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull), new Column("QualityProfileId", DbType.Int16, ColumnProperty.NotNull), @@ -92,51 +92,67 @@ namespace NzbDrone.Core.Datastore.Migrations }); Database.AddTable("History", "SQLite", new[] - { - new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKey), - 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("IsProper", DbType.Boolean, ColumnProperty.NotNull), - new Column("Indexer", DbType.String, ColumnProperty.NotNull) - }); + { + new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKey), + 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("IsProper", DbType.Boolean, ColumnProperty.NotNull), + new Column("Indexer", DbType.String, ColumnProperty.NotNull) + }); Database.AddTable("RootDirs", "SQLite", new[] - { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("Path", DbType.String, ColumnProperty.NotNull) - }); + { + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Path", DbType.String, ColumnProperty.NotNull) + }); Database.AddTable("ExternalNotificationSettings", "SQLite", new[] - { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("Enabled", DbType.Boolean, ColumnProperty.NotNull), - new Column("NotifierName", DbType.String, ColumnProperty.NotNull), - new Column("Name", DbType.String, ColumnProperty.NotNull) - }); + { + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Enabled", DbType.Boolean, ColumnProperty.NotNull) + , + new Column("NotifierName", DbType.String, + ColumnProperty.NotNull), + new Column("Name", DbType.String, ColumnProperty.NotNull) + }); Database.AddTable("JobSettings", "SQLite", new[] - { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), - new Column("TypeName", DbType.String, ColumnProperty.NotNull), - new Column("Name", DbType.String, ColumnProperty.NotNull), - new Column("Interval", DbType.Int32, ColumnProperty.NotNull), - new Column("LastExecution", DbType.DateTime, ColumnProperty.NotNull), - new Column("Success", DbType.Boolean, ColumnProperty.NotNull) - }); + { + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), + new Column("TypeName", DbType.String, ColumnProperty.NotNull), + new Column("Name", DbType.String, ColumnProperty.NotNull), + new Column("Interval", DbType.Int32, ColumnProperty.NotNull), + new Column("LastExecution", DbType.DateTime, ColumnProperty.NotNull), + new Column("Success", DbType.Boolean, ColumnProperty.NotNull) + }); Database.AddTable("QualityProfiles", "SQLite", new[] - { - new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("Name", DbType.String, ColumnProperty.NotNull), - new Column("Cutoff", DbType.Int32, ColumnProperty.NotNull), - new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull), - }); + { + new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Name", DbType.String, ColumnProperty.NotNull), + new Column("Cutoff", DbType.Int32, ColumnProperty.NotNull), + new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull), + }); + + Database.AddTable("Logs", "SQLite", new[] + { + new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKey), + new Column("Message", DbType.String, ColumnProperty.NotNull), + new Column("Time", DbType.DateTime, ColumnProperty.NotNull), + new Column("Logger", DbType.String, ColumnProperty.NotNull), + new Column("Method", DbType.String, ColumnProperty.NotNull), + new Column("Exception", DbType.String, ColumnProperty.Null), + new Column("ExceptionType", DbType.String, ColumnProperty.Null), + new Column("Level", DbType.String, ColumnProperty.NotNull) + }); } + + public override void Down() { throw new NotImplementedException(); diff --git a/NzbDrone.Core/Instrumentation/Log.cs b/NzbDrone.Core/Instrumentation/Log.cs index 70cad22ee..c4dfc4b5b 100644 --- a/NzbDrone.Core/Instrumentation/Log.cs +++ b/NzbDrone.Core/Instrumentation/Log.cs @@ -1,14 +1,16 @@ using System; +using PetaPoco; using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Instrumentation { + [TableName("Logs")] + [PrimaryKey("LogId", autoIncrement = true)] public class Log { - [SubSonicPrimaryKey] - public int LogId { get; protected set; } - [SubSonicLongString] + public Int64 LogId { get; protected set; } + public string Message { get; set; } public DateTime Time { get; set; } @@ -17,11 +19,8 @@ namespace NzbDrone.Core.Instrumentation public string Method { get; set; } - [SubSonicNullString] - [SubSonicLongString] public string Exception { get; set; } - [SubSonicNullString] public string ExceptionType { get; set; } public String Level { get; set; } diff --git a/NzbDrone.Core/Instrumentation/LogProvider.cs b/NzbDrone.Core/Instrumentation/LogProvider.cs index 931ed5084..1985c2aa5 100644 --- a/NzbDrone.Core/Instrumentation/LogProvider.cs +++ b/NzbDrone.Core/Instrumentation/LogProvider.cs @@ -1,27 +1,31 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using NLog; +using PetaPoco; using SubSonic.Repository; namespace NzbDrone.Core.Instrumentation { public class LogProvider { + private readonly IDatabase _database; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly IRepository _repository; - public LogProvider(IRepository repository) + + + public LogProvider(IDatabase database) { - _repository = repository; + _database = database; } - public IQueryable GetAllLogs() + public IList GetAllLogs() { - return _repository.All(); + return _database.Fetch(); } public void DeleteAll() { - _repository.DeleteMany(GetAllLogs()); + _database.Delete(""); Logger.Info("Cleared Log History"); } } diff --git a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs index ba53d985b..713878feb 100644 --- a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs +++ b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs @@ -1,17 +1,18 @@ using System; using NLog; using NLog.Targets; +using PetaPoco; using SubSonic.Repository; namespace NzbDrone.Core.Instrumentation { public class SubsonicTarget : Target { - private readonly IRepository _repository; + private readonly IDatabase _database; - public SubsonicTarget(IRepository repository) + public SubsonicTarget(IDatabase database) { - _repository = repository; + _database = database; } protected override void Write(LogEventInfo logEvent) @@ -47,7 +48,7 @@ namespace NzbDrone.Core.Instrumentation log.Level = logEvent.Level.Name; - _repository.Add(log); + _database.Insert(log); } } } \ No newline at end of file