void CommitVersion() { // make sure everything is saved if (_isDirty) { SaveProject(); } CommitRevsionArgs args = new CommitRevsionArgs() { RevisionId = _currentRevision.RevisionId, ExcuteMigration = true }; CommitRevision rev = new CommitRevision(args); if (rev.ShowDialog() == DialogResult.OK) { var logic = new RevisionLogic(GlobalData.AppInfo); logic.CommitRevision(args); // reload the entire project OpenProject(_project.ProjectId); } }
public CommitRevision(CommitRevsionArgs args) { InitializeComponent(); _args = args; }
public string ExecuteRevision(CommitRevsionArgs args) { string tableUpScript = string.Empty; string tableDownScript = string.Empty; string delColUpScript = string.Empty; string delColDownScript = string.Empty; string newColUpScript = string.Empty; string newColDownScript = string.Empty; string fkUpScript = string.Empty; string fkDownScript = string.Empty; int changeCount = 0; // find the database project path databaseProjPath = args.Revision.Project.ProjectPaths.Where(p => p.CodeProjectTypeCode == CodeProjectTypes.DB).First().Path; // first create script for each entity revision foreach (var eRev in args.Revision.EntityChanges) { if (eRev.ChangeTypeCode == EntityChangeTypes.Add) { // find the entity var entity = args.Revision.Project.Entities.Where(e => e.EntityId == eRev.EntityId).First(); string addScript = GenerateCreateTableScript(entity); if (tableUpScript != string.Empty) { tableUpScript += "\n\n"; } tableUpScript += addScript; // now put in the drop script if (tableDownScript != string.Empty) { tableDownScript += "\n\n"; } tableDownScript += $"DROP TABLE [{entity.EntityName}];"; changeCount++; } } // look for deleted columns var delCols = args.Revision.FieldChanges.Where(fc => fc.FieldChangeTypeCode == FieldChangeTypes.Deleted).ToList(); if (delCols.Count > 0) { string delColPartOne = string.Empty; string delColPartOneDown = string.Empty; string delColPartTwo = string.Empty; string delColPartTwoDown = string.Empty; foreach (var fc in delCols) { string entityName = fc.EntityField.Entity.EntityName; delColPartTwo += GenerateDropColumnScript(entityName, fc.EntityField); // see if this column has any keys if (fc.EntityField.ParentLinks.Count > 0) { // drop all of these links foreach (var link in fc.EntityField.ParentLinks) { delColPartOne = GenerateForeignKeyRollbackScript(link); delColPartTwoDown = GenerateForeignKeyScript(link); } } if (fc.EntityField.ChildLinks.Count > 0) { // drop all of these links foreach (var link in fc.EntityField.ChildLinks) { delColPartOne = GenerateForeignKeyRollbackScript(link); delColPartTwoDown = GenerateForeignKeyScript(link); } } changeCount++; } // create the entire down (re-create columns) script delColPartOneDown = GenerateFullNewColumnsScript(delCols); delColUpScript = GetWithLFIfNotNull(delColPartOne); delColUpScript += GetWithLFIfNotNull(delColPartTwo); delColDownScript = GetWithLFIfNotNull(delColPartOneDown); delColDownScript += GetWithLFIfNotNull(delColPartTwoDown); } // look for new columns var newCols = args.Revision.FieldChanges.Where(fc => fc.FieldChangeTypeCode == FieldChangeTypes.Add).ToList(); if (newCols.Count > 0) { // create the new column up script newColUpScript = GenerateFullNewColumnsScript(newCols); // add to the down script newCols.ForEach(c => newColDownScript += GenerateDropColumnScript(c.EntityField.Entity.EntityName, c.EntityField)); changeCount += newCols.Count; } // look for new relationships foreach (var lRev in args.Revision.LinkChanges) { if (lRev.ChangeTypeCode == LinkChangeTypes.Add) { fkUpScript += GenerateForeignKeyScript(lRev.EntityLink); fkDownScript += GenerateForeignKeyRollbackScript(lRev.EntityLink); changeCount++; } } if (changeCount > 0) { // see if this revision already has script created string fileName = args.Revision.ScriptFilename; if (string.IsNullOrEmpty(args.Revision.ScriptFilename)) { fileName = GenerateMigrationScript(args.Revision.Project, args.Revision); } string migrationScript = tableUpScript; migrationScript += delColUpScript; migrationScript += newColUpScript; migrationScript += fkUpScript; // add the down portion migrationScript += "\n-- //@UNDO\n"; migrationScript += fkDownScript; migrationScript += newColDownScript; migrationScript += delColDownScript; migrationScript += tableDownScript; // write and execute the script string scriptPath = Path.Combine(databaseProjPath, "Scripts", fileName); File.WriteAllText(scriptPath, migrationScript); // determine if the script should be excecuted if (args.ExcuteMigration) { ExecuteMigrateUp(args.Revision.Project); } return(fileName); } return(string.Empty); }