public void Modified()
        {
            IColumn column = GetColumn();
            IMergeOperation<IColumn> op = new ColumnChangeOperation(column, new Column("Column0011"));

            string actual = op.ToString();
            StringAssert.Contains("Column0011", actual);
            StringAssert.Contains("Changed", actual);
        }
Ejemplo n.º 2
0
        public void Modified()
        {
            IColumn column = GetColumn();
            IMergeOperation <IColumn> op = new ColumnChangeOperation(column, new Column("Column0011"));

            string actual = op.ToString();

            StringAssert.Contains("Column0011", actual);
            StringAssert.Contains("Changed", actual);
        }
Ejemplo n.º 3
0
            public void The_Original_Column_Should_Be_Modified()
            {
                var db1 = TestDatabaseLoader.TestDatabase();

                IColumn originalColumn = db1.Tables[0].Columns[2];
                IColumn newColumn      = originalColumn.Clone();

                newColumn.Datatype = "some datatype";
                ColumnChangeOperation op = new ColumnChangeOperation(db1.Tables[0].Columns[2], newColumn);

                op.RunOperation();

                Assert.That(db1.Tables[0].Columns, Has.Count(3));
                Assert.That(db1.Tables[0].Columns[2], Is.SameAs(originalColumn), "Column object should still be the same");
                Assert.That(db1.Tables[0].Columns[2].Datatype, Is.EqualTo("some datatype"));
            }
