internal override void ExecuteSql(
            MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction,
            DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(migrationStatement);
            DebugCheck.NotNull(connection);

            _logger.Verbose(migrationStatement.Sql);

            var providerServices = DbProviderServices.GetProviderServices(connection);

            if (providerServices != null)
            {
                providerServices.RegisterInfoMessageHandler(
                    connection,
                    message =>
                {
                    if (!string.Equals(message, _lastInfoMessage, StringComparison.OrdinalIgnoreCase))
                    {
                        _logger.Warning(message);

                        // simple duplicate filtering
                        _lastInfoMessage = message;
                    }
                });
            }

            base.ExecuteSql(migrationStatement, connection, transaction, interceptionContext);
        }
        /// <summary>
        ///     Initializes a new instance of the MigratorLoggingDecorator class.
        /// </summary>
        /// <param name="innerMigrator"> The migrator that this decorator is wrapping. </param>
        /// <param name="logger"> The logger to write messages to. </param>
        public MigratorLoggingDecorator(MigratorBase innerMigrator, MigrationsLogger logger)
            : base(innerMigrator)
        {
            Check.NotNull(innerMigrator, "innerMigrator");
            Check.NotNull(logger, "logger");

            _logger = logger;
            _logger.Verbose(Strings.LoggingTargetDatabase(base.TargetDatabase));
        }
        /// <summary>
        ///     Initializes a new instance of the MigratorLoggingDecorator class.
        /// </summary>
        /// <param name = "innerMigrator">The migrator that this decorator is wrapping.</param>
        /// <param name = "logger">The logger to write messages to.</param>
        public MigratorLoggingDecorator(MigratorBase innerMigrator, MigrationsLogger logger)
            : base(innerMigrator)
        {
            //Contract.Requires(innerMigrator != null);
            //Contract.Requires(logger != null);

            _logger = logger;
            _logger.Verbose(Strings.LoggingTargetDatabase(base.TargetDatabase));
        }
        /// <summary>
        ///     Initializes a new instance of the MigratorLoggingDecorator class.
        /// </summary>
        /// <param name="innerMigrator"> The migrator that this decorator is wrapping. </param>
        /// <param name="logger"> The logger to write messages to. </param>
        public MigratorLoggingDecorator(MigratorBase innerMigrator, MigrationsLogger logger)
            : base(innerMigrator)
        {
            Check.NotNull(innerMigrator, "innerMigrator");
            Check.NotNull(logger, "logger");

            _logger = logger;
            _logger.Verbose(Strings.LoggingTargetDatabase(base.TargetDatabase));
        }
        internal override void ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
        {
            _logger.Verbose(migrationStatement.Sql);

            base.ExecuteSql(transaction, migrationStatement);
        }