Пример #1
0
        public IDbConnection OpenConnection(ConnectionInfo connectionInfo)
        {
            if (_connection == null)
            {
                DbProviderFactory factory = GetDbProviderFactory(connectionInfo);
                var connection = factory.CreateConnection();
                if (connection == null)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
                                                                      "Unable to create a connection for ADO.NET provider '{0}'.",
                                                                      connectionInfo.ProviderInvariantName));
                }
                connection.ConnectionString = connectionInfo.ConnectionString;
                connection.Open();

                // enable ANSI quoting if needed
                if (!string.IsNullOrEmpty(connectionInfo.EnableAnsiQuotesCommand))
                {
                    DbCommand command = connection.CreateCommand();
                    command.CommandText = connectionInfo.EnableAnsiQuotesCommand;
                    command.ExecuteNonQuery();
                }

                return connection;
            }
            else
            {
                return _connection;
            }
        }
Пример #2
0
 public RuntimeConfiguration(ProviderInfo providerInfo, ConnectionInfo connectionInfo, IValidator validator, ISqlDispatcher sqlDispatcher)
 {
     _providerInfo = providerInfo;
     _connectionInfo = connectionInfo;
     _validator = validator;
     _sqlDispatcher = sqlDispatcher;
 }
Пример #3
0
 public MigrationStep(IMigration migration, IScheduledMigrationMetadata metadata, ConnectionInfo connectionInfo, IProvider provider, IProviderMetadata providerMetadata, IDbConnectionFactory connectionFactory, ISqlDispatcher sqlDispatcher)
     : base(migration, provider, providerMetadata)
 {
     _metadata = metadata;
     _connectionInfo = connectionInfo;
     _connectionFactory = connectionFactory;
     _sqlDispatcher = sqlDispatcher;
 }
Пример #4
0
        private RuntimeConfiguration CreateRuntimeConfiguration(string connectionString, DbPlatform dbPlatform, DbAltererOptions options)
        {
            var providerLocator = new ProviderLocator(new ProviderFactory()); // CLEAN: use DI container

            var providerInfo = providerLocator.GetLatest(dbPlatform);
            var validatorFactory = new ValidatorFactory(providerInfo, options, providerLocator);
            var validator = validatorFactory.Create();
            var connectionInfo = new ConnectionInfo(connectionString, providerInfo.Metadata.InvariantName, providerInfo.Metadata.SupportsTransactions, providerInfo.Metadata.EnableAnsiQuotesCommand);
            var sqlDispatcher = new SqlDispatcher(options.GetScriptingOptions(), providerInfo.Provider, providerInfo.Metadata);
            return new RuntimeConfiguration(providerInfo, connectionInfo, validator, sqlDispatcher);
        }
Пример #5
0
 public IDbConnection OpenConnection(ConnectionInfo connectionInfo)
 {
     DbProviderFactory factory = GetDbProviderFactory(connectionInfo);
     var connection = factory.CreateConnection();
     if (connection == null)
     {
         throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Unable to create a connection for ADO.NET provider '{0}'.", connectionInfo.ProviderInvariantName));
     }
     connection.ConnectionString = connectionInfo.ConnectionString;
     connection.Open();
     return connection;
 }
Пример #6
0
        internal Versioning(ConnectionInfo connectionInfo, IDbConnectionFactory connectionFactory, IProvider provider, IProviderMetadata providerMetadata, string versioningTableName, ISqlDispatcher sqlDispatcher)
        {
            _connectionInfo = connectionInfo;
            _connectionFactory = connectionFactory;
            _provider = provider;
            _providerMetadata = providerMetadata;
            _versioningTableName = versioningTableName;
            _sqlDispatcher = sqlDispatcher;

            _versioningTableExists = new Lazy<bool>(() =>
                {
                    int exists;
                    using (IDbConnection connection = connectionFactory.OpenConnection(connectionInfo))
                    {
                        IDbCommand command = connection.CreateCommand();
                        command.CommandTimeout = 0; // do not timeout; the client is responsible for not causing lock-outs
                        command.CommandText = provider.ExistsTable(connection.Database, _versioningTableName);
                        Log.Verbose(LogCategory.Sql, command.CommandText);
                        exists = Convert.ToInt32(command.ExecuteScalar(), CultureInfo.InvariantCulture);
                    }
                    return exists != 0;
                });
        }
