2012-12-15 08:41:46 +05:00
using System ;
2013-07-08 17:29:26 +10:00
using System.Collections.Generic ;
2012-12-12 03:47:04 +05:00
using System.Data ;
using System.Data.Common ;
2013-07-08 17:29:26 +10:00
using System.Linq ;
2013-05-10 10:15:30 -02:00
using StackExchange.Profiling ;
2013-01-18 09:00:18 -01:00
using Umbraco.Core.Logging ;
2012-12-12 03:47:04 +05:00
namespace Umbraco.Core.Persistence
{
2015-01-09 15:27:47 +11:00
/// <summary>
/// Represents the Umbraco implementation of the PetaPoco Database object
/// </summary>
/// <remarks>
/// Currently this object exists for 'future proofing' our implementation. By having our own inheritied implementation we
/// can then override any additional execution (such as additional loggging, functionality, etc...) that we need to without breaking compatibility since we'll always be exposing
/// this object instead of the base PetaPoco database object.
/// </remarks>
2013-09-30 12:02:35 +10:00
public class UmbracoDatabase : Database , IDisposeOnRequestEnd
2015-01-09 15:27:47 +11:00
{
private readonly ILogger _logger ;
2013-01-18 09:00:18 -01:00
private readonly Guid _instanceId = Guid . NewGuid ( ) ;
2015-07-22 12:10:21 +02:00
private bool _enableCount ;
2015-01-09 15:27:47 +11:00
/// <summary>
/// Used for testing
/// </summary>
internal Guid InstanceId
{
get { return _instanceId ; }
}
2015-07-22 12:10:21 +02:00
/// <summary>
/// Generally used for testing, will output all SQL statements executed to the logger
/// </summary>
internal bool EnableSqlTrace { get ; set ; }
/// <summary>
/// Used for testing
/// </summary>
internal void EnableSqlCount ( )
{
_enableCount = true ;
}
/// <summary>
/// Used for testing
/// </summary>
internal void DisableSqlCount ( )
{
_enableCount = false ;
SqlCount = 0 ;
}
/// <summary>
/// Used for testing
/// </summary>
internal int SqlCount { get ; private set ; }
2015-01-09 15:27:47 +11:00
[Obsolete("Use the other constructor specifying an ILogger instead")]
public UmbracoDatabase ( IDbConnection connection )
: this ( connection , LoggerResolver . Current . Logger )
{
}
[Obsolete("Use the other constructor specifying an ILogger instead")]
public UmbracoDatabase ( string connectionString , string providerName )
: this ( connectionString , providerName , LoggerResolver . Current . Logger )
{
}
[Obsolete("Use the other constructor specifying an ILogger instead")]
public UmbracoDatabase ( string connectionString , DbProviderFactory provider )
: this ( connectionString , provider , LoggerResolver . Current . Logger )
{
}
[Obsolete("Use the other constructor specifying an ILogger instead")]
public UmbracoDatabase ( string connectionStringName )
: this ( connectionStringName , LoggerResolver . Current . Logger )
{
}
public UmbracoDatabase ( IDbConnection connection , ILogger logger )
: base ( connection )
{
_logger = logger ;
2015-07-22 12:10:21 +02:00
EnableSqlTrace = false ;
2015-01-09 15:27:47 +11:00
}
public UmbracoDatabase ( string connectionString , string providerName , ILogger logger )
: base ( connectionString , providerName )
{
_logger = logger ;
2015-07-22 12:10:21 +02:00
EnableSqlTrace = false ;
2015-01-09 15:27:47 +11:00
}
public UmbracoDatabase ( string connectionString , DbProviderFactory provider , ILogger logger )
: base ( connectionString , provider )
{
_logger = logger ;
2015-07-22 12:10:21 +02:00
EnableSqlTrace = false ;
2015-01-09 15:27:47 +11:00
}
public UmbracoDatabase ( string connectionStringName , ILogger logger )
: base ( connectionStringName )
{
_logger = logger ;
2015-07-22 12:10:21 +02:00
EnableSqlTrace = false ;
2015-01-09 15:27:47 +11:00
}
2013-01-18 09:00:18 -01:00
2013-05-10 10:15:30 -02:00
public override IDbConnection OnConnectionOpened ( IDbConnection connection )
{
// wrap the connection with a profiling connection that tracks timings
return new StackExchange . Profiling . Data . ProfiledDbConnection ( connection as DbConnection , MiniProfiler . Current ) ;
}
2015-01-09 15:27:47 +11:00
2013-01-18 09:00:18 -01:00
public override void OnException ( Exception x )
{
2015-10-30 11:24:18 +13:00
_logger . Error < UmbracoDatabase > ( "Database exception occurred" , x ) ;
2013-01-18 09:00:18 -01:00
base . OnException ( x ) ;
}
2015-07-22 12:10:21 +02:00
public override void OnExecutedCommand ( IDbCommand cmd )
{
if ( EnableSqlTrace )
{
_logger . Debug < UmbracoDatabase > ( cmd . CommandText ) ;
}
if ( _enableCount )
{
SqlCount + + ;
}
base . OnExecutedCommand ( cmd ) ;
}
2015-01-09 15:27:47 +11:00
}
2012-12-12 03:47:04 +05:00
}