From: Nando D. <na...@us...> - 2005-07-04 11:35:17
|
Update of /cvsroot/instantobjects/Source/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20444/Core Modified Files: InstantDBBuild.pas Log Message: support for multi-statement build commands in database evolutiuon; finished TInstantDBBuilder. Index: InstantDBBuild.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantDBBuild.pas,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** InstantDBBuild.pas 28 Jun 2005 10:13:47 -0000 1.2 --- InstantDBBuild.pas 4 Jul 2005 11:35:07 -0000 1.3 *************** *** 112,120 **** private FTargetModel: TInstantModel; ! function GetTargetModel: TInstantModel; ! procedure SetTargetModel(const Value: TInstantModel); public // The reference Model. Default is InstantModel. property TargetModel: TInstantModel read GetTargetModel write SetTargetModel; end; --- 112,153 ---- private FTargetModel: TInstantModel; ! protected ! function GetTargetModel: TInstantModel; virtual; ! procedure SetTargetModel(const Value: TInstantModel); virtual; ! procedure AppendAddFieldCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const FieldMetadata: TInstantFieldMetadata); virtual; ! procedure AppendAddIndexCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const IndexMetadata: TInstantIndexMetadata); virtual; ! procedure AppendAddTableCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const TableMetadata: TInstantTableMetadata); virtual; ! procedure AppendAlterFieldCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const SourceFieldMetadata, ! TargetFieldMetadata: TInstantFieldMetadata); virtual; ! procedure AppendAlterIndexCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const SourceIndexMetadata, ! TargetIndexMetadata: TInstantIndexMetadata); virtual; ! procedure AppendDropFieldCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const FieldMetadata: TInstantFieldMetadata); virtual; ! procedure AppendDropIndexCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const IndexMetadata: TInstantIndexMetadata); virtual; ! function AppendDropTableCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const TableMetadata: TInstantTableMetadata): TInstantDBBuildCommand; virtual; public // The reference Model. Default is InstantModel. property TargetModel: TInstantModel read GetTargetModel write SetTargetModel; + published + property AfterCommandSequenceExecute; + property AfterCommandExecute; + property BeforeCommandSequenceExecute; + property BeforeCommandExecute; + property OnCommandExecuteError; end; *************** *** 123,134 **** // "classic" InstantObjects database building strategy. TInstantDBBuilder = class(TInstantCustomDBEvolver) protected procedure InternalBuildCommandSequence; override; ! published ! property AfterCommandSequenceExecute; ! property AfterCommandExecute; ! property BeforeCommandSequenceExecute; ! property BeforeCommandExecute; ! property OnCommandExecuteError; end; --- 156,167 ---- // "classic" InstantObjects database building strategy. TInstantDBBuilder = class(TInstantCustomDBEvolver) + private + // Adds to CommandSequence the steps needed to rebuild the database. + procedure GenerateCommandSequence(const CommandSequence: TInstantDBBuildCommandSequence); protected procedure InternalBuildCommandSequence; override; ! function AppendDropTableCommand( ! const CommandSequence: TInstantDBBuildCommandSequence; ! const TableMetadata: TInstantTableMetadata): TInstantDBBuildCommand; override; end; *************** *** 207,211 **** end; ! // Base class for all steps that work by executing a SQL statement or script. TInstantDBBuildSQLCommand = class(TInstantDBBuildCommand) private --- 240,245 ---- end; ! // Base class for all steps that work by executing one or more SQL statements ! // (that is, a script) each. TInstantDBBuildSQLCommand = class(TInstantDBBuildCommand) private *************** *** 214,218 **** protected function GetDescription: string; override; ! function GetSQLStatement: string; virtual; abstract; procedure InternalExecute; override; public --- 248,260 ---- protected function GetDescription: string; override; ! // Returns The number of statements that compound this script. The ! // predefined implementation returns 1. ! function GetSQLStatementCount: Integer; virtual; ! // Returns the nth SQL statement that is part of this script. Valid values ! // are in the range 0 to Pred(GetSQLStatementCount). The default ! // implementation, which should always be called through inherited at the ! // beginning of the overridden version, just returns '', or raises an ! // exception if Index is not in the allowed range. ! function GetSQLStatement(const Index: Integer): string; virtual; procedure InternalExecute; override; public *************** *** 226,230 **** function GetTableMetadata: TInstantTableMetadata; protected ! function GetSQLStatement: string; override; public property TableMetadata: TInstantTableMetadata read GetTableMetadata; --- 268,272 ---- function GetTableMetadata: TInstantTableMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property TableMetadata: TInstantTableMetadata read GetTableMetadata; *************** *** 236,240 **** function GetTableMetadata: TInstantTableMetadata; protected ! function GetSQLStatement: string; override; public property TableMetadata: TInstantTableMetadata read GetTableMetadata; --- 278,282 ---- function GetTableMetadata: TInstantTableMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property TableMetadata: TInstantTableMetadata read GetTableMetadata; *************** *** 246,250 **** function GetFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement: string; override; public property FieldMetadata: TInstantFieldMetadata read GetFieldMetadata; --- 288,292 ---- function GetFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property FieldMetadata: TInstantFieldMetadata read GetFieldMetadata; *************** *** 256,260 **** function GetFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement: string; override; public property FieldMetadata: TInstantFieldMetadata read GetFieldMetadata; --- 298,302 ---- function GetFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property FieldMetadata: TInstantFieldMetadata read GetFieldMetadata; *************** *** 267,271 **** function GetOldFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement: string; override; public property OldFieldMetadata: TInstantFieldMetadata read GetOldFieldMetadata; --- 309,313 ---- function GetOldFieldMetadata: TInstantFieldMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property OldFieldMetadata: TInstantFieldMetadata read GetOldFieldMetadata; *************** *** 278,282 **** function GetIndexMetadata: TInstantIndexMetadata; protected ! function GetSQLStatement: string; override; public property IndexMetadata: TInstantIndexMetadata read GetIndexMetadata; --- 320,324 ---- function GetIndexMetadata: TInstantIndexMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property IndexMetadata: TInstantIndexMetadata read GetIndexMetadata; *************** *** 288,298 **** function GetIndexMetadata: TInstantIndexMetadata; protected ! function GetSQLStatement: string; override; public property IndexMetadata: TInstantIndexMetadata read GetIndexMetadata; end; implementation { TInstantCustomDBBuilder } --- 330,357 ---- function GetIndexMetadata: TInstantIndexMetadata; protected ! function GetSQLStatement(const Index: Integer): string; override; public property IndexMetadata: TInstantIndexMetadata read GetIndexMetadata; end; + // Alters an index using a couple of SQL DROP INDEX and CREATE INDEX + // statements. + TInstantDBBuildAlterIndexSQLCommand = class(TInstantDBBuildSQLCommand) + private + function GetOldIndexMetadata: TInstantIndexMetadata; + function GetNewIndexMetadata: TInstantIndexMetadata; + protected + function GetSQLStatement(const Index: Integer): string; override; + function GetSQLStatementCount: Integer; override; + public + property OldIndexMetadata: TInstantIndexMetadata read GetOldIndexMetadata; + property NewIndexMetadata: TInstantIndexMetadata read GetNewIndexMetadata; + end; + implementation + uses + DB; + { TInstantCustomDBBuilder } *************** *** 410,424 **** end; ! procedure TInstantCustomDBEvolver.SetTargetModel( ! const Value: TInstantModel); begin FTargetModel := Value; end; { TInstantDBBuilder } procedure TInstantDBBuilder.InternalBuildCommandSequence; begin ! { TODO : Build a series of drop & create tables and indices. } end; --- 469,612 ---- end; ! procedure TInstantCustomDBEvolver.SetTargetModel(const Value: TInstantModel); begin FTargetModel := Value; end; + procedure TInstantCustomDBEvolver.AppendAddFieldCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const FieldMetadata: TInstantFieldMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctAddField); + Command.NewMetadata := FieldMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendAlterFieldCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const SourceFieldMetadata, TargetFieldMetadata: TInstantFieldMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctAlterField); + Command.OldMetadata := SourceFieldMetadata; + Command.NewMetadata := TargetFieldMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendDropFieldCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const FieldMetadata: TInstantFieldMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctDropField); + Command.OldMetadata := FieldMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendAddIndexCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const IndexMetadata: TInstantIndexMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctAddIndex); + Command.NewMetadata := IndexMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendAlterIndexCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const SourceIndexMetadata, TargetIndexMetadata: TInstantIndexMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctAlterIndex); + Command.OldMetadata := SourceIndexMetadata; + Command.NewMetadata := TargetIndexMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendDropIndexCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const IndexMetadata: TInstantIndexMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctDropIndex); + Command.OldMetadata := IndexMetadata; + CommandSequence.Append(Command); + end; + + procedure TInstantCustomDBEvolver.AppendAddTableCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const TableMetadata: TInstantTableMetadata); + var + Command: TInstantDBBuildCommand; + begin + Command := Connector.Broker.CreateDBBuildCommand(ctAddTable); + Command.NewMetadata := TableMetadata; + CommandSequence.Append(Command); + end; + + function TInstantCustomDBEvolver.AppendDropTableCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const TableMetadata: TInstantTableMetadata): TInstantDBBuildCommand; + begin + Result := Connector.Broker.CreateDBBuildCommand(ctDropTable); + Result.OldMetadata := TableMetadata; + CommandSequence.Append(Result); + end; + { TInstantDBBuilder } + function TInstantDBBuilder.AppendDropTableCommand( + const CommandSequence: TInstantDBBuildCommandSequence; + const TableMetadata: TInstantTableMetadata): TInstantDBBuildCommand; + begin + Result := inherited AppendDropTableCommand(CommandSequence, TableMetadata); + // This DB builder always drops tables by design, so we should better override + // the default setting of False for Enabled. + Result.Enabled := True; + end; + + procedure TInstantDBBuilder.GenerateCommandSequence( + const CommandSequence: TInstantDBBuildCommandSequence); + var + iTable, iIndex: Integer; + SourceTableMetadata, TargetTableMetadata: TInstantTableMetadata; + TargetIndexMetadata: TInstantIndexMetadata; + begin + // Recreate tables. + for iTable := 0 to CommandSequence.TargetScheme.TableMetadataCount - 1 do + begin + TargetTableMetadata := CommandSequence.TargetScheme.TableMetadatas[iTable]; + { TODO : This only works for case-insensitive object names! } + SourceTableMetadata := + CommandSequence.SourceScheme.FindTableMetadata(AnsiUpperCase(TargetTableMetadata.Name)); + if Assigned(SourceTableMetadata) then + begin + AppendDropTableCommand(CommandSequence, TargetTableMetadata); + AppendAddTableCommand(CommandSequence, TargetTableMetadata); + end; + // Add missing indexes and recreate modified indexes + for iIndex := 0 to TargetTableMetadata.IndexMetadataCount - 1 do + begin + TargetIndexMetadata := TargetTableMetadata.IndexMetadatas[iIndex]; + if not (ixPrimary in TargetIndexMetadata.Options) then + AppendAddIndexCommand(CommandSequence, TargetIndexMetadata); + end; + end; + end; + procedure TInstantDBBuilder.InternalBuildCommandSequence; begin ! CommandSequence.Clear; ! CommandSequence.SourceScheme := Connector.CreateScheme(TargetModel); ! CommandSequence.TargetScheme := Connector.CreateScheme(TargetModel); ! GenerateCommandSequence(CommandSequence); end; *************** *** 576,581 **** const Value: TInstantScheme); begin ! FreeAndNil(FSourceScheme); ! FSourceScheme := Value; end; --- 764,772 ---- const Value: TInstantScheme); begin ! if FSourceScheme <> Value then ! begin ! FreeAndNil(FSourceScheme); ! FSourceScheme := Value; ! end; end; *************** *** 583,588 **** const Value: TInstantScheme); begin ! FreeAndNil(FTargetScheme); ! FTargetScheme := Value; end; --- 774,782 ---- const Value: TInstantScheme); begin ! if FTargetScheme <> Value then ! begin ! FreeAndNil(FTargetScheme); ! FTargetScheme := Value; ! end; end; *************** *** 600,616 **** function TInstantDBBuildSQLCommand.GetDescription: string; begin ! Result := GetSQLStatement; end; procedure TInstantDBBuildSQLCommand.InternalExecute; begin ! Broker.Execute(GetSQLStatement()); end; { TInstantDBBuildAddTableSQLCommand } ! function TInstantDBBuildAddTableSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateCreateTableSQL(TableMetadata); end; --- 794,837 ---- function TInstantDBBuildSQLCommand.GetDescription: string; + var + iStatement: Integer; begin ! Result := ''; ! for iStatement := 0 to Pred(GetSQLStatementCount) do ! begin ! if Result <> '' then ! Result := Result + sLineBreak; ! Result := Result + GetSQLStatement(iStatement); ! end; ! end; ! ! function TInstantDBBuildSQLCommand.GetSQLStatement( ! const Index: Integer): string; ! begin ! if (Index < 0) or (Index >= GetSQLStatementCount) then ! raise EInstantDBBuildError.CreateFmt(SSQLStatementIndexOutOfBounds, ! [Index]); ! Result := ''; ! end; ! ! function TInstantDBBuildSQLCommand.GetSQLStatementCount: Integer; ! begin ! Result := 1; end; procedure TInstantDBBuildSQLCommand.InternalExecute; + var + iStatement: Integer; begin ! for iStatement := 0 to Pred(GetSQLStatementCount) do ! Broker.Execute(GetSQLStatement(iStatement)); end; { TInstantDBBuildAddTableSQLCommand } ! function TInstantDBBuildAddTableSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateCreateTableSQL(TableMetadata); end; *************** *** 628,633 **** end; ! function TInstantDBBuildAddFieldSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateAddFieldSQL(FieldMetadata); end; --- 849,856 ---- end; ! function TInstantDBBuildAddFieldSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateAddFieldSQL(FieldMetadata); end; *************** *** 640,645 **** end; ! function TInstantDBBuildDropFieldSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateDropFieldSQL(FieldMetadata); end; --- 863,870 ---- end; ! function TInstantDBBuildDropFieldSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateDropFieldSQL(FieldMetadata); end; *************** *** 647,652 **** { TInstantDBBuildDropTableSQLCommand } ! function TInstantDBBuildDropTableSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateDropTableSQL(TableMetadata); end; --- 872,879 ---- { TInstantDBBuildDropTableSQLCommand } ! function TInstantDBBuildDropTableSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateDropTableSQL(TableMetadata); end; *************** *** 669,674 **** end; ! function TInstantDBBuildAlterFieldSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateAlterFieldSQL(OldFieldMetadata, NewFieldMetadata); end; --- 896,903 ---- end; ! function TInstantDBBuildAlterFieldSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateAlterFieldSQL(OldFieldMetadata, NewFieldMetadata); end; *************** *** 681,686 **** end; ! function TInstantDBBuildAddIndexSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateCreateIndexSQL(IndexMetadata); end; --- 910,917 ---- end; ! function TInstantDBBuildAddIndexSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateCreateIndexSQL(IndexMetadata); end; *************** *** 693,700 **** end; ! function TInstantDBBuildDropIndexSQLCommand.GetSQLStatement: string; begin Result := Broker.Generator.GenerateDropIndexSQL(IndexMetadata); end; end. --- 924,960 ---- end; ! function TInstantDBBuildDropIndexSQLCommand.GetSQLStatement( ! const Index: Integer): string; begin + Result := inherited GetSQLStatement(Index); Result := Broker.Generator.GenerateDropIndexSQL(IndexMetadata); end; + { TInstantDBBuildAlterIndexSQLCommand } + + function TInstantDBBuildAlterIndexSQLCommand.GetOldIndexMetadata: TInstantIndexMetadata; + begin + Result := OldMetadata as TInstantIndexMetadata; + end; + + function TInstantDBBuildAlterIndexSQLCommand.GetNewIndexMetadata: TInstantIndexMetadata; + begin + Result := NewMetadata as TInstantIndexMetadata; + end; + + function TInstantDBBuildAlterIndexSQLCommand.GetSQLStatement( + const Index: Integer): string; + begin + Result := inherited GetSQLStatement(Index); + if Index = 0 then + Result := Broker.Generator.GenerateDropIndexSQL(OldIndexMetadata) + else + Result := Broker.Generator.GenerateCreateIndexSQL(NewIndexMetadata); + end; + + function TInstantDBBuildAlterIndexSQLCommand.GetSQLStatementCount: Integer; + begin + Result := 2; + end; + end. |