예제 #1
0
        private void ApplySchemaChange(string destDB, TableConf table, SchemaChange schemaChange)
        {
            switch (schemaChange.EventType)
            {
            case SchemaChangeType.Rename:
                logger.Log("Renaming column " + schemaChange.ColumnName + " to " + schemaChange.NewColumnName, LogLevel.Info);
                destDataUtils.RenameColumn(table, destDB, schemaChange.ColumnName, schemaChange.NewColumnName, Config.SlaveCTDB);
                break;

            case SchemaChangeType.Modify:
                logger.Log("Changing data type on column " + schemaChange.ColumnName, LogLevel.Info);
                destDataUtils.ModifyColumn(table, destDB, schemaChange.ColumnName, schemaChange.DataType, Config.SlaveCTDB);
                break;

            case SchemaChangeType.Add:
                logger.Log("Adding column " + schemaChange.ColumnName, LogLevel.Info);
                destDataUtils.AddColumn(table, destDB, schemaChange.ColumnName, schemaChange.DataType, Config.SlaveCTDB);
                break;

            case SchemaChangeType.Drop:
                logger.Log("Dropping column " + schemaChange.ColumnName, LogLevel.Info);
                destDataUtils.DropColumn(table, destDB, schemaChange.ColumnName, Config.SlaveCTDB);
                break;
            }
        }
예제 #2
0
        /// <summary>
        /// Initializes static members of the <see cref="DiscoverySchemaChanges"/> class.
        /// </summary>
        static DiscoverySchemaChanges()
        {
            // Schema change for passing extended data with the SearchMailboxes request
            SearchMailboxesExtendedData = new SchemaChange("15.0.730.0");

            // Schema change for additional search scopes such as "AllMailboxes", "PublicFolders", "SearchId" etc with the SearchMailboxes request
            SearchMailboxesAdditionalSearchScopes = new SchemaChange("15.0.730.0");
        }
예제 #3
0
    /// <summary>
    /// Initializes static members of the <see cref="DiscoverySchemaChanges"/> class.
    /// </summary>
    static DiscoverySchemaChanges()
    {
        // Schema change for passing extended data with the SearchMailboxes request
        SearchMailboxesExtendedData = new SchemaChange("15.0.730.0");

        // Schema change for additional search scopes such as "AllMailboxes", "PublicFolders", "SearchId" etc with the SearchMailboxes request
        SearchMailboxesAdditionalSearchScopes = new SchemaChange("15.0.730.0");
    }
예제 #4
0
            public void TestParse_ModifyColumn_WithoutColumnList()
            {
                //changing a column's data type should be published
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType>
                <SchemaName>dbo</SchemaName><ObjectName>test1</ObjectName><ObjectType>TABLE</ObjectType>
                <AlterTableActionList><Alter><Columns><Name>column1</Name></Columns></Alter></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Modify, "dbo", "test1", "column1", null, new DataType("int", null, (byte)10, 0));
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #5
0
            public void TestParse_DropColumn_WithColumnInList()
            {
                //dropping a column with a column list, with the column in the list should be published
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType>
                <SchemaName>dbo</SchemaName><ObjectName>test2</ObjectName><ObjectType>TABLE</ObjectType>
                <AlterTableActionList><Drop><Columns><Name>column1</Name></Columns></Drop></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Drop, "dbo", "test2", "column1", null, null);
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #6
0
            public void TestParse_AddColumn_WithColumnInList()
            {
                //schema change for a column which is in the list, so we should publish it
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><SchemaName>dbo</SchemaName>
                <ObjectName>test2</ObjectName><ObjectType>TABLE</ObjectType><AlterTableActionList>
                <Create><Columns><Name>column2</Name></Columns></Create></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Add, "dbo", "test2", "column2", null, new DataType("datetime", null, null, null));
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #7
0
            public void TestParse_RenameColumn_WithColumnInList()
            {
                //renaming a column when a column list is present in Config. if the column is in the list, it should be published.
                String              xml      = @"<EVENT_INSTANCE><EventType>RENAME</EventType><SchemaName>dbo</SchemaName>
                <ObjectName>column2</ObjectName><ObjectType>COLUMN</ObjectType><TargetObjectName>test2</TargetObjectName>
                <TargetObjectType>TABLE</TargetObjectType><NewObjectName>col2</NewObjectName>
                <Parameters><Param>test2.column2</Param><Param>col2</Param><Param>COLUMN</Param></Parameters></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Rename, "dbo", "test2", "column2", "col2", null);
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #8
0
            public void TestParse_ModifyColumn_CaseSensitivity()
            {
                //same as previous test but with casing on the table name not matching the casing in the dataset.
                //doing this to make sure the case ignoring code works.
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType>
                <SchemaName>dbo</SchemaName><ObjectName>TEST1</ObjectName><ObjectType>TABLE</ObjectType>
                <AlterTableActionList><Alter><Columns><Name>COLUMN1</Name></Columns></Alter></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Modify, "dbo", "TEST1", "COLUMN1", null, new DataType("int", null, (byte)10, 0));
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #9
0
            public void TestParse_AddSingleColumn_WithoutColumnList()
            {
                //add a column and make sure it is published
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><SchemaName>dbo</SchemaName>
                <ObjectName>test1</ObjectName><ObjectType>TABLE</ObjectType><AlterTableActionList>
                <Create><Columns><Name>column1</Name></Columns></Create></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Add, "dbo", "test1", "column1", null, new DataType("int", null, (byte)10, 0));
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                //assert.equal doesn't work for objects but this does
                Assert.True(result[0].Equals(expected));
            }
