mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-21 20:18:55 +02:00
* Diff domains and sequences
git-svn-id: trunk@11609 -
This commit is contained in:
parent
6a5954201d
commit
cbdd282f19
@ -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>
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user