* Diff domains and sequences

git-svn-id: trunk@11609 -
This commit is contained in:
michael 2008-08-18 10:05:52 +00:00
parent 6a5954201d
commit cbdd282f19
3 changed files with 157 additions and 48 deletions

View File

@ -24,7 +24,7 @@
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local> </local>
</RunParams> </RunParams>
<Units Count="13"> <Units Count="14">
<Unit0> <Unit0>
<Filename Value="buildd.lpr"/> <Filename Value="buildd.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@ -90,6 +90,11 @@
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="fpddregstd"/> <UnitName Value="fpddregstd"/>
</Unit12> </Unit12>
<Unit13>
<Filename Value="fpdddiff.pp"/>
<IsPartOfProject Value="True"/>
<UnitName Value="fpdddiff"/>
</Unit13>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -5,7 +5,7 @@ uses
Classes Classes
{ you can add units after this }, fpddsqldb, fpdatadict, fpdddbf, fpddfb, { you can add units after this }, fpddsqldb, fpdatadict, fpdddbf, fpddfb,
fpddmysql40, fpddmysql41, fpddmysql50, fpddpq, fpddodbc, fpddoracle, fpddmysql40, fpddmysql41, fpddmysql50, fpddpq, fpddodbc, fpddoracle,
fpddsqlite3, fpddregstd; fpddsqlite3, fpddregstd, fpdddiff;
begin begin
end. end.

View File