예제 #10
0
            public void TestParse_AddColumn_WithDefault()
            {
                //adding in a constraint, we should still publish the new column but not the constraint
                String              xml      = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType>
                <SchemaName>dbo</SchemaName><ObjectName>test1</ObjectName><ObjectType>TABLE</ObjectType>
                <AlterTableActionList><Create><Columns><Name>column1</Name></Columns>
                <Constraints><Name>DF_test1_column3</Name></Constraints></Create></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde      = new DDLEvent(100, xml);
                SchemaChange        expected = new SchemaChange(100, SchemaChangeType.Add, "dbo", "test1", "column1", null, new DataType("int", null, (byte)10, 0));
                List <SchemaChange> result   = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected));
            }
예제 #11
0
            public void TestParse_AddMultiColumn_WithoutColumnList()
            {
                //add multiple columns, we should publish each of them
                String              xml       = @"<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><SchemaName>dbo</SchemaName>
                <ObjectName>test1</ObjectName><ObjectType>TABLE</ObjectType><AlterTableActionList>
                <Create><Columns><Name>column1</Name><Name>column2</Name></Columns></Create></AlterTableActionList></EVENT_INSTANCE>";
                DDLEvent            dde       = new DDLEvent(100, xml);
                SchemaChange        expected1 = new SchemaChange(100, SchemaChangeType.Add, "dbo", "test1", "column1", null, new DataType("int", null, (byte)10, 0));
                SchemaChange        expected2 = new SchemaChange(100, SchemaChangeType.Add, "dbo", "test1", "column2", null, new DataType("varchar", 100, null, null));
                List <SchemaChange> result    = dde.Parse(tables, (IDataUtils)dataUtils, "testdb");

                Assert.True(result[0].Equals(expected1));
                Assert.True(result[1].Equals(expected2));
            }
예제 #12
0
        public void TestEquals()
        {
            SchemaChange one = new SchemaChange(1, SchemaChangeType.Add, "sname", "tname", "cname", "ncname");
            SchemaChange two = new SchemaChange(1, SchemaChangeType.Add, "sname", "tname", "cname", "ncname");

            Assert.True(one.Equals(two));

            two = new SchemaChange(1, SchemaChangeType.Drop, "sname", "tname", "cname", "ncname");

            Assert.False(one.Equals(two));
            two = new SchemaChange(1, SchemaChangeType.Add, "asdf", "tname", "cname", "ncname");

            Assert.False(one.Equals(two));
            two = new SchemaChange(1, SchemaChangeType.Add, "sname", "tname", "asdf", "ncname");
            Assert.False(one.Equals(two));
        }
