示例#1
0
 public void AddMigration(IDatabaseMigration migration)
 {
     if (!migrations.Contains(migration))
     {
         migrations.Add(migration);
     }
 }
 public void Save(IMongoDatabase db, IDatabaseMigration migration)
 {
     GetMigrationsCollection(db).InsertOne(new MigrationHistory
     {
         MigrationId = migration.GetType().ToString(),
         Version     = migration.Version
     });
 }
示例#3
0
        private void RecordMigration(IDatabaseMigration migration)
        {
            var migrationsTableExistsCommand = new DbCommandSpec()
                                               .SetCommandText(string.Format("insert into {0} (Name) values ({1}name)", MIGRATIONS_TABLE_NAME,
                                                                             SessionFactory.DEFAULT_SQL_PARAMETER_PREFIX))
                                               .AddParameter("name", migration.Name);

            UnitOfWork.Current.Session.ExecuteNonQuery(migrationsTableExistsCommand);
        }
示例#4
0
        private bool PreviouslyRun(IDatabaseMigration migration)
        {
            var command = new DbCommandSpec()
                          .SetCommandText(string.Format("select count(*) from {0} where Name = {1}name",
                                                        MIGRATIONS_TABLE_NAME, SessionFactory.DEFAULT_SQL_PARAMETER_PREFIX))
                          .AddParameter("name", migration.Name);
            var result = (long)UnitOfWork.Current.Session.ExecuteScalar(command);

            return(result > 0);
        }
 private void RecordMigration(IDatabaseMigration migration)
 {
     var migrationsTableExistsCommand = new DbCommandSpec()
         .SetCommandText(string.Format("insert into {0} ({1}) values ({2})",
             MIGRATIONS_TABLE_NAME,
             session.DbAdapter.Quote(MIGRATION_NAME_COLUMN_NAME),
             session.DbAdapter.FormatParameterName("name")))
         .AddParameter("name", migration.Name);
     session.ExecuteNonQuery(migrationsTableExistsCommand);
 }
 private bool PreviouslyRun(IDatabaseMigration migration)
 {
     var command = new DbCommandSpec()
         .SetCommandText(string.Format("select count(*) from {0} where {1} = {2}",
             MIGRATIONS_TABLE_NAME,
             session.DbAdapter.Quote(MIGRATION_NAME_COLUMN_NAME),
             session.DbAdapter.FormatParameterName("name")))
         .AddParameter("name", migration.Name);
     var result = session.ExecuteScalar(command);
     return Convert.ToInt64(result) > 0;
 }
        protected IDatabaseMigration CreateMigrationInstance(MigrationReference migrationReference)
        {
            Type               type     = CompileMigration(migrationReference);
            object             fixture  = Activator.CreateInstance(type);
            IDatabaseMigration instance = fixture as IDatabaseMigration;

            if (instance == null)
            {
                throw new ArgumentException(type + " should be a " + typeof(IDatabaseMigration));
            }
            return(instance);
        }
        public override MigrationInitializer Create()
        {
            _databaseProvider      = _mocks.StrictMock <IDatabaseProvider>();
            _schemaProvider        = _mocks.StrictMock <ISchemaProvider>();
            _migration             = _mocks.StrictMock <IDatabaseMigration>();
            _configuration         = _mocks.StrictMock <IConfiguration>();
            _commonTransformations = _mocks.StrictMock <ICommonTransformations>();
            _connectionProvider    = _mocks.StrictMock <IConnectionProvider>();

            return(new MigrationInitializer(_configuration, _databaseProvider, _schemaProvider, _commonTransformations,
                                            _connectionProvider));
        }
示例#9
0
 public bool CanMigrate(IDictionary <string, List <MigrationStep> > steps)
 {
     foreach (MigrationStep step in steps.SelectMany(row => row.Value).OrderBy(row => row.Version))
     {
         MigrationReference migrationReference = step.MigrationReference;
         IMigrationFactory  migrationFactory   = _migrationFactoryChooser.ChooseFactory(migrationReference);
         IDatabaseMigration migration          = migrationFactory.CreateMigration(migrationReference);
         step.DatabaseMigration = migration;
         _migrationInitializer.InitializeMigration(migration);
     }
     _log.Info("All migrations are initialized.");
     return(true);
 }
