private void CompareDbTables()

in src/PDWScripter/PDWscripter.cs [255:372]


        private void CompareDbTables(StreamWriter sw, PDWscripter cSource, PDWscripter cTarget, Boolean SourceFromFile, FilterSettings FilterSet)
        {

            if (SourceFromFile)
            {
                cSource.dbTables = new List<TableDef>();
                foreach (TableSt tbl in cSource.dbstruct.tables)
                {
                    cSource.dbTables.Add(new TableDef(tbl.name, tbl.schema, tbl.distribution_policy));
                }

                cTarget.dbTables = new List<TableDef>();
                foreach (TableSt tbl in cTarget.dbstruct.tables)
                {
                    cTarget.dbTables.Add(new TableDef(tbl.name, tbl.schema, tbl.distribution_policy));
                }

            }

            // COMPARE
            List<TableDef> ListdbTablesToCreate;
            List<TableDef> ListTablesToDelete = new List<TableDef>();
            List<TableDef> ListTablesToBeAlter;

            List<TableDef> ListdbTablesSourceFiltered;
            List<TableDef> ListdbTablesTargetFiltered;


            switch (FilterSet.Granularity.ToUpper())
            {
                case "SCHEMA":

                    ListdbTablesSourceFiltered = cSource.dbTables.FindAll(delegate (TableDef tdef) { return FilterSet.GetSchemas().Contains(tdef.schema); });
                    ListdbTablesTargetFiltered = cTarget.dbTables.FindAll(delegate (TableDef tdef) { return FilterSet.GetSchemas().Contains(tdef.schema); });

                    ListdbTablesToCreate = ListdbTablesSourceFiltered.Except(ListdbTablesTargetFiltered).ToList();
                    ListTablesToDelete = ListdbTablesTargetFiltered.Except(ListdbTablesSourceFiltered).ToList();
                    ListTablesToBeAlter = ListdbTablesSourceFiltered.Intersect(ListdbTablesTargetFiltered).ToList();
                    break;

                case "OBJECTS":


                    ListdbTablesSourceFiltered = cSource.dbTables.FindAll(delegate (TableDef Table) { return FilterSet.GetSchemaNameObjects().Contains(Table.name); });
                    ListdbTablesTargetFiltered = cTarget.dbTables.FindAll(delegate (TableDef Table) { return FilterSet.GetSchemaNameObjects().Contains(Table.name); });

                    ListdbTablesToCreate = ListdbTablesSourceFiltered.Except(ListdbTablesTargetFiltered).ToList();
                    ListTablesToBeAlter = ListdbTablesSourceFiltered.Intersect(ListdbTablesTargetFiltered).ToList();

                    break;

                default:
                    ListdbTablesToCreate = cSource.dbTables.Except(cTarget.dbTables).ToList();
                    ListTablesToDelete = cTarget.dbTables.Except(cSource.dbTables).ToList();
                    ListTablesToBeAlter = cSource.dbTables.Intersect(cTarget.dbTables).ToList();
                    break;
            }


            bool bWarning = false;
            string description = "/*####################################################################################################################################################*/\r\n";
            description += "--tables - to create = " + ListdbTablesToCreate.Count.ToString() + " - to delete = " + ListTablesToDelete.Count.ToString() + " - to compare = " + ListTablesToBeAlter.Count.ToString() + "\r\n";
            description += "PRINT 'tables creation'\r\n";
            sw.WriteLine(description);
            if (ListTablesToDelete.Count > 0)
                writeWarningtxt(description);

            // ==> To Delete
            foreach (TableDef t in ListTablesToDelete)
            {
                cTarget.sourceTable = t.name;
                cTarget.destTable = t.name;

                // case distribution change then add to alter list
                if (cSource.dbTables.Exists(x => x.name == t.name))
                {
                    ListTablesToBeAlter.Insert(0, t);
                }
                else
                {

                    bWarning = true;
                    cTarget.compBuildDropTableText(sw, bWarning);
                }
            }

            // ==> To Create
            foreach (TableDef t in ListdbTablesToCreate)
            {
                // case distribution change 
                if (!cTarget.dbTables.Exists(x => x.name == t.name))
                {
                    cSource.sourceTable = t.name;
                    cSource.destTable = t.name;
                    cSource.distribution_policy = t.distribution_policy;
                    cSource.getSourceColumns(false, SourceFromFile);
                    cSource.getClusteredIndex(false, SourceFromFile);
                    cSource.getPartitioning(false, SourceFromFile);
                    cSource.getNonclusteredIndexes(false, SourceFromFile);
                    cSource.getStats(false, SourceFromFile);



                    cSource.buildCreateTableText(sw, cTarget.destDb, false);
                }
            }


            // ==> To ALTER
            foreach (TableDef t in ListTablesToBeAlter)
            {

                cSource.buildAlterTableText(sw, cSource, cTarget, t, SourceFromFile);
            }



        }