예제 #13
0
        public void TestPublishSchemaChanges()
        {
            //create tblCTSchemaChange_100
            destDataUtils.CreateSchemaChangeTable("CT_testdb", 101);
            //publish schema changes from tblDDLevent
            PublishSchemaChanges(Config.Tables, "testdb", "CT_testdb", 101, new DateTime(2000, 1, 1));
            //retrieve results from tblCTSchemaChange_101
            DataTable results = destDataUtils.GetSchemaChanges("CT_testdb", 101);
            //parse schema change object for the resulting row
            SchemaChange actual = new SchemaChange(results.Rows[0]);
            //it should be equal to this
            SchemaChange expected = new SchemaChange(10, SchemaChangeType.Add, "dbo", "test1", "column2", null, new DataType("varchar", 100, null, null));

            Assert.True(actual.Equals(expected));
            //undo changes
            ((TestDataUtils)destDataUtils).ReloadData("test1");
        }
예제 #14
0
        public void ApplySchemaChanges(string sourceDB, string destDB, Int64 CTID)
        {
            //get list of schema changes from tblCTSChemaChange_ctid on the relay server/db
            DataTable result = sourceDataUtils.GetSchemaChanges(sourceDB, CTID);

            if (result == null)
            {
                return;
            }

            foreach (DataRow row in result.Rows)
            {
                var schemaChange = new SchemaChange(row);
                //String.Compare method returns 0 if the strings are equal
                TableConf table = Config.Tables.SingleOrDefault(item => String.Compare(item.Name, schemaChange.TableName, ignoreCase: true) == 0);

                if (table == null)
                {
                    logger.Log(new { message = "Ignoring schema change for untracked table", Table = schemaChange.TableName }, LogLevel.Debug);
                    continue;
                }

                logger.Log("Processing schema change (CscID: " + row.Field <int>("CscID") +
                           ") of type " + schemaChange.EventType + " for table " + table.Name, LogLevel.Info);

                if (table.ColumnList == null || table.ColumnList.Contains(schemaChange.ColumnName, StringComparer.OrdinalIgnoreCase))
                {
                    logger.Log("Schema change applies to a valid column, so we will apply it", LogLevel.Info);
                    try {
                        ApplySchemaChange(destDB, table, schemaChange);
                    } catch (Exception e) {
                        var wrappedExc = new Exception(schemaChange.ToString(), e);
                        HandleException(wrappedExc, table);
                    }
                }
                else
                {
                    logger.Log("Skipped schema change because the column it impacts is not in our list", LogLevel.Info);
                }
            }
        }
예제 #15
0
        public void WriteSchemaChange(string dbName, Int64 CTID, SchemaChange schemaChange)
        {
            string  schemaChangeTableName = "dbo.tblCTSchemaChange_" + Convert.ToString(CTID);
            DataRow row = testData.Tables[schemaChangeTableName, GetTableSpace(dbName)].NewRow();

            //set its values
            row["CscDdeID"]                  = schemaChange.DdeID;
            row["CscTableName"]              = schemaChange.TableName;
            row["CscEventType"]              = schemaChange.EventType;
            row["CscSchema"]                 = schemaChange.SchemaName;
            row["CscColumnName"]             = schemaChange.ColumnName;
            row["CscNewColumnName"]          = schemaChange.NewColumnName;
            row["CscBaseDataType"]           = schemaChange.DataType.BaseType;
            row["CscCharacterMaximumLength"] = (object)schemaChange.DataType.CharacterMaximumLength ?? DBNull.Value;
            row["CscNumericPrecision"]       = (object)schemaChange.DataType.NumericPrecision ?? DBNull.Value;
            row["CscNumericScale"]           = (object)schemaChange.DataType.NumericScale ?? DBNull.Value;
            //add it to the datatable
            testData.Tables[schemaChangeTableName, GetTableSpace(dbName)].Rows.Add(row);
            //commit the change
            //testData.Tables[schemaChangeTableName].AcceptChanges();
        }