示例#10
0
        public void CreateMigration_reading_a_file_with_Down_marker_only_will_initialize_SqlScriptMigration_with_Down_scripts_only()
        {
            using (_mocks.Record())
            {
                SetupResult.For(_fileSystem.ReadAllText(_migrationPath)).Repeat.Once().Return(ReadScriptWithDownMarkerOnly);
            }
            using (_mocks.Playback())
            {
                resultingMigration = _target.CreateMigration(_migrationReference);
            }

            var sqlScriptMigration = resultingMigration as SqlScriptMigration;

            Assert.That(sqlScriptMigration.UpScript == "");
            Assert.That(sqlScriptMigration.DownScript == DownScript);

            _mocks.VerifyAll();
        }
 public override MigrationRunner Create()
 {
     _steps = new Dictionary <string, List <MigrationStep> >();
     _steps[string.Empty] = new List <MigrationStep>();
     _steps[string.Empty].Add(new MigrationStep(new MigrationReference(1, "A", "001_a.cs"), false));
     _steps[string.Empty].Add(new MigrationStep(new MigrationReference(2, "B", "002_b.cs"), false));
     _migration1              = _mocks.StrictMock <IDatabaseMigration>();
     _migration2              = _mocks.StrictMock <IDatabaseMigration>();
     _schemaStateManager      = _mocks.DynamicMock <ISchemaStateManager>();
     _migrationFactoryChooser = _mocks.DynamicMock <IMigrationFactoryChooser>();
     _migrationInitializer    = _mocks.DynamicMock <IMigrationInitializer>();
     _migrationFactory        = _mocks.DynamicMock <IMigrationFactory>();
     _configuration           = _mocks.DynamicMock <IConfiguration>();
     _transactionProvider     = _mocks.DynamicMock <ITransactionProvider>();
     _transaction             = _mocks.StrictMock <IDbTransaction>();
     return(new MigrationRunner(_migrationFactoryChooser, _migrationInitializer, _schemaStateManager, _configuration,
                                _transactionProvider));
 }
        private async Task <List <DatabaseMigrationSpecifier> > GetRequiredMigrationDependenciesAsync(
            IDatabaseMigration migration, List <DatabaseMigrationSpecifier> queuedMigrations, string[] tags)
        {
            var dependencies = new List <DatabaseMigrationSpecifier>();

            foreach (var dependency in migration.Dependencies)
            {
                var dependencyMigrations = await SelectModuleMigrationsNoDependenciesAsync(dependency, tags, queuedMigrations);

                if (dependencyMigrations.Count > 0)
                {
                    dependencies.Add(new DatabaseMigrationSpecifier(
                                         dependencyMigrations.Last().ModuleName,
                                         dependencyMigrations.Last().Version));
                }
            }

            return(dependencies);
        }
示例#13
0
 private static ISessionFactory Bootstrap(IDatabaseMigration createSchema, IDbAdapter dbAdapter, Action<string> createDatabaseFunc)
 {
     Log.Level = LogLevel.Off;
     const string dbFileName = "main.db";
     const string connectionString = "Data source=" + dbFileName;
     File.Delete(dbFileName);
     if (createDatabaseFunc != null)
     {
         createDatabaseFunc(connectionString);
     }
     var sessionFactory = Fluently.Configure
         .ConnectionString(connectionString)
         .DatabaseAdapter(dbAdapter)
         .Domain(DomainMapping.Get())
         .Build();
     UnitOfWork.Initialize(sessionFactory);
     using (var s = sessionFactory.Create())
     {
         s.Open();
         new DatabaseMigratorUtility(s).Migrate(createSchema);
     }
     return sessionFactory;
 }
示例#14
0
        public void CreateMigration_reading_empty_file_will_return_a_SqlScriptMigration_with_empty_Up_and_Down_scripts()
        {
            using (_mocks.Record())
            {
                SetupResult.For(_fileSystem.ReadAllText(_migrationPath)).Repeat.Once().Return("");
            }
            using (_mocks.Playback())
            {
                resultingMigration = _target.CreateMigration(_migrationReference);
            }

            var sqlScriptMigration = resultingMigration as SqlScriptMigration;

            if (sqlScriptMigration == null)
            {
                Assert.Fail("Returned migration should be SqlScriptMigration!");
            }

            Assert.That(sqlScriptMigration.UpScript == "");
            Assert.That(sqlScriptMigration.DownScript == "");

            _mocks.VerifyAll();
        }
示例#15
0
 public bool SupportsMigration(IDatabaseMigration migration)
 {
     return(migration is SqlDatabaseMigration);
 }