Пример #7
0
        public void TestScriptingAllMigrations()
        {
            DirectoryInfo targetDirectory = PrepareScriptingDirectory();
            _options.VersioningTableName = "My Versioning Table"; // test overriding the default versioning table name
            _options.OnlyScriptSqlTo(targetDirectory);
            Migrator migrator = CreateMigrator();
            migrator.MigrateAll(typeof(Migration1).Assembly);

            // assert that all script files were generated
            List<FileInfo> scriptFiles = targetDirectory.GetFiles(string.Format(CultureInfo.InvariantCulture, "Migration.*.*.sql"))
                .OrderBy(f => int.Parse(Regex.Match(f.Name, @"Migration\..*\.(\d+)\.sql").Groups[1].Value, CultureInfo.InvariantCulture))
                .ToList();
            Assert.AreEqual(Migrations.Count, scriptFiles.Count);
            Assert.AreEqual("Migration." + MigrationExportAttribute.DefaultModuleName + ".1.sql", scriptFiles[0].Name);
            Assert.AreEqual("Migration." + Migration2.Module + ".2.sql", scriptFiles[1].Name);

            // assert Versioning table was *not* created as we are scripting only
            DataTable versioningTable = GetTable(_options.VersioningTableName);
            Assert.IsNull(versioningTable, string.Format(CultureInfo.CurrentCulture, "The '{0}' table was created altough ScriptingMode was ScriptOnly.", _options.VersioningTableName));

            // assert Customer table was *not* created as we are scripting only
            var migration1 = new Migration1();
            DataTable customerTable = GetTable(migration1.Tables[0].Name);
            Assert.IsNull(customerTable, string.Format(CultureInfo.CurrentCulture, "The '{0}' table was created altough ScriptingMode was ScriptOnly.", migration1.Tables[0].Name));

            // execute generated script files against database and recheck results
            IProviderMetadata providerMetadata;
            _options.SupportedProviders.GetProvider(ProviderName, out providerMetadata);
            var info = new ConnectionInfo(ConnectionString, providerMetadata.InvariantName, providerMetadata.SupportsTransactions, providerMetadata.EnableAnsiQuotesCommand);
            using (IDbConnection connection = migrator.ConnectionFactory.OpenConnection(info))
            {
                foreach (FileInfo scriptFile in scriptFiles)
                {
                    Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Reading script '{0}':", scriptFile.FullName));
                    string[] scriptLines = File.ReadAllLines(scriptFile.FullName);
                    foreach (string line in scriptLines)
                    {
                        Trace.WriteLine(line);
                    }

                    // group all lines between empty lines into one command (some database platforms require DDL operations to
                    // be executed in separated commands)
                    Trace.WriteLine(Environment.NewLine + string.Format(CultureInfo.CurrentCulture, "Executing script '{0}':", scriptFile.FullName));
                    string commandText = string.Empty;
                    foreach (string line in scriptLines)
                    {
                        if (line.Trim().Length != 0)
                        {
                            commandText += line;
                        }
                        else
                        {
                            ExecuteCommand(commandText, connection);
                            commandText = string.Empty;
                        }
                    }
                    Assert.IsEmpty(commandText, "The script should end with an empty line.");
                }
            }
            VerifyResultsOfAllMigrations();

            // delete script files
            targetDirectory.Delete(true);
        }
Пример #8
0
 public DbProviderFactory GetDbProviderFactory(ConnectionInfo connectionInfo)
 {
     return DbProviderFactories.GetFactory(connectionInfo.ProviderInvariantName);
 }