예제 #16
0
파일: Slave.cs 프로젝트: draco2003/tesla
        public void ApplySchemaChanges(string sourceDB, string destDB, Int64 CTID)
        {
            //get list of schema changes from tblCTSChemaChange_ctid on the relay server/db
            DataTable result = sourceDataUtils.GetSchemaChanges(sourceDB, CTID);

            if (result == null) {
                return;
            }

            foreach (DataRow row in result.Rows) {
                var schemaChange = new SchemaChange(row);
                //String.Compare method returns 0 if the strings are equal
                TableConf table = Config.Tables.SingleOrDefault(item => String.Compare(item.Name, schemaChange.TableName, ignoreCase: true) == 0);

                if (table == null) {
                    logger.Log(new { message = "Ignoring schema change for untracked table", Table = schemaChange.TableName }, LogLevel.Debug);
                    continue;
                }

                logger.Log("Processing schema change (CscID: " + row.Field<int>("CscID") +
                    ") of type " + schemaChange.EventType + " for table " + table.Name, LogLevel.Info);

                if (table.ColumnList == null || table.ColumnList.Contains(schemaChange.ColumnName, StringComparer.OrdinalIgnoreCase)) {
                    logger.Log("Schema change applies to a valid column, so we will apply it", LogLevel.Info);
                    try {
                        ApplySchemaChange(destDB, table, schemaChange);
                    } catch (Exception e) {
                        var wrappedExc = new Exception(schemaChange.ToString(), e);
                        HandleException(wrappedExc, table);
                    }
                } else {
                    logger.Log("Skipped schema change because the column it impacts is not in our list", LogLevel.Info);
                }

            }
        }
예제 #17
0
 public static SchemaChange CreateSchemaChange(int schemaChangeId, int majorReleaseNumber, int minorReleaseNumber, int pointReleaseNumber, string scriptName, global::System.DateTime dateAppliedUtc)
 {
     SchemaChange schemaChange = new SchemaChange();
     schemaChange.SchemaChangeId = schemaChangeId;
     schemaChange.MajorReleaseNumber = majorReleaseNumber;
     schemaChange.MinorReleaseNumber = minorReleaseNumber;
     schemaChange.PointReleaseNumber = pointReleaseNumber;
     schemaChange.ScriptName = scriptName;
     schemaChange.DateAppliedUtc = dateAppliedUtc;
     return schemaChange;
 }
예제 #18
0
 public void AddToSchemaChanges(SchemaChange schemaChange)
 {
     base.AddObject("SchemaChanges", schemaChange);
 }
예제 #19
0
        private SchemaChange RunSingleScript(UpdateScript script)
        {
            var schemaScript = BuildSchemaFromFile(script);

            if (schemaScript == null)
            {
                schemaScript              = new SchemaChange();
                schemaScript.Status       = Models.SchemaChange.Status_Failed;
                schemaScript.ScriptErrors = string.Format("The script name {0} was not found. The script did not run.", script.Name);
                return(schemaScript);
            }

            //Fire the Before Event if we are not creating inital schema or database defaults.
            if (!script.Equals(INITIAL_DATABASE_DEFAULTS_FILENAME) && !script.Equals(INITIAL_DATABASE_SCHEMA_FILENAME))
            {
                ScriptRunEventArgs scriptEventArgs = new ScriptRunEventArgs()
                {
                    ScriptName    = script.Name,
                    ScriptVersion = script.Version
                };
                OnBeforeScriptRun(scriptEventArgs);
            }

            using (SqlConnection connection = new SqlConnection(ConnectionString.ConnectionString))
            {
                connection.Open();

                foreach (var item in schemaScript.ScriptLines)
                {
                    schemaScript.Comment = ExtractSingleComment(item, SCRIPT_COMMENT_PREFIX);
                    using (SqlTransaction transaction = connection.BeginTransaction())
                    {
                        try
                        {
                            SqlCommand sqlCommand = new SqlCommand(item, connection);
                            sqlCommand.Connection  = connection;
                            sqlCommand.Transaction = transaction;
                            sqlCommand.ExecuteNonQuery();
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            schemaScript.ScriptErrors = string.Format("Failed Running script {0} with the comment {1}. SQL Syntax is {2}  Error: {3}", schemaScript.ScriptName, schemaScript.Comment, item, ex.Message);

                            //Get out becuase something broke!
                            schemaScript.Status = Models.SchemaChange.Status_Failed;
                            return(schemaScript);
                        }
                    }
                }

                schemaScript.Status = Models.SchemaChange.Status_Success;
                if (schemaScript.LogThisChange)
                {
                    AddSchemaChange(schemaScript);
                }

                //Fire the Before Event if we are not creating inital schema or database defaults.
                if (!script.Equals(INITIAL_DATABASE_DEFAULTS_FILENAME) && !script.Equals(INITIAL_DATABASE_SCHEMA_FILENAME))
                {
                    ScriptRunEventArgs scriptEventArgs = new ScriptRunEventArgs()
                    {
                        ScriptName    = script.Name,
                        ScriptVersion = script.Version
                    };
                    OnAfterScriptRun(scriptEventArgs);
                }

                return(schemaScript);
            }
        }
