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);
}
}