Saxonite - various
This commit is contained in:
@@ -19,13 +19,19 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
// Configuration.
|
||||
public new class Config : SacsProcess.Config
|
||||
{
|
||||
public Config (SacsDatabase sourceDatabase, SacsDatabase targetDatabase)
|
||||
public Config(ISacsDatabase sourceDatabase, ISacsDatabase targetDatabase)
|
||||
{
|
||||
SourceDatabase = sourceDatabase;
|
||||
TargetDatabase = targetDatabase;
|
||||
}
|
||||
public SacsDatabase SourceDatabase { get; }
|
||||
public SacsDatabase TargetDatabase { get; }
|
||||
public Config(List<DbDfnTable> sourceTables, ISacsDatabase targetDatabase)
|
||||
{
|
||||
SourceTables = sourceTables;
|
||||
TargetDatabase = targetDatabase;
|
||||
}
|
||||
public ISacsDatabase SourceDatabase { get; }
|
||||
public List<DbDfnTable> SourceTables { get; }
|
||||
public ISacsDatabase TargetDatabase { get; }
|
||||
public bool HideIdenticalObjects { get; set; }
|
||||
public bool IgnoreNullable { get; set; }
|
||||
public bool IgnorePosition { get; set; }
|
||||
@@ -37,11 +43,11 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
// Definitions.
|
||||
public interface IProcessNotifier : ISacsProcessNotifier
|
||||
{
|
||||
void OnSchemaComparisonItemAdded (SaDbProcess_CompareDatabaseSchemas proc);
|
||||
void OnSchemaComparisonItemAdded(SaDbProcess_CompareDatabaseSchemas proc);
|
||||
}
|
||||
public class SchemaComparisonItem
|
||||
{
|
||||
internal SchemaComparisonItem (String tableName, String columnName, int columnPosition, String indexName, String comment)
|
||||
internal SchemaComparisonItem(String tableName, String columnName, int columnPosition, String indexName, String comment)
|
||||
{
|
||||
Id = ++SeedId;
|
||||
TableName = tableName;
|
||||
@@ -67,11 +73,11 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SaDbProcess_CompareDatabaseSchemas (Config config) : base(config)
|
||||
public SaDbProcess_CompareDatabaseSchemas(Config config) : base(config)
|
||||
{
|
||||
this.config = config;
|
||||
}
|
||||
protected override void Dispose (bool disposing)
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
@@ -95,7 +101,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
//-------------------------------------------------------------------
|
||||
// S c h e m a D i f f e r e n c e s
|
||||
//-------------------------------------------------------------------
|
||||
public List<SchemaComparisonItem> GetSchemaComparisonItems (int minId = 0)
|
||||
public List<SchemaComparisonItem> GetSchemaComparisonItems(int minId = 0)
|
||||
{
|
||||
return new List<SchemaComparisonItem>(schemaComparisonItems.FindAll(item => item.Id >= minId));
|
||||
}
|
||||
@@ -103,21 +109,23 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
//-------------------------------------------------------------------
|
||||
// P r o c e s s i n g
|
||||
//-------------------------------------------------------------------
|
||||
protected override bool Run ()
|
||||
protected override bool Run()
|
||||
{
|
||||
schemaComparisonItems.Clear();
|
||||
if (config.SourceDatabase == null) return SetProcessError("Source database must be supplied.");
|
||||
if (config.SourceDatabase == null && config.SourceTables == null) return SetProcessError("Source database must be supplied.");
|
||||
|
||||
CompareTables();
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private void CompareTables ()
|
||||
private void CompareTables()
|
||||
{
|
||||
List<String> sourceTables = config.SourceDatabase.GetTableNames().OrderBy(item => item).ToList();
|
||||
List<String> targetTables = config.TargetDatabase.GetTableNames().OrderBy(item => item).ToList();
|
||||
for (int sourceTableIdx = 0, targetTableIdx = 0; sourceTableIdx <= sourceTables.Count && targetTableIdx <= targetTables.Count;)
|
||||
// Database schemas.
|
||||
List<String> sourceTables = (config.SourceDatabase?.GetTableNames(true) ?? config.SourceTables.Select(item => item.Name)).OrderBy(item => item).ToList();
|
||||
List<String> targetTables = config.TargetDatabase.GetTableNames(true).OrderBy(item => item).ToList();
|
||||
|
||||
for (int sourceTableIdx = 0, targetTableIdx = 0; sourceTableIdx < sourceTables.Count || targetTableIdx < targetTables.Count;)
|
||||
{
|
||||
String sourceTableName = (sourceTableIdx < sourceTables.Count ? sourceTables[sourceTableIdx] : "");
|
||||
String targetTableName = (targetTableIdx < targetTables.Count ? targetTables[targetTableIdx] : "");
|
||||
@@ -143,8 +151,8 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
Debugger.Break();
|
||||
#endif
|
||||
// Retrieve table definition from each database.
|
||||
DbDfnTable sourceTableDfn = config.SourceDatabase.GetTableDfn (sourceTableName);
|
||||
DbDfnTable targetTableDfn = config.TargetDatabase.GetTableDfn (targetTableName);
|
||||
DbDfnTable sourceTableDfn = config.SourceDatabase?.GetTableDfn(sourceTableName, true) ?? config.SourceTables.GetTableByName(sourceTableName);
|
||||
DbDfnTable targetTableDfn = config.TargetDatabase.GetTableDfn(targetTableName, true);
|
||||
// Compare the columns and indices.
|
||||
CompareTableColumns(sourceTableDfn, targetTableDfn);
|
||||
CompareTableIndices(sourceTableDfn, targetTableDfn);
|
||||
@@ -155,7 +163,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private bool CompareTableColumns (DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn)
|
||||
private bool CompareTableColumns(DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn)
|
||||
{
|
||||
String tableName = sourceTableDfn.Name;
|
||||
#if DEBUG_X
|
||||
@@ -177,7 +185,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
String sourceColumnName = sourceColumnIdx < sourceColumnNames.Count() ? sourceColumnNames[sourceColumnIdx] : "";
|
||||
String targetColumnName = targetColumnIdx < targetColumnNames.Count() ? targetColumnNames[targetColumnIdx] : "";
|
||||
// Retrieve Column definition from each database.
|
||||
DbDfnColumn sourceColumn = sourceColumns.GetColumnByName (sourceColumnName);
|
||||
DbDfnColumn sourceColumn = sourceColumns.GetColumnByName(sourceColumnName);
|
||||
if (sourceColumn != null) iPosition = sourceColumn.Pos;
|
||||
DbDfnColumn targetColumn = targetColumns.GetColumnByName(targetColumnName);
|
||||
// Compare Columns.
|
||||
@@ -225,7 +233,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
return OK;
|
||||
}
|
||||
private static long iLargeSizeThreshold = 4000;
|
||||
private bool ColumnSizesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
private bool ColumnSizesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
{
|
||||
if (sourceColumn.Size == targetColumn.Size) return false;
|
||||
// If both columns are large, treat then as equal:
|
||||
@@ -240,33 +248,33 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
if (config.IgnoreSimilarNumericTypes)
|
||||
{
|
||||
// Floating point types.
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric",",");
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric", ",");
|
||||
if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false;
|
||||
}
|
||||
// DateTimes:
|
||||
List<String> dateTimeTypes = StringListUtil.Split("DateTime",",");
|
||||
List<String> dateTimeTypes = StringListUtil.Split("DateTime", ",");
|
||||
if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ColumnDecimalsDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
private bool ColumnDecimalsDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
{
|
||||
if (sourceColumn.DecimalDigits == targetColumn.DecimalDigits) return false;
|
||||
// Check for specific data types:
|
||||
String sourceDataType = sourceColumn.DataTypeNameNative;
|
||||
String targetDataType = targetColumn.DataTypeNameNative;
|
||||
// Numeric types - float/double columns report decimals as 0.
|
||||
List<String> floatTypes = StringListUtil.Split("Real,Float,Double",",");
|
||||
List<String> decimalTypes = StringListUtil.Split("Decimal,Numeric",",");
|
||||
List<String> floatTypes = StringListUtil.Split("Real,Float,Double", ",");
|
||||
List<String> decimalTypes = StringListUtil.Split("Decimal,Numeric", ",");
|
||||
if (sourceColumn.DecimalDigits == 0 && floatTypes.ContainsCI(sourceDataType) && targetColumn.DecimalDigits > 0 && decimalTypes.ContainsCI(targetDataType)) return false;
|
||||
if (sourceColumn.DecimalDigits > 0 && decimalTypes.ContainsCI(sourceDataType) && targetColumn.DecimalDigits == 0 && floatTypes.ContainsCI(targetDataType)) return false;
|
||||
// DateTimes:
|
||||
List<String> dateTimeTypes = StringListUtil.Split("DateTime",",");
|
||||
List<String> dateTimeTypes = StringListUtil.Split("DateTime", ",");
|
||||
if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ColumnDataTypesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
private bool ColumnDataTypesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
{
|
||||
if (sourceColumn.DataType == targetColumn.DataType) return false;
|
||||
|
||||
@@ -279,13 +287,13 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
if (config.IgnoreSimilarNumericTypes)
|
||||
{
|
||||
// Similar numeric type.
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric",",");
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric", ",");
|
||||
if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ColumnNativeDataTypesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
private bool ColumnNativeDataTypesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
|
||||
{
|
||||
if (sourceColumn.DataTypeNative == targetColumn.DataTypeNative) return false;
|
||||
|
||||
@@ -295,20 +303,20 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
if (config.IgnoreSimilarCharTypes)
|
||||
{
|
||||
// Similar Char types.
|
||||
List<String> varCharTypes = StringListUtil.Split("VarChar,LongVarChar,LongChar,NVarChar,VarWChar",",");
|
||||
List<String> varCharTypes = StringListUtil.Split("VarChar,LongVarChar,LongChar,NVarChar,VarWChar", ",");
|
||||
if (varCharTypes.ContainsCI(sourceDataType) && varCharTypes.ContainsCI(targetDataType)) return false;
|
||||
}
|
||||
if (config.IgnoreSimilarNumericTypes)
|
||||
{
|
||||
// Similar numeric types.
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Numeric,Decimal",",");
|
||||
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Numeric,Decimal", ",");
|
||||
if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private bool CompareTableIndices (DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn)
|
||||
private bool CompareTableIndices(DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn)
|
||||
{
|
||||
String sTable = sourceTableDfn.Name;
|
||||
|
||||
@@ -317,7 +325,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
List<DbDfnIndex> targetIndices = targetTableDfn.Indices;
|
||||
List<String> sourceIndexNames = sourceIndices.GetNames().OrderBy(item => item).ToList();
|
||||
List<String> targetIndexNames = targetIndices.GetNames().OrderBy(item => item).ToList();
|
||||
for (int sourceIndexIdx = 0, targetIndexIdx = 0; OK && sourceIndexIdx < sourceIndexNames.Count && targetIndexIdx < targetIndexNames.Count; )
|
||||
for (int sourceIndexIdx = 0, targetIndexIdx = 0; OK && sourceIndexIdx < sourceIndexNames.Count && targetIndexIdx < targetIndexNames.Count;)
|
||||
{
|
||||
// Retrieve the Index names.
|
||||
String sourceIndexName = sourceIndexIdx < sourceIndexNames.Count ? sourceIndexNames[sourceIndexIdx] : "";
|
||||
@@ -382,7 +390,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private void AddSchemaComparisonItem (String tableName, String columnName, int position, String indexName, String comment)
|
||||
private void AddSchemaComparisonItem(String tableName, String columnName, int position, String indexName, String comment)
|
||||
{
|
||||
schemaComparisonItems.Add(new SchemaComparisonItem(tableName, columnName, position, indexName, comment));
|
||||
if (ProcessNotifier != null) ProcessNotifier.OnSchemaComparisonItemAdded(this);
|
||||
@@ -395,7 +403,7 @@ namespace Sarand.Net.Standard.Dbas.Proc
|
||||
public static class SchemaComparisonItemList
|
||||
{
|
||||
/// <summary>Identify the maximum Id value in the list.</summary>
|
||||
public static int GetMaxId (this IEnumerable<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> values)
|
||||
public static int GetMaxId(this IEnumerable<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> values)
|
||||
{
|
||||
int maxId = 0;
|
||||
foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in values)
|
||||
|
||||
Reference in New Issue
Block a user