예제 #20
0
 public void WriteSchemaChange(string dbName, Int64 CTID, SchemaChange schemaChange)
 {
     string schemaChangeTableName = "dbo.tblCTSchemaChange_" + Convert.ToString(CTID);
     DataRow row = testData.Tables[schemaChangeTableName, GetTableSpace(dbName)].NewRow();
     //set its values
     row["CscDdeID"] = schemaChange.DdeID;
     row["CscTableName"] = schemaChange.TableName;
     row["CscEventType"] = schemaChange.EventType;
     row["CscSchema"] = schemaChange.SchemaName;
     row["CscColumnName"] = schemaChange.ColumnName;
     row["CscNewColumnName"] = schemaChange.NewColumnName;
     row["CscBaseDataType"] = schemaChange.DataType.BaseType;
     row["CscCharacterMaximumLength"] = (object)schemaChange.DataType.CharacterMaximumLength ?? DBNull.Value;
     row["CscNumericPrecision"] = (object)schemaChange.DataType.NumericPrecision ?? DBNull.Value;
     row["CscNumericScale"] = (object)schemaChange.DataType.NumericScale ?? DBNull.Value;
     //add it to the datatable
     testData.Tables[schemaChangeTableName, GetTableSpace(dbName)].Rows.Add(row);
     //commit the change
     //testData.Tables[schemaChangeTableName].AcceptChanges();
 }
예제 #21
0
 public void WriteSchemaChange(string dbName, Int64 CTID, SchemaChange schemaChange)
 {
     throw new NotImplementedException("Netezza is only supported as a slave!");
 }
예제 #22
0
 public void WriteSchemaChange(string dbName, Int64 CTID, SchemaChange schemaChange)
 {
     throw new NotImplementedException("Netezza is only supported as a slave!");
 }
예제 #23
0
파일: Slave.cs 프로젝트: draco2003/tesla
 private void ApplySchemaChange(string destDB, TableConf table, SchemaChange schemaChange)
 {
     switch (schemaChange.EventType) {
         case SchemaChangeType.Rename:
             logger.Log("Renaming column " + schemaChange.ColumnName + " to " + schemaChange.NewColumnName, LogLevel.Info);
             destDataUtils.RenameColumn(table, destDB, schemaChange.SchemaName, schemaChange.TableName,
                 schemaChange.ColumnName, schemaChange.NewColumnName);
             break;
         case SchemaChangeType.Modify:
             logger.Log("Changing data type on column " + schemaChange.ColumnName, LogLevel.Info);
             destDataUtils.ModifyColumn(table, destDB, schemaChange.SchemaName, schemaChange.TableName, schemaChange.ColumnName, schemaChange.DataType.ToString());
             break;
         case SchemaChangeType.Add:
             logger.Log("Adding column " + schemaChange.ColumnName, LogLevel.Info);
             destDataUtils.AddColumn(table, destDB, schemaChange.SchemaName, schemaChange.TableName, schemaChange.ColumnName, schemaChange.DataType.ToString());
             break;
         case SchemaChangeType.Drop:
             logger.Log("Dropping column " + schemaChange.ColumnName, LogLevel.Info);
             destDataUtils.DropColumn(table, destDB, schemaChange.SchemaName, schemaChange.TableName, schemaChange.ColumnName);
             break;
     }
 }