示例#16
0
        private async Task <List <DatabaseMigrationSpecifier> > GetRequiredMigrationDependenciesAsync(
            IDatabaseMigration migration, List <DatabaseMigrationSpecifier> queuedMigrations, string[] tags)
        {
            var dependencies = new List <DatabaseMigrationSpecifier>();

            history = history ?? await migrationProvider.GetMigrationHistoryAsync();

            var tagMatchingMigrations = migrationRegistry.Migrations
                                        .Where(x => x.Tags.All(tagGroup => tags.Any(tagGroup.Contains)));

            foreach (var dependency in migration.Dependencies)
            {
                // repeatable dependencies
                var repeatableMigration = tagMatchingMigrations.FirstOrDefault(x => x.ModuleName == dependency.ModuleName && x.IsRepeatable);
                if (dependency.Version == null && repeatableMigration != null)
                {
                    if (queuedMigrations.Any(x => x.ModuleName == dependency.ModuleName))
                    {
                        continue;
                    }

                    var lastMigration = history
                                        .Where(x => string.Equals(x.ModuleName, dependency.ModuleName, StringComparison.InvariantCultureIgnoreCase))
                                        .OrderByDescending(x => x.TimeApplied).FirstOrDefault();

                    if (lastMigration?.Checksum == repeatableMigration.Checksum)
                    {
                        continue;
                    }

                    dependencies.Add(dependency);
                }
                // versioned dependencies
                else
                {
                    var version = queuedMigrations
                                  .Where(x => string.Equals(x.ModuleName, dependency.ModuleName, StringComparison.InvariantCultureIgnoreCase))
                                  .OrderByDescending(x => x.Version)
                                  .Select(x => x.Version)
                                  .FirstOrDefault();

                    if (version == null)
                    {
                        var lastMigration = history
                                            .Where(x => string.Equals(x.ModuleName, dependency.ModuleName, StringComparison.InvariantCultureIgnoreCase))
                                            .OrderByDescending(x => x.Version).FirstOrDefault();
                        version = lastMigration?.Version;
                    }

                    IEnumerable <IDatabaseMigration> matchingDependencies = tagMatchingMigrations
                                                                            .Where(x => x.ModuleName == dependency.ModuleName)
                                                                            .OrderByDescending(x => x.Version);

                    if (dependency.Version != null)
                    {
                        matchingDependencies = matchingDependencies.Where(x => dependency.Version.Equals(x.Version));

                        if (matchingDependencies.Any() && version != null && version.CompareTo(matchingDependencies.First().Version) >= 0)
                        {
                            continue; // nothing to upgrade, case when !matchingDependencies.Any() is handled later
                        }
                    }
                    else
                    {
                        if (matchingDependencies.Any())
                        {
                            var maxVersion = matchingDependencies.Select(x => x.Version).Max();
                            if (version != null && version.CompareTo(maxVersion) >= 0)
                            {
                                continue; // nothing to upgrade, case when !matchingDependencies.Any() is handled later
                            }

                            matchingDependencies = matchingDependencies.Where(x => maxVersion.Equals(x.Version));
                        }
                    }

                    if (!matchingDependencies.Any())
                    {
                        throw new DatabaseMigrationException($"Database migration {migration} specifies dependency to {dependency.ModuleName}@{dependency.Version?.ToString() ?? "latest"}, but no matching migrations to that version were found");
                    }

                    matchingDependencies = matchingDependencies.ToArray();

                    if (version != null)
                    {
                        matchingDependencies = matchingDependencies.Where(x => !x.IsBaseline);

                        if (!matchingDependencies.Any())
                        {
                            throw new DatabaseMigrationException($"Database migration {migration} specifies dependency to {dependency.ModuleName}@{dependency.Version?.ToString() ?? "latest"}, for which there is a baseline migration, but no upgrade migration from version {version}");
                        }
                    }

                    dependencies.Add(dependency);
                }
            }

            return(dependencies);
        }
示例#17
0
 public void InitializeMigration(IDatabaseMigration migration)
 {
     migration.Initialize(new MigrationContext(_configuration, _databaseProvider, _schemaProvider, _commonTransformations, _connectionProvider));
 }
 public void Remove(IMongoDatabase db, IDatabaseMigration migration)
 {
     GetMigrationsCollection(db).DeleteOne(Builders <MigrationHistory> .Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString()));
 }
示例#19
0
 public void InitializeMigration(IDatabaseMigration migration)
 {
     migration.Initialize(new MigrationContext(_configuration, _databaseProvider, _schemaProvider, _commonTransformations,
     _connectionProvider));
 }