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);
            }
        }
Exemple #2
0
 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);
        }