@ -23,13 +23,13 @@ uses
type type
TDiffKind = (DiffTables, DiffFields, DiffIndexes); TDiffKind = (DiffTables, DiffFields, DiffIndexes, DiffSequences, DiffDomains);
TDiffKindSet = set of TDiffKind; TDiffKindSet = set of TDiffKind;
TDifferenceType = (dtMissing, dtDifferent, dtSurplus); TDifferenceType = (dtMissing, dtDifferent, dtSurplus);
const const
diffAll = [DiffTables, DiffFields, DiffIndexes]; diffAll = [DiffTables, DiffFields, DiffIndexes, DiffSequences, DiffDomains];
type type
@ -40,6 +40,8 @@ type
FSourceDD: TFPdatadictionary; FSourceDD: TFPdatadictionary;
FTargetDD: TFPdatadictionary; FTargetDD: TFPdatadictionary;
protected protected
procedure DomainDifference (DiffType: TDifferenceType; SourceDomain, TargetDomain: TDDDomainDef); virtual;
procedure SequenceDifference (DiffType: TDifferenceType; SourceSequence, TargetSequence: TDDSequenceDef); virtual;
procedure TableDifference (DiffType: TDifferenceType; SourceTable, TargetTable: TDDTableDef); virtual; procedure TableDifference (DiffType: TDifferenceType; SourceTable, TargetTable: TDDTableDef); virtual;
procedure IndexDifference (DiffType: TDifferenceType; SourceIndex, TargetIndex: TDDIndexDef); virtual; procedure IndexDifference (DiffType: TDifferenceType; SourceIndex, TargetIndex: TDDIndexDef); virtual;
procedure FieldDifference (DiffType: TDifferenceType; SourceField, TargetField: TDDFieldDef); virtual; procedure FieldDifference (DiffType: TDifferenceType; SourceField, TargetField: TDDFieldDef); virtual;
@ -49,6 +51,10 @@ type
procedure CompareField (Source, Target: TDDFieldDefs; Fieldname: string; Kind: TDiffKindSet); procedure CompareField (Source, Target: TDDFieldDefs; Fieldname: string; Kind: TDiffKindSet);
procedure CompareIndexes (Source, Target: TDDIndexDefs; Kind: TDiffKindSet); procedure CompareIndexes (Source, Target: TDDIndexDefs; Kind: TDiffKindSet);
procedure CompareIndex (Source, Target: TDDIndexDefs; Indexname: string; Kind: TDiffKindSet); procedure CompareIndex (Source, Target: TDDIndexDefs; Indexname: string; Kind: TDiffKindSet);
procedure CompareDomains (Kind: TDiffKindSet);
procedure CompareDomain (Source, Target: TDDDomainDefs; DomainName: string; Kind: TDiffKindSet);
procedure CompareSequences (Kind: TDiffKindSet);
procedure CompareSequence (Source, Target: TDDSequenceDefs; SequenceName: string; Kind: TDiffKindSet);
public public
procedure Compare (Kind: TDiffKindSet); procedure Compare (Kind: TDiffKindSet);
property SourceDD : TFPdatadictionary read FSourceDD write FSourceDD; property SourceDD : TFPdatadictionary read FSourceDD write FSourceDD;
@ -66,6 +72,18 @@ resourcestring
{ TCustomDDDiffer } { TCustomDDDiffer }
procedure TCustomDDDiffer.DomainDifference(DiffType: TDifferenceType;
SourceDomain, TargetDomain: TDDDomainDef);
begin
end;
procedure TCustomDDDiffer.SequenceDifference(DiffType: TDifferenceType;
SourceSequence, TargetSequence: TDDSequenceDef);
begin
end;
procedure TCustomDDDiffer.TableDifference(DiffType: TDifferenceType; procedure TCustomDDDiffer.TableDifference(DiffType: TDifferenceType;
SourceTable, TargetTable: TDDTableDef); SourceTable, TargetTable: TDDTableDef);
begin begin
@ -82,47 +100,50 @@ begin
end; end;
procedure TCustomDDDiffer.CompareTables(Kind: TDiffKindSet); procedure TCustomDDDiffer.CompareTables(Kind: TDiffKindSet);
var var
Tablenames : TStringlist; List : TStringlist;
r : integer; r : integer;
begin begin
Tablenames := TStringlist.Create; List := TStringlist.Create;
try try
TableNames.Duplicates:=dupIgnore; List.Duplicates:=dupIgnore;
TableNames.sorted := true; List.sorted := true;
for r := 0 to SourceDD.Tables.Count-1 do for r := 0 to SourceDD.Tables.Count-1 do
TableNames.Add (SourceDD.Tables[r].TableName); List.Add (SourceDD.Tables[r].TableName);
for r := 0 to TargetDD.Tables.Count-1 do for r := 0 to TargetDD.Tables.Count-1 do
TableNames.Add (TargetDD.Tables[r].TableName); List.Add (TargetDD.Tables[r].TableName);
for r := 0 to TableNames.count-1 do for r := 0 to List.count-1 do
CompareTable (TableNames[r], Kind); CompareTable (List[r], Kind);
finally finally
Tablenames.Free; List.Free;
end; end;
end; end;
procedure TCustomDDDiffer.CompareTable(TableName: string; Kind: TDiffKindSet); procedure TCustomDDDiffer.CompareTable(TableName: string; Kind: TDiffKindSet);
var var
SourceTable, TargetTable : TDDTableDef; Src, Targ : TDDTableDef;
begin begin
SourceTable := FSourceDD.Tables.FindTable(TableName); Src := FSourceDD.Tables.FindTable(TableName);
TargetTable := FTargetDD.Tables.FindTable(TableName); Targ := FTargetDD.Tables.FindTable(TableName);
if Not assigned (TargetTable) then if Not assigned (Targ) then
begin begin
if DiffTables in Kind then if DiffTables in Kind then
TableDifference (dtMissing, SourceTable, nil); TableDifference (dtMissing, Src, nil);
end end
else if not assigned (SourceTable) then else if not assigned (Src) then
begin begin
if DiffTables in Kind then if DiffTables in Kind then
TableDifference (dtSurplus, nil, TargetTable); TableDifference (dtSurplus, nil, Targ);
end end
else else
begin // table exists in source and target, compare fields and Indexes begin // table exists in source and target, compare fields and Indexes
if DiffFields in Kind then if DiffFields in Kind then
CompareFields (SourceTable.Fields, TargetTable.Fields, Kind); CompareFields (Src.Fields, Targ.Fields, Kind);
if DiffIndexes in Kind then if DiffIndexes in Kind then
CompareIndexes(SourceTable.Indexes, TargetTable.Indexes, Kind); CompareIndexes(Src.Indexes, Targ.Indexes, Kind);
end; end;
end; end;
@ -157,20 +178,21 @@ procedure TCustomDDDiffer.CompareField(Source, Target: TDDFieldDefs;
end; end;
var var
SourceField, TargetField : TDDFieldDef; Src, Targ : TDDFieldDef;
begin begin
SourceField := Source.FindField(FieldName); Src := Source.FindField(FieldName);
TargetField := Target.FindField(FieldName); Targ := Target.FindField(FieldName);
if not assigned (TargetField) then if not assigned (Targ) then
FieldDifference(dtMissing, SourceField, nil) FieldDifference(dtMissing, Src, nil)
else if not assigned (SourceField) then else if not assigned (Src) then
FieldDifference(dtSurplus, nil, TargetField) FieldDifference(dtSurplus, nil, Targ)
else if (Not FieldTypesEqual(SourceField,TargetField)) else if (Not FieldTypesEqual(Src,Targ))
or (SourceField.required <> TargetField.required) or (Src.required <> Targ.required)
or (SourceField.DefaultExpression <> TargetField.DefaultExpression) or (Src.DomainName <> Targ.DomainName)
or ((SourceField.Size <> TargetField.Size) and not (SourceField.Fieldtype in [ftBlob])) or (Src.DefaultExpression <> Targ.DefaultExpression)
or (SourceField.Precision <> TargetField.Precision) then or ((Src.Size <> Targ.Size) and not (Src.Fieldtype in [ftBlob]))
FieldDifference(dtDifferent, SourceField, TargetField) or (Src.Precision <> Targ.Precision) then
FieldDifference(dtDifferent, Src, Targ)
end; end;
procedure TCustomDDDiffer.CompareIndexes(Source, Target: TDDIndexDefs; procedure TCustomDDDiffer.CompareIndexes(Source, Target: TDDIndexDefs;
@ -197,20 +219,102 @@ end;
procedure TCustomDDDiffer.CompareIndex(Source, Target: TDDIndexDefs; procedure TCustomDDDiffer.CompareIndex(Source, Target: TDDIndexDefs;
Indexname: string; Kind: TDiffKindSet); Indexname: string; Kind: TDiffKindSet);
var var
SourceIndex, TargetIndex : TDDIndexDef; Src, Targ : TDDIndexDef;
begin begin
SourceIndex := Source.FindIndex(IndexName); Src := Source.FindIndex(IndexName);
TargetIndex := Target.FindIndex(IndexName); Targ := Target.FindIndex(IndexName);
if not assigned (TargetIndex) then if not assigned (Targ) then
IndexDifference(dtMissing, SourceIndex, nil) IndexDifference(dtMissing, Src, nil)
else if not assigned (SourceIndex) then else if not assigned (Src) then
IndexDifference(dtSurplus, nil, TargetIndex) IndexDifference(dtSurplus, nil, Targ)
else if (CompareText(SourceIndex.Expression,TargetIndex.Expression) <> 0) or else if (CompareText(Src.Expression,Targ.Expression) <> 0) or
(CompareText(SourceIndex.Fields,TargetIndex.Fields) <> 0) or (CompareText(Src.Fields,Targ.Fields) <> 0) or
(SourceIndex.Options <> TargetIndex.Options) or (Src.Options <> Targ.Options) or
(CompareText(SourceIndex.DescFields,TargetIndex.DescFields) <> 0) or (CompareText(Src.DescFields,Targ.DescFields) <> 0) or
(CompareText(SourceIndex.CaseInsFields,TargetIndex.CaseInsFields) <> 0) then (CompareText(Src.CaseInsFields,Targ.CaseInsFields) <> 0) then
IndexDifference(dtDifferent, SourceIndex, TargetIndex) IndexDifference(dtDifferent, Src, Targ)
end;
procedure TCustomDDDiffer.CompareDomains(Kind: TDiffKindSet);
Var
List : TStringList;
R : Integer;
begin
List := TStringlist.Create;
try
List.Duplicates:=dupIgnore;
List.sorted := true;
for r := 0 to SourceDD.Domains.Count-1 do
List.Add (SourceDD.Domains[r].DomainName);
for r := 0 to TargetDD.Domains.Count-1 do
List.Add (TargetDD.Domains[r].DomainName);
for r := 0 to List.count-1 do
CompareDomain (SourceDD.Domains,TargetDD.Domains,List[r], Kind);
finally
List.Free;
end;
end;
procedure TCustomDDDiffer.CompareDomain(Source, Target: TDDDomainDefs;
DomainName: string; Kind: TDiffKindSet);
var
Src,Targ : TDDDomainDef;
begin
Src := Source.FindDomain(DomainName);
Targ := Target.FindDomain(DomainName);
if not assigned (Targ) then
DomainDifference(dtMissing, Src, nil)
else if not assigned (Src) then
DomainDifference(dtSurplus, nil, Targ)
else if (Src.FieldType<>Targ.FieldType) or
(Src.Required<>Targ.Required) or
(Src.Precision<>Targ.Precision) or
(Src.Size<>Targ.Size) then
DomainDifference(dtDifferent, Src, Targ)
end;
procedure TCustomDDDiffer.CompareSequences(Kind: TDiffKindSet);
Var
List : TStringList;
R : Integer;
begin
List := TStringlist.Create;
try
List.Duplicates:=dupIgnore;
List.sorted := true;
for r := 0 to SourceDD.Sequences.Count-1 do
List.Add (SourceDD.Sequences[r].SequenceName);
for r := 0 to TargetDD.Sequences.Count-1 do
List.Add (TargetDD.Sequences[r].SequenceName);
for r := 0 to List.count-1 do
CompareSequence (SourceDD.Sequences,TargetDD.Sequences,List[r], Kind);
finally
List.Free;
end;
end;
procedure TCustomDDDiffer.CompareSequence(Source, Target: TDDSequenceDefs;
SequenceName: string; Kind: TDiffKindSet);
var
Src,Targ : TDDSequenceDef;
begin
Src := Source.FindSequence(SequenceName);
Targ := Target.FindSequence(SequenceName);
if not assigned (Targ) then
SequenceDifference(dtMissing, Src, nil)
else if not assigned (Src) then
SequenceDifference(dtSurplus, nil, Targ)
else if (Src.StartValue<>Targ.StartValue) or
(Src.Increment<>Targ.Increment) then
SequenceDifference(dtDifferent, Src, Targ)
end; end;
procedure TCustomDDDiffer.Compare (Kind: TDiffKindSet); procedure TCustomDDDiffer.Compare (Kind: TDiffKindSet);