From 6ac2db9497b7b08a581a2560089d08ec51558fb7 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 12 Dec 2012 00:17:59 +0500 Subject: [PATCH] removed database factory, changed audit trail stuff to internal, not sure it needs to be public. --- .../Auditing/DataAuditWriteProvider.cs | 2 +- .../Auditing/IAuditWriteProvider.cs | 2 +- src/Umbraco.Core/DatabaseContext.cs | 30 +++++++- .../Persistence/DatabaseFactory.cs | 70 ------------------- .../UnitOfWork/PetaPocoUnitOfWorkProvider.cs | 2 +- src/Umbraco.Core/Services/ContentService.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 1 - ...actoryTests.cs => DatabaseContextTests.cs} | 14 ++-- .../Persistence/RepositoryResolverTests.cs | 6 +- .../Services/ContentServiceTests.cs | 2 +- .../Services/ThreadSafetyServiceTest.cs | 18 ++--- src/Umbraco.Tests/Umbraco.Tests.csproj | 2 +- 12 files changed, 54 insertions(+), 97 deletions(-) delete mode 100644 src/Umbraco.Core/Persistence/DatabaseFactory.cs rename src/Umbraco.Tests/Persistence/{DatabaseFactoryTests.cs => DatabaseContextTests.cs} (75%) diff --git a/src/Umbraco.Core/Auditing/DataAuditWriteProvider.cs b/src/Umbraco.Core/Auditing/DataAuditWriteProvider.cs index 2837eeff4f..d6dc0e1e27 100644 --- a/src/Umbraco.Core/Auditing/DataAuditWriteProvider.cs +++ b/src/Umbraco.Core/Auditing/DataAuditWriteProvider.cs @@ -4,7 +4,7 @@ using Umbraco.Core.Persistence; namespace Umbraco.Core.Auditing { - public class DataAuditWriteProvider : IAuditWriteProvider + internal class DataAuditWriteProvider : IAuditWriteProvider { /// /// Writes an audit entry to the underlaying datastore. diff --git a/src/Umbraco.Core/Auditing/IAuditWriteProvider.cs b/src/Umbraco.Core/Auditing/IAuditWriteProvider.cs index ab4abceb7f..df19bd8ea0 100644 --- a/src/Umbraco.Core/Auditing/IAuditWriteProvider.cs +++ b/src/Umbraco.Core/Auditing/IAuditWriteProvider.cs @@ -2,7 +2,7 @@ namespace Umbraco.Core.Auditing { - public interface IAuditWriteProvider + internal interface IAuditWriteProvider { /// /// Writes an audit entry to the underlaying datastore. diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 9d281cd352..6ebfe6079a 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -25,6 +25,9 @@ namespace Umbraco.Core private bool _configured; private string _connectionString; private string _providerName; + private static volatile Database _globalInstance = null; + private static readonly object Locker = new object(); + #region Singleton private static readonly Lazy lazy = new Lazy(() => new DatabaseContext()); @@ -46,12 +49,37 @@ namespace Umbraco.Core /// /// This should not be used for CRUD operations or queries against the /// standard Umbraco tables! Use the Public services for that. + /// + /// If we are running in an http context + /// it will create on per context, otherwise it will a global singleton object /// public Database Database { get { - return DatabaseFactory.Current.Database; + //no http context, create the singleton global object + if (HttpContext.Current == null) + { + if (_globalInstance == null) + { + lock (Locker) + { + //double check + if (_globalInstance == null) + { + _globalInstance = new Database(GlobalSettings.UmbracoConnectionName); + } + } + } + return _globalInstance; + } + + //we have an http context, so only create one per request + if (!HttpContext.Current.Items.Contains(typeof(DatabaseContext))) + { + HttpContext.Current.Items.Add(typeof(DatabaseContext), new Database(GlobalSettings.UmbracoConnectionName)); + } + return (Database)HttpContext.Current.Items[typeof(DatabaseContext)]; } } diff --git a/src/Umbraco.Core/Persistence/DatabaseFactory.cs b/src/Umbraco.Core/Persistence/DatabaseFactory.cs deleted file mode 100644 index 28daf4967d..0000000000 --- a/src/Umbraco.Core/Persistence/DatabaseFactory.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Threading; -using System.Web; -using Umbraco.Core.Configuration; - -namespace Umbraco.Core.Persistence -{ - /// - /// Creates a database object for PetaPoco depending on the context. If we are running in an http context - /// it will create on per context, otherwise it will create a global singleton - /// - /// - /// Because the Database is created static, the configuration has to be checked and set in - /// another class, which is where the DatabaseContext comes in. - /// - internal sealed class DatabaseFactory - { - - #region Singleton - - private static readonly Lazy lazy = new Lazy(() => new DatabaseFactory()); - private static volatile Database _globalInstance = null; - private static readonly object Locker = new object(); - public static DatabaseFactory Current { get { return lazy.Value; } } - - private DatabaseFactory() - { - } - - #endregion - - /// - /// Returns an instance of the PetaPoco database - /// - /// - /// If we are running in an http context - /// it will create on per context, otherwise it will create transient objects (new instance each time) - /// - public Database Database - { - get - { - //no http context, create the singleton global object - if (HttpContext.Current == null) - { - if (_globalInstance == null) - { - lock(Locker) - { - //double check - if (_globalInstance == null) - { - _globalInstance = new Database(GlobalSettings.UmbracoConnectionName); - } - } - } - return _globalInstance; - } - - //we have an http context, so only create one per request - if (!HttpContext.Current.Items.Contains(typeof (DatabaseFactory))) - { - HttpContext.Current.Items.Add(typeof (DatabaseFactory), new Database(GlobalSettings.UmbracoConnectionName)); - } - return (Database) HttpContext.Current.Items[typeof (DatabaseFactory)]; - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs index ee46f56745..886c060123 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Persistence.UnitOfWork public IDatabaseUnitOfWork GetUnitOfWork() { - return new PetaPocoUnitOfWork(DatabaseFactory.Current.Database); + return new PetaPocoUnitOfWork(DatabaseContext.Current.Database); } #endregion diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index f0401bfb21..b7c5160c8f 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -516,7 +516,7 @@ namespace Umbraco.Core.Services if (Saved != null) Saved(content, e); - Audit.Add(AuditTypes.Save, "Save Content performed by user", userId == -1 ? 0 : userId, content.Id); + //Audit.Add(AuditTypes.Save, "Save Content performed by user", userId == -1 ? 0 : userId, content.Id); } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index bb0cf0dfe7..40d038138b 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -183,7 +183,6 @@ - diff --git a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs similarity index 75% rename from src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs rename to src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index c5de6d3945..c8c318d2d7 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseFactoryTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -11,13 +11,13 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence { [TestFixture] - public class DatabaseFactoryTests + public class DatabaseContextTests { [Test] public void Can_Verify_Single_Database_Instance() { - var db1 = DatabaseFactory.Current.Database; - var db2 = DatabaseFactory.Current.Database; + var db1 = DatabaseContext.Current.Database; + var db2 = DatabaseContext.Current.Database; Assert.AreSame(db1, db2); } @@ -53,11 +53,11 @@ namespace Umbraco.Tests.Persistence SyntaxConfig.SqlSyntaxProvider = SqlCeSyntaxProvider.Instance; //Create the umbraco database - DatabaseFactory.Current.Database.CreateDatabaseSchema(); + DatabaseContext.Current.Database.CreateDatabaseSchema(); - bool umbracoNodeTable = DatabaseFactory.Current.Database.TableExist("umbracoNode"); - bool umbracoUserTable = DatabaseFactory.Current.Database.TableExist("umbracoUser"); - bool cmsTagsTable = DatabaseFactory.Current.Database.TableExist("cmsTags"); + bool umbracoNodeTable = DatabaseContext.Current.Database.TableExist("umbracoNode"); + bool umbracoUserTable = DatabaseContext.Current.Database.TableExist("umbracoUser"); + bool cmsTagsTable = DatabaseContext.Current.Database.TableExist("cmsTags"); Assert.That(umbracoNodeTable, Is.True); Assert.That(umbracoUserTable, Is.True); diff --git a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs index 80c05585c1..654e8f5e80 100644 --- a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs +++ b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs @@ -46,7 +46,7 @@ namespace Umbraco.Tests.Persistence { var method = typeof(RepositoryResolver).GetMethod("ResolveByType", BindingFlags.NonPublic | BindingFlags.Instance); var gMethod = method.MakeGenericMethod(repoType); - var repo = gMethod.Invoke(RepositoryResolver.Current, new object[] { new PetaPocoUnitOfWork(DatabaseFactory.Current.Database) }); + var repo = gMethod.Invoke(RepositoryResolver.Current, new object[] { new PetaPocoUnitOfWork(DatabaseContext.Current.Database) }); Assert.IsNotNull(repo); Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(repoType, repo.GetType())); } @@ -55,7 +55,7 @@ namespace Umbraco.Tests.Persistence public void Can_Verify_UOW_In_Repository() { // Arrange - var uow = new PetaPocoUnitOfWork(DatabaseFactory.Current.Database); + var uow = new PetaPocoUnitOfWork(DatabaseContext.Current.Database); // Act var repository = RepositoryResolver.Current.ResolveByType(uow); @@ -75,7 +75,7 @@ namespace Umbraco.Tests.Persistence Assert.That(isSubclassOf, Is.False); Assert.That(isAssignableFrom, Is.True); - var uow = new PetaPocoUnitOfWork(DatabaseFactory.Current.Database); + var uow = new PetaPocoUnitOfWork(DatabaseContext.Current.Database); var repository = RepositoryResolver.Current.ResolveByType(uow); bool subclassOf = repository.GetType().IsSubclassOf(typeof (IRepository)); diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 9096df8ad9..3de365b22c 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -668,7 +668,7 @@ namespace Umbraco.Tests.Services [Test] public void Can_Save_Lazy_Content() { - var unitOfWork = new PetaPocoUnitOfWork(DatabaseFactory.Current.Database); + var unitOfWork = new PetaPocoUnitOfWork(Umbraco.Core.DatabaseContext.Current.Database); var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage"); var root = ServiceContext.ContentService.GetById(1046); diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index 0e8d04e187..e99dd7fa5e 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -54,7 +54,7 @@ namespace Umbraco.Tests.Services /// private volatile Exception _error = null; - private int _maxThreadCount = 20; + private int _maxThreadCount = 1; private object _locker = new object(); private Tuple _lastUowIdWithThread = null; @@ -83,12 +83,12 @@ namespace Umbraco.Tests.Services Debug.WriteLine("Saving content1 on thread: " + Thread.CurrentThread.ManagedThreadId); contentService.Save(content1); - Thread.Sleep(100); //quick pause for maximum overlap! + //Thread.Sleep(100); //quick pause for maximum overlap! - var content2 = contentService.CreateContent(-1, "umbTextpage", 0); - content2.Name = "test" + Guid.NewGuid(); - Debug.WriteLine("Saving content2 on thread: " + Thread.CurrentThread.ManagedThreadId); - contentService.Save(content2); + //var content2 = contentService.CreateContent(-1, "umbTextpage", 0); + //content2.Name = "test" + Guid.NewGuid(); + //Debug.WriteLine("Saving content2 on thread: " + Thread.CurrentThread.ManagedThreadId); + //contentService.Save(content2); } catch(Exception e) { @@ -202,9 +202,9 @@ namespace Umbraco.Tests.Services public IDatabaseUnitOfWork GetUnitOfWork() { //Create or get a database instance for this thread. - var db = _databases.GetOrAdd(Thread.CurrentThread.ManagedThreadId, i => new Database(Umbraco.Core.Configuration.GlobalSettings.UmbracoConnectionName)); - - return new PetaPocoUnitOfWork(db); + //var db = _databases.GetOrAdd(Thread.CurrentThread.ManagedThreadId, i => new Database(Umbraco.Core.Configuration.GlobalSettings.UmbracoConnectionName)); + + return new PetaPocoUnitOfWork(new Database(Umbraco.Core.Configuration.GlobalSettings.UmbracoConnectionName)); } protected override void DisposeResources() diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 68be8b9e3f..307d442c68 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -183,7 +183,7 @@ - +