public void Can_Find_Migrations_With_Targtet_Version_Six() { var foundMigrations = MigrationResolver.Current.Migrations; var targetVersion = new Version("6.0.0"); var list = new List<IMigration>(); foreach (var migration in foundMigrations) { var migrationAttribute = migration.GetType().FirstAttribute<MigrationAttribute>(); if (migrationAttribute != null) { if (migrationAttribute.TargetVersion == targetVersion) { list.Add(migration); } } } Assert.That(list.Count, Is.EqualTo(3)); var context = new MigrationContext(DatabaseProviders.SqlServerCE, null); foreach (MigrationBase migration in list) { migration.GetUpExpressions(context); } Assert.That(context.Expressions.Any(), Is.True); //Console output foreach (var expression in context.Expressions) { Console.WriteLine(expression.ToString()); } }
/// <summary> /// Executes the migrations against the database. /// </summary> /// <param name="database">The PetaPoco Database, which the migrations will be run against</param> /// <param name="databaseProvider"></param> /// <param name="isUpgrade">Boolean indicating whether this is an upgrade or downgrade</param> /// <returns><c>True</c> if migrations were applied, otherwise <c>False</c></returns> public bool Execute(Database database, DatabaseProviders databaseProvider, bool isUpgrade = true) { LogHelper.Info<MigrationRunner>("Initializing database migrations"); var foundMigrations = MigrationResolver.Current.Migrations; var migrations = isUpgrade ? OrderedUpgradeMigrations(foundMigrations).ToList() : OrderedDowngradeMigrations(foundMigrations).ToList(); if (Migrating.IsRaisedEventCancelled(new MigrationEventArgs(migrations, _configuredVersion, _targetVersion, true), this)) return false; //Loop through migrations to generate sql var context = new MigrationContext(databaseProvider, database); foreach (MigrationBase migration in migrations) { if (isUpgrade) { migration.GetUpExpressions(context); LogHelper.Info<MigrationRunner>(string.Format("Added UPGRADE migration '{0}' to context", migration.GetType().Name)); } else { migration.GetDownExpressions(context); LogHelper.Info<MigrationRunner>(string.Format("Added DOWNGRADE migration '{0}' to context", migration.GetType().Name)); } } //Transactional execution of the sql that was generated from the found migrations using (Transaction transaction = database.GetTransaction()) { int i = 1; foreach (var expression in context.Expressions) { var sql = expression.Process(database); if (string.IsNullOrEmpty(sql)) { i++; continue; } LogHelper.Info<MigrationRunner>("Executing sql statement " + i + ": " + sql); database.Execute(sql); i++; } transaction.Complete(); } Migrated.RaiseEvent(new MigrationEventArgs(migrations, context, _configuredVersion, _targetVersion, false), this); return true; }
public void Can_Get_Up_Migration_From_MigrationStub() { // Arrange var context = new MigrationContext(DatabaseProviders.SqlServerCE, null); var stub = new AlterUserTableMigrationStub(); // Act stub.GetUpExpressions(context); // Assert Assert.That(context.Expressions.Any(), Is.True); //Console output Console.WriteLine("Number of expressions in context: {0}", context.Expressions.Count); Console.WriteLine(""); foreach (var expression in context.Expressions) { Console.WriteLine(expression.ToString()); } }
public void Can_Find_Targetted_Migrations() { var configuredVersion = new Version("4.8.0"); var targetVersion = new Version("6.0.0"); var foundMigrations = MigrationResolver.Current.Migrations; var migrationRunner = new MigrationRunner(configuredVersion, targetVersion, GlobalSettings.UmbracoMigrationName); var migrations = migrationRunner.OrderedUpgradeMigrations(foundMigrations).ToList(); var context = new MigrationContext(DatabaseProviders.SqlServerCE, null); foreach (MigrationBase migration in migrations) { migration.GetUpExpressions(context); } foreach (var expression in context.Expressions) { Console.WriteLine(expression.ToString()); } Assert.That(migrations.Count(), Is.EqualTo(12)); }
public void Validate_Data_Upgrade() { var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); ContentTypeRepository contentTypeRepository; var insertedContent = new List<IContent>(); using (var repository = CreateRepository(unitOfWork, out contentTypeRepository)) { //we need to populate some data to upgrade var contentTypeWith1Tag = MockedContentTypes.CreateSimpleContentType( "tags1", "tags1", new PropertyTypeCollection(new[] { new PropertyType("test", DataTypeDatabaseType.Ntext) {Alias = "tags1", Name = "tags1", SortOrder = 1, DataTypeDefinitionId = 1041}, })); var contentTypeWith2Tags = MockedContentTypes.CreateSimpleContentType( "tags2", "tags2", new PropertyTypeCollection(new[] { new PropertyType("test", DataTypeDatabaseType.Ntext) {Alias = "tags1", Name = "tags1", SortOrder = 1, DataTypeDefinitionId = 1041}, new PropertyType("test", DataTypeDatabaseType.Ntext) {Alias = "tags2", Name = "tags2", SortOrder = 1, DataTypeDefinitionId = 1041} })); contentTypeRepository.AddOrUpdate(contentTypeWith1Tag); contentTypeRepository.AddOrUpdate(contentTypeWith2Tags); unitOfWork.Commit(); for (var i = 0; i < 10; i++) { var content = new Content("test" + i, -1, contentTypeWith1Tag) { Language = "en-US", CreatorId = 0, WriterId = 0 }; var obj = new { tags1 = "tag1,tag2,tag3,tag4,tag5" }; content.PropertyValues(obj); content.ResetDirtyProperties(false); insertedContent.Add(content); repository.AddOrUpdate(content); } for (var i = 0; i < 10; i++) { var content = new Content("test-multi" + i, -1, contentTypeWith2Tags) { Language = "en-US", CreatorId = 0, WriterId = 0 }; var obj = new { //NOTE: These will always be the same during an upgrade since we can only support tags per document not per property tags1 = "tag1,tag2,tag3,anothertag1,anothertag2", tags2 = "tag1,tag2,tag3,anothertag1,anothertag2" }; content.PropertyValues(obj); content.ResetDirtyProperties(false); insertedContent.Add(content); repository.AddOrUpdate(content); } unitOfWork.Commit(); } //now that we have to create some test tag data foreach (var tag in "tag1,tag2,tag3,tag4,tag5,anothertag1,anothertag2".Split(',')) { DatabaseContext.Database.Insert(new TagDto {Tag = tag, Group = "default"}); } var alltags = DatabaseContext.Database.Fetch<TagDto>("SELECT * FROM cmsTags").ToArray(); foreach (var content in insertedContent) { if (content.ContentType.Alias == "tags1") { var tags1Tags = alltags.Where(x => "tag1,tag2,tag3,tag4,tag5".Split(',').Contains(x.Tag)); foreach (var t in tags1Tags) { DatabaseContext.Database.Insert(new TagRelationshipDto {NodeId = content.Id, TagId = t.Id}); } } else { var tags1Tags = alltags.Where(x => "tag1,tag2,tag3,anothertag1,anothertag2".Split(',').Contains(x.Tag)); foreach (var t in tags1Tags) { DatabaseContext.Database.Insert(new TagRelationshipDto { NodeId = content.Id, TagId = t.Id }); } } } //lastly, we'll insert a tag relation with a relation to only an umbracoNode - // this will generate a delete clause and a warning DatabaseContext.Database.Insert(new TagRelationshipDto { NodeId = -1, TagId = alltags.First().Id }); var migration = new AlterTagRelationsTable(); var migrationContext = new MigrationContext(DatabaseProviders.SqlServerCE, DatabaseContext.Database); migration.GetUpExpressions(migrationContext); Assert.AreEqual( (10 * 5) //the docs that only have 1 tag prop per document + (10 * 5) //the docs that have 2 tag prop per document - these are the update statements + (10 * 5) //the docs that have 2 tag prop per document - these are the insert statements + 1//the delete clause + 7 , //additional db expressions migrationContext.Expressions.Count); }
public void Validate_AddIndexToCmsMacroPropertyTable() { SqlSyntaxContext.SqlSyntaxProvider = new SqlCeSyntaxProvider(); var migration = new AddIndexToCmsMacroPropertyTable(); var migrationContext = new MigrationContext(DatabaseProviders.SqlServerCE, null); migration.GetUpExpressions(migrationContext); Assert.AreEqual(1, migrationContext.Expressions.Count); var result = migrationContext.Expressions.First().ToString(); Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_cmsMacroProperty_Alias] ON [cmsMacroProperty] ([macro],[macroPropertyAlias])", result); }