Ejemplo n.º 4
0
        private ArchAngel.Interfaces.Scripting.DatabaseChanges.IDatabase FillScriptModel(string databaseName)
        {
            ArchAngel.Interfaces.Scripting.DatabaseChanges.IDatabase database = new Interfaces.Scripting.DatabaseChanges.IDatabase(databaseName)
            {
                //DatabaseType = (Interfaces.ProjectOptions.TypeMappings.Utility.DatabaseTypes)Enum.Parse(typeof(Interfaces.ProjectOptions.TypeMappings.Utility.DatabaseTypes), )
                DatabaseType = Interfaces.ProjectOptions.TypeMappings.Utility.DatabaseTypes.SqlServer
            };
            //database.

            List <ITwoStepMergeOperation> twoStepOps      = new List <ITwoStepMergeOperation>();
            List <TableRemovalOperation>  addedTableOps   = new List <TableRemovalOperation>();
            List <TableAdditionOperation> removedTableOps = new List <TableAdditionOperation>();
            Dictionary <ITable, object>   changedTableOps = new Dictionary <ITable, object>();

            List <IMergeOperation <IColumn> >      changedColumnOps       = new List <IMergeOperation <IColumn> >();
            List <IMergeOperation <IIndex> >       changedIndexOps        = new List <IMergeOperation <IIndex> >();
            List <IMergeOperation <IKey> >         changedKeyOps          = new List <IMergeOperation <IKey> >();
            List <IMergeOperation <Relationship> > changedRelationshipOps = new List <IMergeOperation <Relationship> >();

            foreach (Node node in nodeNewEntities.Nodes)
            {
                if (node.Checked)
                {
                    addedTableOps.Add((TableRemovalOperation)node.Tag);
                }
            }

            foreach (Node node in nodeRemovedEntities.Nodes)
            {
                if (node.Checked)
                {
                    removedTableOps.Add((TableAdditionOperation)node.Tag);
                }
            }

            foreach (Node node in nodeModifiedEntities.Nodes)
            {
                if (node.Checked)
                {
                    foreach (Node childNode in node.Nodes)
                    {
                        if (childNode.Tag is ColumnAdditionOperation ||
                            childNode.Tag is ColumnChangeOperation ||
                            childNode.Tag is ColumnRemovalOperation)
                        {
                            changedColumnOps.Add((IMergeOperation <IColumn>)childNode.Tag);
                        }
                        else if (childNode.Tag is IndexAdditionOperation ||
                                 childNode.Tag is IndexChangeOperation ||
                                 childNode.Tag is IndexRemovalOperation)
                        {
                            changedIndexOps.Add((IMergeOperation <IIndex>)childNode.Tag);
                        }
                        else if (childNode.Tag is KeyAdditionOperation ||
                                 childNode.Tag is KeyChangeOperation ||
                                 childNode.Tag is KeyRemovalOperation)
                        {
                            changedKeyOps.Add((IMergeOperation <IKey>)childNode.Tag);
                        }
                        else if (childNode.Tag is RelationshipAdditionOperation ||
                                 childNode.Tag is RelationshipChangeOperation ||
                                 childNode.Tag is RelationshipRemovalOperation)
                        {
                            changedRelationshipOps.Add((IMergeOperation <Relationship>)childNode.Tag);
                        }
                        else
                        {
                            throw new NotImplementedException("Modification type not handled yet: " + childNode.Tag.GetType().Name);
                        }
                    }
                    //changedTableOps.Add((TableChangeOperation)node.Tag);
                }
            }

            #region Added Tables

            foreach (var op in addedTableOps)
            {
                ITable oldTable = op.Object;

                ArchAngel.Interfaces.Scripting.NHibernate.Model.ITable newTable = new Interfaces.Scripting.NHibernate.Model.ITable(databaseName)
                {
                    Name   = oldTable.Name,
                    Schema = oldTable.Schema
                };
                database.NewTables.Add(newTable);

                foreach (IColumn oldColumn in oldTable.Columns)
                {
                    newTable.Columns.Add(ConvertColumn(oldColumn));
                }

                foreach (IIndex oldIndex in oldTable.Indexes)
                {
                    ArchAngel.Interfaces.Scripting.NHibernate.Model.IIndex newIndex = new Interfaces.Scripting.NHibernate.Model.IIndex()
                    {
                    };
                    newTable.Indexes.Add(newIndex);
                }
                foreach (IKey oldKey in oldTable.ForeignKeys)
                {
                    ArchAngel.Interfaces.Scripting.NHibernate.Model.IKey newKey = new Interfaces.Scripting.NHibernate.Model.IKey()
                    {
                        Name = oldKey.Name
                    };
                    foreach (IColumn oldColumn in oldKey.Columns)
                    {
                        newKey.Columns.Add(ConvertColumn(oldColumn));
                    }

                    newTable.ForeignKeys.Add(newKey);
                }
                if (oldTable.FirstPrimaryKey != null)
                {
                    newTable.PrimaryKey = new Interfaces.Scripting.NHibernate.Model.IKey()
                    {
                        Name = oldTable.FirstPrimaryKey.Name
                    };
                    foreach (IColumn oldColumn in oldTable.FirstPrimaryKey.Columns)
                    {
                        newTable.PrimaryKey.Columns.Add(ConvertColumn(oldColumn));
                    }
                }
            }
            #endregion

            #region Removed Tables
            foreach (var op in removedTableOps)
            {
                ITable oldTable = op.Object;

                ArchAngel.Interfaces.Scripting.NHibernate.Model.ITable newTable = new Interfaces.Scripting.NHibernate.Model.ITable(databaseName)
                {
                    Name   = oldTable.Name,
                    Schema = oldTable.Schema
                };
                database.RemovedTables.Add(newTable);
            }
            #endregion

            #region New, Changed, Removed columns

            foreach (var op in changedColumnOps)
            {
                IColumn oldColumn = op.Object;
                ArchAngel.Interfaces.Scripting.DatabaseChanges.IChangedTable table = GetChangedTable(database, oldColumn.Parent);

                if (op is ColumnAdditionOperation)
                {
                    table.RemovedColumns.Add(ConvertColumn(oldColumn));
                }
                else if (op is ColumnChangeOperation)
                {
                    ColumnChangeOperation changeOp = (ColumnChangeOperation)op;
                    ArchAngel.Interfaces.Scripting.DatabaseChanges.IChangedColumn changedColumn = new Interfaces.Scripting.DatabaseChanges.IChangedColumn();
                    //changeOp.
                    IColumn chColumn = (IColumn)changeOp.Object;
                    changedColumn.OldName   = oldColumn.Name;
                    changedColumn.NewName   = chColumn.Name;
                    changedColumn.NewType   = chColumn.OriginalDataType;
                    changedColumn.NewLength = chColumn.Size;

                    table.ChangedColumns.Add(changedColumn);
                }
                else if (op is ColumnRemovalOperation)
                {
                    table.NewColumns.Add(ConvertColumn(oldColumn));
                }
            }
            #endregion

            #region New, Changed, Removed indexes

            foreach (var op in changedIndexOps)
            {
                IIndex oldIndex = op.Object;
                ArchAngel.Interfaces.Scripting.DatabaseChanges.IChangedTable table    = GetChangedTable(database, oldIndex.Parent);
                ArchAngel.Interfaces.Scripting.NHibernate.Model.IIndex       newIndex = new Interfaces.Scripting.NHibernate.Model.IIndex()
                {
                    Name = oldIndex.Name
                };

                if (op is IndexAdditionOperation)
                {
                    foreach (IColumn oldColumn in oldIndex.Columns)
                    {
                        newIndex.Columns.Add(ConvertColumn(oldColumn));
                    }

                    table.RemovedIndexes.Add(newIndex);
                }
                else if (op is IndexChangeOperation)
                {
                    table.ChangedIndexes.Add(newIndex);
                }
                else if (op is IndexRemovalOperation)
                {
                    table.NewIndexes.Add(newIndex);
                }
            }
            #endregion

            #region New, Changed, Removed keys

            foreach (var op in changedKeyOps)
            {
                IKey oldKey = op.Object;
                ArchAngel.Interfaces.Scripting.DatabaseChanges.IChangedTable table  = GetChangedTable(database, oldKey.Parent);
                ArchAngel.Interfaces.Scripting.NHibernate.Model.IKey         newKey = new Interfaces.Scripting.NHibernate.Model.IKey()
                {
                    Name        = oldKey.Name,
                    TableName   = oldKey.Parent.Name,
                    TableSchema = oldKey.Parent.Schema
                };
                newKey.KeyType = (Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes)Enum.Parse(typeof(Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes), oldKey.Keytype.ToString());

                foreach (IColumn oldColumn in oldKey.Columns)
                {
                    newKey.Columns.Add(ConvertColumn(oldColumn));
                }

                if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Foreign)
                {
                    ArchAngel.Interfaces.Scripting.DatabaseChanges.IChangedTable primaryTable  = GetChangedTable(database, oldKey.ReferencedKey.Parent);
                    ArchAngel.Interfaces.Scripting.NHibernate.Model.IKey         newPrimaryKey = new Interfaces.Scripting.NHibernate.Model.IKey()
                    {
                        Name        = oldKey.ReferencedKey.Name,
                        TableSchema = oldKey.ReferencedKey.Parent.Schema,
                        TableName   = oldKey.ReferencedKey.Parent.Name
                    };
                    newPrimaryKey.KeyType = (Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes)Enum.Parse(typeof(Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes), oldKey.ReferencedKey.Keytype.ToString());

                    foreach (IColumn oldColumn in oldKey.ReferencedKey.Columns)
                    {
                        newPrimaryKey.Columns.Add(ConvertColumn(oldColumn));
                    }

                    newKey.ReferencedPrimaryKey = newPrimaryKey;
                }

                if (op is KeyAdditionOperation)
                {
                    if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Foreign)
                    {
                        table.RemovedForeignKeys.Add(newKey);
                    }
                    else if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Primary)
                    {
                        table.RemovedPrimaryKeys.Add(newKey);
                    }
                    else
                    {
                        throw new NotImplementedException("KeyType not handled yet: " + newKey.KeyType.ToString());
                    }
                }
                else if (op is KeyChangeOperation)
                {
                    if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Foreign)
                    {
                        table.ChangedForeignKeys.Add(newKey);
                    }
                    else if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Primary)
                    {
                        table.ChangedPrimaryKeys.Add(newKey);
                    }
                    else
                    {
                        throw new NotImplementedException("KeyType not handled yet: " + newKey.KeyType.ToString());
                    }
                }
                else if (op is KeyRemovalOperation)
                {
                    if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Foreign)
                    {
                        table.NewForeignKeys.Add(newKey);
                    }
                    else if (newKey.KeyType == Interfaces.Scripting.NHibernate.Model.IKey.KeyTypes.Primary)
                    {
                        table.NewPrimaryKeys.Add(newKey);
                    }
                    else
                    {
                        throw new NotImplementedException("KeyType not handled yet: " + newKey.KeyType.ToString());
                    }
                }
            }
            #endregion

            // Clean-up non-changed tables
            database.ChangedTables = database.ChangedTables.Where(t => t.CountOfChanges > 0).ToList();
            return(database);
        }
            public void The_Original_Column_Should_Be_Modified()
            {
                var db1 = TestDatabaseLoader.TestDatabase();

                IColumn originalColumn = db1.Tables[0].Columns[2];
                IColumn newColumn = originalColumn.Clone();
                newColumn.Datatype = "some datatype";
                ColumnChangeOperation op = new ColumnChangeOperation(db1.Tables[0].Columns[2], newColumn);
                op.RunOperation();

                Assert.That(db1.Tables[0].Columns, Has.Count(3));
                Assert.That(db1.Tables[0].Columns[2], Is.SameAs(originalColumn), "Column object should still be the same");
                Assert.That(db1.Tables[0].Columns[2].Datatype, Is.EqualTo("some datatype"));
            }