From: Steven M. <sr...@us...> - 2005-10-31 23:43:47
|
Update of /cvsroot/instantobjects/Source/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30114 Modified Files: InstantPersistence.pas InstantDBBuild.pas Log Message: Added a generic 6 step statement SQL command class (TInstantDBBuildAlterFieldGenericSQLCommand) for evolving table fields. Index: InstantPersistence.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantPersistence.pas,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** InstantPersistence.pas 27 Oct 2005 12:52:01 -0000 1.70 --- InstantPersistence.pas 31 Oct 2005 23:43:38 -0000 1.71 *************** *** 2290,2293 **** --- 2290,2295 ---- function InternalGenerateSelectTablesSQL: string; virtual; function InternalGenerateUpdateConcurrentSQL(Map: TInstantAttributeMap): string; virtual; + function InternalGenerateUpdateFieldCopySQL(OldMetadata, NewMetadata: + TInstantFieldMetadata): string; virtual; function InternalGenerateUpdateSQL(Map: TInstantAttributeMap): string; virtual; property Delimiters: string read GetDelimiters; *************** *** 2312,2315 **** --- 2314,2319 ---- function GenerateSelectTablesSQL: string; function GenerateUpdateConcurrentSQL(Map: TInstantAttributeMap): string; + function GenerateUpdateFieldCopySQL(OldMetadata, NewMetadata: + TInstantFieldMetadata): string; function GenerateUpdateSQL(Map: TInstantAttributeMap): string; end; *************** *** 12873,12876 **** --- 12877,12886 ---- end; + function TInstantSQLGenerator.GenerateUpdateFieldCopySQL(OldMetadata, + NewMetadata: TInstantFieldMetadata): string; + begin + Result := InternalGenerateUpdateFieldCopySQL(OldMetadata, NewMetadata); + end; + function TInstantSQLGenerator.GenerateUpdateSQL (Map: TInstantAttributeMap): string; *************** *** 13090,13093 **** --- 13100,13112 ---- end; + function TInstantSQLGenerator.InternalGenerateUpdateFieldCopySQL(OldMetadata, + NewMetadata: TInstantFieldMetadata): string; + begin + Result := Format('UPDATE %s SET %s = %s', + [EmbraceTable(OldMetadata.TableMetadata.Name), + EmbraceField(NewMetadata.Name), + EmbraceField(OldMetadata.Name)]); + end; + function TInstantSQLGenerator.InternalGenerateUpdateSQL (Map: TInstantAttributeMap): string; Index: InstantDBBuild.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantDBBuild.pas,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** InstantDBBuild.pas 7 Sep 2005 10:52:04 -0000 1.9 --- InstantDBBuild.pas 31 Oct 2005 23:43:38 -0000 1.10 *************** *** 358,361 **** --- 358,374 ---- end; + TInstantDBBuildAlterFieldGenericSQLCommand = class( + TInstantDBBuildAlterFieldSQLCommand) + private + FTmpFieldMD: TInstantFieldMetadata; + protected + function GetDescription: string; override; + function GetSQLStatement(const Index: Integer): string; override; + function GetSQLStatementCount: Integer; override; + procedure InternalExecute; override; + public + destructor Destroy; override; + end; + implementation *************** *** 363,366 **** --- 376,382 ---- DB; + const + STmpFieldSuffix = '_XYZ_'; + { TInstantCustomDBBuilder } *************** *** 999,1001 **** --- 1015,1086 ---- end; + { TInstantDBBuildAlterFieldSQLCommand } + + destructor TInstantDBBuildAlterFieldGenericSQLCommand.Destroy; + begin + FTmpFieldMD.Free; + inherited; + end; + + function TInstantDBBuildAlterFieldGenericSQLCommand.GetDescription: string; + begin + Result := Format('ALTER TABLE %s evolve column %s - multi-statement SQL.', + [NewFieldMetadata.TableMetadata.Name, NewFieldMetadata.Name]); + end; + + function TInstantDBBuildAlterFieldGenericSQLCommand.GetSQLStatement(const + Index: Integer): string; + + function CreateTmpFieldMetadata(FieldMetadata: TInstantFieldMetadata): + TInstantFieldMetadata; + begin + Result := TInstantFieldMetadata.Create(FieldMetadata.Collection); + Result.Name := FieldMetadata.Name + STmpFieldSuffix; + Result.DataType := FieldMetadata.DataType; + Result.AlternateDataTypes := FieldMetadata.AlternateDataTypes; + Result.Options := FieldMetadata.Options; + Result.Size := FieldMetadata.Size; + end; + + begin + Result := inherited GetSQLStatement(Index); + + FTmpFieldMD := CreateTmpFieldMetadata(NewFieldMetadata); + + with Broker.Generator do + case Index of + 0 : Result := GenerateAddFieldSQL(FTmpFieldMD); + + 1 : Result := GenerateUpdateFieldCopySQL(OldFieldMetadata, FTmpFieldMD); + + 2 : Result := GenerateDropFieldSQL(OldFieldMetadata); + + 3 : Result := GenerateAddFieldSQL(NewFieldMetadata); + + 4 : Result := GenerateUpdateFieldCopySQL(FTmpFieldMD, NewFieldMetadata); + + 5 : Result := GenerateDropFieldSQL(FTmpFieldMD); + end; + end; + + function TInstantDBBuildAlterFieldGenericSQLCommand.GetSQLStatementCount: + Integer; + begin + Result := 6; + end; + + procedure TInstantDBBuildAlterFieldGenericSQLCommand.InternalExecute; + var + iStatement: Integer; + begin + try + for iStatement := 0 to Pred(GetSQLStatementCount) do + Broker.Execute(GetSQLStatement(iStatement)); + except + if Assigned(FTmpFieldMD) then + Broker.Execute(Broker.Generator.GenerateDropFieldSQL(FTmpFieldMD)); + raise; + end; + end; + end. |