("Database upgrade started");
- var database = DatabaseContext.DatabaseFactory.GetDatabase();
+ var database = _databaseFactory.GetDatabase();
//var supportsCaseInsensitiveQueries = SqlSyntax.SupportsCaseInsensitiveQueries(database);
var message = GetResultMessageForMySql();
@@ -534,7 +537,7 @@ namespace Umbraco.Core
private string GetResultMessageForMySql()
{
- if (DatabaseContext.SqlSyntax.GetType() == typeof(MySqlSyntaxProvider))
+ if (_databaseFactory.GetType() == typeof(MySqlSyntaxProvider))
{
return "
Congratulations, the database step ran successfully!
" +
"Note: You're using MySQL and the database instance you're connecting to seems to support case insensitive queries.
" +
@@ -576,7 +579,7 @@ namespace Umbraco.Core
private Attempt CheckReadyForInstall()
{
- if (DatabaseContext.DatabaseFactory.Configured == false)
+ if (_databaseFactory.Configured == false)
{
return Attempt.Fail(new Result
{
diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs
index 1500ba78ba..4a702b225c 100644
--- a/src/Umbraco.Core/DatabaseContext.cs
+++ b/src/Umbraco.Core/DatabaseContext.cs
@@ -9,86 +9,76 @@ using Umbraco.Core.Persistence.SqlSyntax;
namespace Umbraco.Core
{
///
- /// Represents the Umbraco database.
+ /// Represents the Umbraco database context.
///
- /// One per AppDomain. Ensures that the database is available.
+ ///
+ /// The database context creates Sql statements and IQuery expressions.
+ /// The database context provides the SqlSyntax and the DatabaseType.
+ /// The database context provides access to the "ambient" database.
+ /// The database context provides basic status infos (whether the db is configured and can connect).
+ ///
public class DatabaseContext
{
+ private readonly IDatabaseFactory _databaseFactory;
+ private bool _canConnectOnce;
+
+ // fixme
+ // do we need to expose the query factory here?
+ // all in all, would prob. mean replacing ALL repository.Query by something more meaningful? YES!
+
///
/// Initializes a new instance of the class.
///
/// A database factory.
/// The database factory will try to configure itself but may fail eg if the default
/// Umbraco connection string is not available because we are installing. In which case this
- /// database context must sort things out and configure the database factory before it can be
+ /// database builder must sort things out and configure the database factory before it can be
/// used.
public DatabaseContext(IDatabaseFactory databaseFactory)
{
if (databaseFactory == null) throw new ArgumentNullException(nameof(databaseFactory));
- DatabaseFactory = databaseFactory;
+ _databaseFactory = databaseFactory;
}
- // FIXME
- // this is basically exposing a subset of the database factory...
- // so why? why not "just" merge with database factory?
- // which can create & manage ambient database,
- // create Sql expressions
- // create IQuery expressions
- // ?
-
- internal IDatabaseFactory DatabaseFactory { get; }
-
///
- /// Gets the QueryFactory
+ /// Gets the query factory.
///
- public IQueryFactory QueryFactory => DatabaseFactory.QueryFactory; // fixme obsolete?
+ /// In most cases... this is useless, better use Query{T}.
+ public IQueryFactory QueryFactory => _databaseFactory.QueryFactory;
///
/// Gets the database sql syntax.
///
- public ISqlSyntaxProvider SqlSyntax => DatabaseFactory.SqlSyntax;
-
- // fixme
- // created by the database factory?
- // add PocoDataFactory
- // add DatabaseType
- // add Sql() and Query()
- // so it can finally replace SqlContext entirely?
- // need an IDatabaseContext interface?
-
- public Sql Sql()
- {
- var factory = (DefaultDatabaseFactory) DatabaseFactory; // fixme
- return NPoco.Sql.BuilderFor(factory.SqlContext);
- }
-
- public Sql Sql(string sql, params object[] args)
- {
- return Sql().Append(sql, args);
- }
-
- public IQuery Query()
- {
- return DatabaseFactory.QueryFactory.Create();
- }
+ public ISqlSyntaxProvider SqlSyntax => _databaseFactory.SqlSyntax;
///
- /// Gets the object for doing CRUD operations
- /// against custom tables that resides in the Umbraco database.
+ /// Creates a Sql statement.
///
- ///
- /// This should not be used for CRUD operations or queries against the
- /// standard Umbraco tables! Use the Public services for that.
- ///
- public UmbracoDatabase Database => DatabaseFactory.GetDatabase();
+ public Sql Sql() => _databaseFactory.Sql();
///
- /// Gets a value indicating whether the database is configured. It does not necessarily
- /// mean that it is possible to connect, nor that Umbraco is installed, nor
- /// up-to-date.
+ /// Creates a Sql statement.
///
- public bool IsDatabaseConfigured => DatabaseFactory.Configured;
+ public Sql Sql(string sql, params object[] args) => Sql().Append(sql, args);
+
+ ///
+ /// Creates a Query expression.
+ ///
+ public IQuery Query() => _databaseFactory.QueryFactory.Create();
+
+ ///
+ /// Gets an "ambient" database for doing CRUD operations against custom tables that resides in the Umbraco database.
+ ///
+ /// Should not be used for operation against standard Umbraco tables; as services should be used instead.
+ public UmbracoDatabase Database => _databaseFactory.GetDatabase();
+
+ ///
+ /// Gets a value indicating whether the database is configured.
+ ///
+ /// It does not necessarily mean that it is possible to
+ /// connect, nor that Umbraco is installed, nor up-to-date.
+ public bool IsDatabaseConfigured => _databaseFactory.Configured;
///
/// Gets a value indicating whether it is possible to connect to the database.
@@ -97,9 +87,18 @@ namespace Umbraco.Core
{
get
{
- if (DatabaseFactory.Configured == false) return false;
- var canConnect = DatabaseFactory.CanConnect;
- Current.Logger.Info("CanConnect = " + canConnect);
+ var canConnect = _databaseFactory.Configured && _databaseFactory.CanConnect;
+
+ if (_canConnectOnce)
+ {
+ Current.Logger.Debug("CanConnect: " + canConnect);
+ }
+ else
+ {
+ Current.Logger.Info("CanConnect: " + canConnect);
+ _canConnectOnce = canConnect; // keep logging Info until we can connect
+ }
+
return canConnect;
}
}
diff --git a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
index c792522441..011ecbd971 100644
--- a/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
+++ b/src/Umbraco.Core/Persistence/DefaultDatabaseFactory.cs
@@ -165,8 +165,7 @@ namespace Umbraco.Core.Persistence
}
}
- // fixme
- public SqlContext SqlContext => _sqlContext;
+ public Sql Sql() => NPoco.Sql.BuilderFor(_sqlContext);
// will be configured by the database context
public void Configure(string connectionString, string providerName)
diff --git a/src/Umbraco.Core/Persistence/IDatabaseFactory.cs b/src/Umbraco.Core/Persistence/IDatabaseFactory.cs
index dc6d3a6281..ab563b9493 100644
--- a/src/Umbraco.Core/Persistence/IDatabaseFactory.cs
+++ b/src/Umbraco.Core/Persistence/IDatabaseFactory.cs
@@ -1,4 +1,5 @@
using System;
+using NPoco;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.SqlSyntax;
@@ -24,5 +25,7 @@ namespace Umbraco.Core.Persistence
IQueryFactory QueryFactory { get; }
ISqlSyntaxProvider SqlSyntax { get; }
+
+ Sql Sql();
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs
index 8d436e1357..75d21c8f13 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MemberGroupRepository.cs
@@ -124,7 +124,7 @@ namespace Umbraco.Core.Persistence.Repositories
typeof (IMemberGroup).FullName + "." + name,
() =>
{
- var qry = QueryFactory.Create().Where(group => group.Name.Equals(name));
+ var qry = Query.Where(group => group.Name.Equals(name));
var result = GetByQuery(qry);
return result.FirstOrDefault();
},
@@ -136,7 +136,7 @@ namespace Umbraco.Core.Persistence.Repositories
public IMemberGroup CreateIfNotExists(string roleName)
{
- var qry = QueryFactory.Create().Where(group => group.Name.Equals(roleName));
+ var qry = Query.Where(group => group.Name.Equals(roleName));
var result = GetByQuery(qry);
if (result.Any()) return null;
diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs
index c6049742a2..adff6ff4ae 100644
--- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs
+++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs
@@ -15,21 +15,19 @@ namespace Umbraco.Core.Persistence.UnitOfWork
/// Initializes a new instance of the class with a database and a repository factory.
///
/// The database context.
- /// A database.
/// A repository factory.
/// This should be used by the NPocoUnitOfWorkProvider exclusively.
- internal NPocoUnitOfWork(DatabaseContext databaseContext, UmbracoDatabase database, RepositoryFactory repositoryFactory)
+ internal NPocoUnitOfWork(DatabaseContext databaseContext, RepositoryFactory repositoryFactory)
: base(repositoryFactory)
{
DatabaseContext = databaseContext;
- Database = database;
}
///
public DatabaseContext DatabaseContext { get; }
///
- public UmbracoDatabase Database { get; } // => DatabaseContext.Database; // fixme + change ctor
+ public UmbracoDatabase Database => DatabaseContext.Database;
///
public override TRepository CreateRepository(string name = null)
diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs
index 65187440e0..ce2c4557fa 100644
--- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs
+++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs
@@ -1,4 +1,4 @@
-using Umbraco.Core.DI;
+using System;
namespace Umbraco.Core.Persistence.UnitOfWork
{
@@ -7,34 +7,29 @@ namespace Umbraco.Core.Persistence.UnitOfWork
///