* Additional options implemented

git-svn-id: trunk@11534 -
This commit is contained in:
michael 2008-08-07 12:39:52 +00:00
parent fd2b09c12c
commit 7d845aa47e

View File

@ -25,7 +25,8 @@ uses
TYpe
TClassOption = (caCreateClass,caConstructor,caDestructor,caCreateList,caListAddMethod,caListItemsProperty);
TClassOptions = Set of TClassOption;
TVisitorOption = (voRead,voReadList,voCreate,voDelete,voUpdate);
TVisitorOption = (voRead,voReadList,voCreate,voDelete,voUpdate,
voCommonSetupParams,voSingleSaveVisitor);
TVisitorOptions = set of TVisitorOption;
{ TTiOPFCodeOptions }
@ -33,19 +34,23 @@ TYpe
TTiOPFCodeOptions = Class (TClassCodeGeneratorOptions)
Private
FClassOptions: TClassOptions;
FFinalVisitors: TVisitorOptions;
FListAncestorName: String;
FListClassName : String;
FVisitorOptions: TVisitorOptions;
FTableName : String;
function GetListClassName: String;
procedure SetClassOptions(const AValue: TClassOptions);
procedure SetListAncestorName(const AValue: String);
procedure SetListClassName(const AValue: String);
procedure SetVisitorOptions(const AValue: TVisitorOptions);
Public
Constructor Create; override;
Procedure Assign(ASource : TPersistent); override;
Published
Property ClassOptions : TClassOptions Read FClassOptions Write FClassOptions;
Property VisitorOptions : TVisitorOptions Read FVisitorOptions Write FVisitorOptions;
Property ClassOptions : TClassOptions Read FClassOptions Write SetClassOptions;
Property VisitorOptions : TVisitorOptions Read FVisitorOptions Write SetVisitorOptions;
Property FinalVisitors : TVisitorOptions Read FFinalVisitors Write FFinalVisitors;
Property ListAncestorName : String Read FListAncestorName Write SetListAncestorName;
Property ListClassName : String Read GetListClassName Write SetListClassName;
Property AncestorClass;
@ -65,15 +70,24 @@ TYpe
private
Function CreateSQLStatement(V: TVisitorOption) : String;
function GetOpt: TTiOPFCodeOptions;
procedure WriteCreateVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteDeleteVisitor(Strings: TStrings; const ObjectClassName: String);
Function UseCommonSetupParams : Boolean;
Function SingleSaveVisitor : Boolean;
Function VisitorClassName(V : TVisitorOption; Const ObjectClassName : String) : String;
// Auxiliary routines
procedure WriteFieldAssign(Strings: TStrings; F: TFieldPropDef);
procedure WriteAssignToParam(Strings: TStrings; F: TFieldPropDef);
procedure WriteReadListVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteReadVisitor(Strings: TStrings; const ObjectClassName: String );
procedure WriteSetSQL(Strings: TStrings; const ASQL: String);
procedure WriteSQLConstants(Strings: TStrings);
Procedure WriteTerminateVisitor(Strings : TStrings; V : TVisitorOption; const ObjectClassName: String);
procedure WriteSetupParams(Strings: TStrings; const AClassName, ObjectClassName: String);
// Visitors
procedure WriteCommonSetupVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteSaveVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteCreateVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteDeleteVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteUpdateVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteReadListVisitor(Strings: TStrings; const ObjectClassName: String);
procedure WriteReadVisitor(Strings: TStrings; const ObjectClassName: String );
procedure WriteVisitorDeclaration(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
procedure WriteVisitorImplementation(Strings: TStrings; V: TVisitorOption; const ObjectClassName: String);
Protected
@ -104,6 +118,14 @@ Const
implementation
Function StripType(S : String) : string;
begin
Result:=S;
If (Result<>'') and (Result[1]='T') then
Delete(Result,1,1);
end;
{ TTiOPFCodeOptions }
function TTiOPFCodeOptions.GetListClassName: String;
@ -113,6 +135,20 @@ begin
Result:=ObjectClassName+'List';
end;
procedure TTiOPFCodeOptions.SetClassOptions(const AValue: TClassOptions);
Var
B : Boolean;
begin
If AValue=FClassOptions then
Exit;
B:=Not(caCreateList in FClassOptions) and (caCreateList in AValue);
FClassOptions:=AValue;
If B then
Include(FVisitorOptions,voReadList);
end;
procedure TTiOPFCodeOptions.SetListAncestorName(const AValue: String);
begin
CheckIdentifier(AValue,False);
@ -125,6 +161,31 @@ begin
FListClassName:=AValue;
end;
procedure TTiOPFCodeOptions.SetVisitorOptions(const AValue: TVisitorOptions);
Var
V : TVisitorOption;
begin
FVisitorOptions:=AValue;
// Consistency check
If voSingleSaveVisitor in FVisitorOptions then
begin
Exclude(FVisitorOptions,voCommonSetupParams);
Exclude(FVisitorOptions,voCreate);
Exclude(FVisitorOptions,voUpdate);
Exclude(FVisitorOptions,voDelete);
end
else If voCommonSetupParams in FVisitorOptions then
begin
Include(FVisitorOptions,voCreate);
Include(FVisitorOptions,voUpdate);
end;
For V:=Low(TVisitorOption) to High(TVisitorOption) do
If Not (V in FVisitorOptions) then
Exclude(FFinalVisitors,V);
end;
constructor TTiOPFCodeOptions.Create;
begin
inherited Create;
@ -133,7 +194,7 @@ begin
ObjectClassName:='MyObject';
TableName:=SDefTableName;
FVisitorOptions:=[voRead,voCreate,voDelete,voUpdate];
FClassOptions:=[caCreateList,caListAddMethod,caListItemsProperty];
FClassOptions:=[caCreateClass,caCreateList,caListAddMethod,caListItemsProperty];
end;
procedure TTiOPFCodeOptions.Assign(ASource: TPersistent);
@ -150,6 +211,7 @@ begin
FVisitorOptions:=OC.FVisitorOptions;
FClassOptions:=OC.FClassOptions;
FTableName:=OC.TableName;
FFinalVisitors:=OC.FinalVisitors;
end;
inherited Assign(ASource);
end;
@ -186,6 +248,122 @@ begin
Result:=CodeOptions as TTiOPFCodeOptions;
end;
function TTiOPFCodeGenerator.UseCommonSetupParams: Boolean;
begin
Result:=VoCommonSetupParams in tiOPFOptions.VisitorOptions;
end;
function TTiOPFCodeGenerator.SingleSaveVisitor: Boolean;
begin
Result:=voSingleSaveVisitor in tiOPFOptions.VisitorOptions;
end;
function TTiOPFCodeGenerator.VisitorClassName(V: TVisitorOption;
const ObjectClassName: String): String;
Var
S : String;
begin
Case V of
voRead : S:='Read';
voReadList : S:='ReadList';
voCreate : S:='Create';
voDelete : S:='Delete';
voUpdate : S:='Update';
voCommonSetupParams : S:='UpdateCreate';
voSingleSaveVisitor : S:='Save';
else
Result:='Unknown';
end;
// Real class name
Result:=Format('T%s%sVisitor',[S,StripType(ObjectClassName)]);
end;
procedure TTiOPFCodeGenerator.WriteCommonSetupVisitor(Strings: TStrings;
const ObjectClassName: String);
Var
CS,C,S : String;
I : Integer;
begin
C:=VisitorClassName(voCommonSetupParams,ObjectClassName);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
WriteSetupParams(Strings,C,ObjectClassName);
end;
procedure TTiOPFCodeGenerator.WriteSaveVisitor(Strings: TStrings; const ObjectClassName: String);
Procedure WriteSQLCase(Const ACaselabel,ASQL : String);
begin
addln(Strings,ACaseLabel+':');
incIndent;
WriteSetSQL(Strings,ASQL);
DecIndent;
end;
Var
OCN,CS,C,S : String;
I : Integer;
F : TFieldPropDef;
begin
OCN:=StripType(ObjectClassName);
C:=VisitorClassName(voSingleSaveVisitor,OCN);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
// Init
S:=BeginInit(Strings,C);
AddLn(Strings,'Case Visited.ObjectState of');
IncIndent;
try
WriteSQLCase('posCreate',Format('SQLCreate%s',[OCN]));
WriteSQLCase('posUpdate',Format('SQLUpdate%s',[OCN]));
WriteSQLCase('posDelete',Format('SQLDelete%s',[OCN]));
finally
DecIndent;
end;
Addln(Strings,'end;');
DecIndent;
EndMethod(Strings,S);
// AcceptVisitor
S:=BeginAcceptVisitor(Strings,C,ObjectClassName);
AddLn(Strings,'Result:=Result and (Visited.ObjectState in [posCreate,posdelete,posUpdate]);');
DecIndent;
EndMethod(Strings,S);
S:=BeginSetupParams(Strings,C,ObjectClassName,True);
Addln(Strings,'With Query do',[ObjectClassName]);
IncINdent;
try
Addln(Strings,'begin');
F:=Fields.FindPropName('OID');
If (F<>Nil) then
WriteAssignToParam(Strings,F)
else
AddLn(Strings,'// No OID property found. Add delete key parameter setup code here.');
AddLn(Strings,'If (Visited.ObjectState<>posDelete) then');
IncIndent;
try
AddLn(Strings,'begin');
For I:=0 to Fields.Count-1 do
If Fields[i].Enabled and (CompareText(Fields[i].PropertyName,'OID')<>0) then
WriteAssignToParam(Strings,Fields[i]);
AddLn(Strings,'end;');
Finally
DecIndent;
end;
Addln(Strings,'end;');
finally
DecIndent;
end;
DecIndent;
EndMethod(Strings,S);
end;
function TTiOPFCodeGenerator.GetInterfaceUsesClause: string;
begin
Result:=inherited GetInterfaceUsesClause;
@ -213,8 +391,10 @@ begin
try
If caCreateList in ClassOptions then
CreateListDeclaration(Strings,ObjectClassName,ListClassName,ListAncestorName);
If voCommonSetupParams in VisitorOptions then
WriteVisitorDeclaration(Strings,voCommonSetupParams,ObjectClassName);
For V:=Low(TVisitorOption) to High(TVisitorOption) do
If V in VisitorOptions then
If (V in VisitorOptions) and (V<>voCommonSetupParams) then
WriteVisitorDeclaration(Strings,V,ObjectClassName);
Finally
DecIndent;
@ -222,13 +402,6 @@ begin
end;
end;
Function StripType(S : String) : string;
begin
Result:=S;
If (Result<>'') and (Result[1]='T') then
Delete(Result,1,1);
end;
procedure TTiOPFCodeGenerator.WriteVisitorDeclaration(Strings : TStrings; V : TVisitorOption; Const ObjectClassName : String);
@ -236,28 +409,34 @@ Var
S,T,A : string;
begin
Case V of
voRead : S:='Read';
voReadList : S:='ReadList';
voCreate : S:='Create';
voDelete : S:='Delete';
voUpdate : S:='Update';
end;
If V in [voCreate,voDelete,voUpdate] then
A:='Update'
// Ancestor name
// Common setup case
If (V in [voCreate,voUpdate]) and (UseCommonSetupParams) then
A:=Format('TUpdateCreate%sVisitor',[StripType(ObjectClassName)])
else If (V in [voCreate,voDelete,voUpdate,voCommonSetupParams]) then
A:='TtiVisitorUpdate'
else
A:='Select';
S:=Format('T%s%sVisitor',[S,StripType(ObjectClassName)]);
A:='TtiVisitorSelect';
// Real class
S:=VisitorClassName(V,ObjectClassName);
AddLn(Strings,'{ %s }',[S]);
AddlN(Strings,'%s = Class(TtiVisitor%s)',[S,A]);
AddlN(Strings,'%s = Class(%s)',[S,A]);
AddlN(Strings,'Protected');
IncIndent;
Try
AddLn(Strings,'Procedure Init; override;');
AddLn(Strings,'Function AcceptVisitor : Boolean; override;');
AddLn(Strings,'Procedure SetupParams; override;');
If Not (V in [voCreate,voDelete,voUpdate]) then
If (V<>VoCommonSetupParams) then
begin
AddLn(Strings,'Procedure Init; override;');
AddLn(Strings,'Function AcceptVisitor : Boolean; override;');
If Not ((V in [voCreate,voUpdate]) and UseCommonSetupParams) then
AddLn(Strings,'Procedure SetupParams; override;');
end
else
AddLn(Strings,'Procedure SetupParams; override;');
If (V in [voRead,voReadList]) then
AddLn(Strings,'Procedure MapRowToObject; override;');
if (V in TiOPFOptions.FinalVisitors) then
Addln(Strings,'Procedure Execute(Const AData : TtiVisited); override;');
Finally
DecIndent;
end;
@ -347,7 +526,7 @@ procedure TTiOPFCodeGenerator.WriteSQLConstants(Strings : TStrings);
Const
VisSQL : Array [TVisitorOption] of string
= ('Read','ReadList','Create','Delete','Update');
= ('Read','ReadList','Create','Delete','Update','','');
Var
OCN,S : String;
@ -359,7 +538,8 @@ begin
try
OCN:=StripType(TiOPFOptions.ObjectClassName);
For V:=Low(TVisitorOption) to High(TVisitorOption) do
If V in TiOPFOptions.VisitorOptions then
If ((V in TiOPFOptions.VisitorOptions) or
(SingleSaveVisitor and (V in [voCreate,voUpdate,voDelete]))) and (VisSQL[V]<>'') then
begin
S:=CreateSQLStatement(V);
S:=Format('SQL%s%s = ''%s'';',[VisSQL[V],OCN,S]);
@ -371,6 +551,33 @@ begin
AddLn(Strings,'');
end;
procedure TTiOPFCodeGenerator.WriteTerminateVisitor(Strings : TStrings;V : TVisitorOption;
const ObjectClassName: String);
Var
S : String;
begin
S:=VisitorclassName(V,ObjectClassName);
S:=Format('Procedure %s.Execute(Const AData : TtiVisited);',[S]);
BeginMethod(Strings,S);
AddLn(Strings,'begin');
IncIndent;
try
AddLn(Strings,'Inherited Execute(AData);');
Addln(Strings,'If not AcceptVisitor then');
IncIndent;
Try
Addln(Strings,'Exit; // ==>');
Finally
DecIndent;
end;
AddLn(Strings,'ContinueVisiting:=False;');
Finally
DecIndent;
end;
EndMethod(Strings,S);
end;
procedure TTiOPFCodeGenerator.DoGenerateImplementation(Strings: TStrings);
@ -400,12 +607,16 @@ procedure TTiOPFCodeGenerator.WriteVisitorImplementation(Strings : TStrings; V :
begin
Case V of
voRead : WriteReadVisitor(Strings,ObjectClassName);
voReadList : WriteReadListVisitor(Strings,ObjectClassName);
voCreate : WriteCreateVisitor(Strings,ObjectClassName);
voDelete : WriteDeleteVisitor(Strings,ObjectClassName);
voUpdate : WriteUpdateVisitor(Strings,ObjectClassName);
voRead : WriteReadVisitor(Strings,ObjectClassName);
voReadList : WriteReadListVisitor(Strings,ObjectClassName);
voCreate : WriteCreateVisitor(Strings,ObjectClassName);
voDelete : WriteDeleteVisitor(Strings,ObjectClassName);
voUpdate : WriteUpdateVisitor(Strings,ObjectClassName);
voCommonSetupParams : WriteCommonSetupVisitor(Strings,ObjectClassName);
voSingleSaveVisitor : WriteSaveVisitor(Strings,ObjectClassName);
end;
If v in TiOPFOptions.FinalVisitors then
WriteTerminateVisitor(Strings,V,ObjectClassName);
end;
Function TTiOPFCodeGenerator.BeginInit(Strings : TStrings; const AClass : String) : String;
@ -477,7 +688,7 @@ Var
begin
OCN:=StripType(ObjectClassName);
CS:=Format('SQLRead%s',[OCN]);
C:=Format('TRead%sVisitor',[OCN]);
C:=VisitorClassName(voRead,OCN);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
// Init
@ -533,13 +744,9 @@ begin
S:='AsBoolean';
ptShortint, ptByte,
ptSmallInt, ptWord,
ptLongint, ptCardinal :
ptLongint, ptCardinal,
ptInt64:
S:='AsInteger';
ptInt64, ptQWord:
If F.FieldType=ftLargeInt then
R:=Format('O.%s:=(FieldByName(%s) as TLargeIntField).AsLargeInt;',[PN,SFN])
else
S:='AsInteger';
ptShortString, ptAnsiString, ptWideString :
S:='AsString';
ptSingle, ptDouble, ptExtended, ptComp :
@ -581,13 +788,9 @@ begin
S:='AsBoolean';
ptShortint, ptByte,
ptSmallInt, ptWord,
ptLongint, ptCardinal :
ptLongint, ptCardinal,
ptInt64, ptQWord :
S:='AsInteger';
ptInt64, ptQWord:
If F.FieldType=ftLargeInt then
R:=Format('O.%s:=(Name(%s) as TLargeIntField).AsLargeInt;',[PN,SFN])
else
S:='AsInteger';
ptShortString, ptAnsiString, ptWideString :
S:='AsString';
ptSingle, ptDouble, ptExtended, ptComp :
@ -626,7 +829,7 @@ begin
LN:=tiOPFOptions.ListClassName;
OCN:=StripType(ObjectClassName);
CS:=Format('SQLReadList%s',[OCN]);
C:=Format('TReadList%sVisitor',[StripType(OCN)]);
C:=VisitorClassName(voReadList,OCN);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
// Init
@ -676,7 +879,7 @@ Var
begin
OCN:=StripType(ObjectClassName);
CS:=Format('SQLCreate%s',[OCN]);
C:=Format('TCreate%sVisitor',[OCN]);
C:=VisitorClassName(voCreate,OCN);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
// Init
@ -689,8 +892,19 @@ begin
AddLn(Strings,'Result:=Result and (Visited.ObjectState=posCreate);');
DecIndent;
EndMethod(Strings,S);
If Not (UseCommonSetupParams) then
WriteSetupParams(Strings,C,ObjectClassName);
end;
procedure TTiOPFCodeGenerator.WriteSetupParams(Strings : TStrings; Const AClassName,ObjectClassName : String);
Var
S : String;
I : Integer;
begin
// SetupParams
S:=BeginSetupParams(Strings,C,ObjectClassName,True);
S:=BeginSetupParams(Strings,AClassName,ObjectClassName,True);
Addln(Strings,'With Query do',[ObjectClassName]);
IncINdent;
try
@ -721,7 +935,7 @@ Var
begin
OCN:=StripType(ObjectClassName);
CS:=Format('SQLDelete%s',[OCN]);
C:=Format('TDelete%sVisitor',[StripType(ObjectClassName)]);
C:=VisitorClassName(voDelete,OCN);
Addln(Strings,'{ %s }',[C]);
// Init
S:=BeginInit(Strings,C);
@ -753,7 +967,7 @@ Var
begin
OCN:=StripType(ObjectClassName);
CS:=Format('SQLUpdate%s',[OCN]);
C:=Format('TUpdate%sVisitor',[OCN]);
C:=VisitorClassName(voUpdate,OCN);
Addln(Strings,'{ %s }',[C]);
Addln(Strings);
// Init
@ -766,26 +980,11 @@ begin
AddLn(Strings,'Result:=Result and (Visited.ObjectState=posUpdate);');
DecIndent;
EndMethod(Strings,S);
// SetupParams
S:=BeginSetupParams(Strings,C,ObjectClassName,True);
Addln(Strings,'With Query do',[ObjectClassName]);
IncINdent;
try
Addln(Strings,'begin');
For I:=0 to Fields.Count-1 do
If Fields[i].Enabled then
WriteAssignToParam(Strings,Fields[i]);
Addln(Strings,'end;');
finally
DecIndent;
end;
DecIndent;
EndMethod(Strings,S);
If Not (UseCommonSetupParams) then
WriteSetupParams(Strings,C,ObjectClassName);
end;
{ ---------------------------------------------------------------------
List object commands
---------------------------------------------------------------------}