From: Nando D. <na...@us...> - 2005-09-07 10:52:16
|
Update of /cvsroot/instantobjects/Source/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1638/Core Modified Files: InstantDBBuild.pas InstantDBEvolution.pas InstantPersistence.pas Log Message: Allow for catalogs that don't support reading all metadata (like an XML catalog) Index: InstantDBEvolution.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantDBEvolution.pas,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** InstantDBEvolution.pas 4 Sep 2005 23:15:54 -0000 1.6 --- InstantDBEvolution.pas 7 Sep 2005 10:52:04 -0000 1.7 *************** *** 97,176 **** SourceFieldMetadata, TargetFieldMetadata: TInstantFieldMetadata; SourceIndexMetadata, TargetIndexMetadata: TInstantIndexMetadata; begin ! // Upgrade 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 ! // Add missing fields and alter modified fields ! for iField := 0 to TargetTableMetadata.FieldMetadataCount - 1 do begin ! TargetFieldMetadata := TargetTableMetadata.FieldMetadatas[iField]; ! { TODO : This only works for case-insensitive object names! } ! SourceFieldMetadata := SourceTableMetadata.FindFieldMetadata(AnsiUpperCase(TargetFieldMetadata.Name)); ! if Assigned(SourceFieldMetadata) then begin ! if not SourceFieldMetadata.Equals(TargetFieldMetadata) then ! AppendAlterFieldCommand(CommandSequence, SourceFieldMetadata, ! TargetFieldMetadata); ! end ! else ! AppendAddFieldCommand(CommandSequence, TargetFieldMetadata); ! 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 begin ! { TODO : This only works for case-insensitive object names! } ! SourceIndexMetadata := SourceTableMetadata.FindIndexMetadata(AnsiUpperCase(TargetIndexMetadata.Name)); ! if Assigned(SourceIndexMetadata) then begin ! if not SourceIndexMetadata.Equals(TargetIndexMetadata) then ! AppendAlterIndexCommand(CommandSequence, SourceIndexMetadata, ! TargetIndexMetadata); ! end ! else ! AppendAddIndexCommand(CommandSequence, TargetIndexMetadata); end; ! end; ! // Drop deleted indexes ! for iIndex := 0 to SourceTableMetadata.IndexMetadataCount - 1 do ! begin ! SourceIndexMetadata := SourceTableMetadata.IndexMetadatas[iIndex]; ! if not (ixPrimary in SourceIndexMetadata.Options) then begin ! { TODO : This only works for case-insensitive object names! } ! TargetIndexMetadata := TargetTableMetadata.FindIndexMetadata(AnsiUpperCase(SourceIndexMetadata.Name)); ! if not Assigned(TargetIndexMetadata) then ! AppendDropIndexCommand(CommandSequence, SourceIndexMetadata); end; ! end; ! // Drop deleted fields ! for iField := 0 to SourceTableMetadata.FieldMetadataCount - 1 do ! begin ! SourceFieldMetadata := SourceTableMetadata.FieldMetadatas[iField]; ! { TODO : This only works for case-insensitive object names! } ! TargetFieldMetadata := TargetTableMetadata.FindFieldMetadata(AnsiUpperCase(SourceFieldMetadata.Name)); ! if not Assigned(TargetFieldMetadata) then ! AppendDropFieldCommand(CommandSequence, SourceFieldMetadata); ! end; ! end ! else ! AppendAddTableCommand(CommandSequence, TargetTableMetadata); ! end; ! // Drop deleted tables. ! for iTable := 0 to CommandSequence.SourceScheme.TableMetadataCount - 1 do ! begin ! SourceTableMetadata := CommandSequence.SourceScheme.TableMetadatas[iTable]; ! TargetTableMetadata := ! CommandSequence.TargetScheme.FindTableMetadata(SourceTableMetadata.Name); ! if not Assigned(TargetTableMetadata) then ! AppendDropTableCommand(CommandSequence, SourceTableMetadata); end; end; --- 97,207 ---- SourceFieldMetadata, TargetFieldMetadata: TInstantFieldMetadata; SourceIndexMetadata, TargetIndexMetadata: TInstantIndexMetadata; + + function ReadTableInfoSupported: Boolean; + begin + Result := (cfReadTableInfo in CommandSequence.SourceScheme.Catalog.Features) and + (cfReadTableInfo in CommandSequence.TargetScheme.Catalog.Features); + end; + + function ReadColumnInfoSupported: Boolean; + begin + Result := (cfReadColumnInfo in CommandSequence.SourceScheme.Catalog.Features) and + (cfReadColumnInfo in CommandSequence.TargetScheme.Catalog.Features); + end; + + function ReadIndexInfoSupported: Boolean; + begin + Result := (cfReadIndexInfo in CommandSequence.SourceScheme.Catalog.Features) and + (cfReadIndexInfo in CommandSequence.TargetScheme.Catalog.Features); + end; + begin ! if ReadTableInfoSupported then begin ! // Upgrade 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 ! if ReadColumnInfoSupported then begin ! // Add missing fields and alter modified fields ! for iField := 0 to TargetTableMetadata.FieldMetadataCount - 1 do ! begin ! TargetFieldMetadata := TargetTableMetadata.FieldMetadatas[iField]; ! { TODO : This only works for case-insensitive object names! } ! SourceFieldMetadata := SourceTableMetadata.FindFieldMetadata(AnsiUpperCase(TargetFieldMetadata.Name)); ! if Assigned(SourceFieldMetadata) then ! begin ! if not SourceFieldMetadata.Equals(TargetFieldMetadata) then ! AppendAlterFieldCommand(CommandSequence, SourceFieldMetadata, ! TargetFieldMetadata); ! end ! else ! AppendAddFieldCommand(CommandSequence, TargetFieldMetadata); ! end; ! end; ! if ReadIndexInfoSupported then begin ! // 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 ! begin ! { TODO : This only works for case-insensitive object names! } ! SourceIndexMetadata := SourceTableMetadata.FindIndexMetadata(AnsiUpperCase(TargetIndexMetadata.Name)); ! if Assigned(SourceIndexMetadata) then ! begin ! if not SourceIndexMetadata.Equals(TargetIndexMetadata) then ! AppendAlterIndexCommand(CommandSequence, SourceIndexMetadata, ! TargetIndexMetadata); ! end ! else ! AppendAddIndexCommand(CommandSequence, TargetIndexMetadata); ! end; ! end; ! // Drop deleted indexes ! for iIndex := 0 to SourceTableMetadata.IndexMetadataCount - 1 do ! begin ! SourceIndexMetadata := SourceTableMetadata.IndexMetadatas[iIndex]; ! if not (ixPrimary in SourceIndexMetadata.Options) then ! begin ! { TODO : This only works for case-insensitive object names! } ! TargetIndexMetadata := TargetTableMetadata.FindIndexMetadata(AnsiUpperCase(SourceIndexMetadata.Name)); ! if not Assigned(TargetIndexMetadata) then ! AppendDropIndexCommand(CommandSequence, SourceIndexMetadata); ! end; ! end; end; ! if ReadColumnInfoSupported then begin ! // Drop deleted fields ! for iField := 0 to SourceTableMetadata.FieldMetadataCount - 1 do ! begin ! SourceFieldMetadata := SourceTableMetadata.FieldMetadatas[iField]; ! { TODO : This only works for case-insensitive object names! } ! TargetFieldMetadata := TargetTableMetadata.FindFieldMetadata(AnsiUpperCase(SourceFieldMetadata.Name)); ! if not Assigned(TargetFieldMetadata) then ! AppendDropFieldCommand(CommandSequence, SourceFieldMetadata); ! end; end; ! end ! else ! AppendAddTableCommand(CommandSequence, TargetTableMetadata); ! end; ! // Drop deleted tables. ! for iTable := 0 to CommandSequence.SourceScheme.TableMetadataCount - 1 do ! begin ! SourceTableMetadata := CommandSequence.SourceScheme.TableMetadatas[iTable]; ! TargetTableMetadata := ! CommandSequence.TargetScheme.FindTableMetadata(SourceTableMetadata.Name); ! if not Assigned(TargetTableMetadata) then ! AppendDropTableCommand(CommandSequence, SourceTableMetadata); ! end; end; end; Index: InstantPersistence.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantPersistence.pas,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** InstantPersistence.pas 4 Sep 2005 23:15:54 -0000 1.54 --- InstantPersistence.pas 7 Sep 2005 10:52:04 -0000 1.55 *************** *** 390,393 **** --- 390,395 ---- end; + TInstantCatalogFeature = (cfReadTableInfo, cfReadColumnInfo, cfReadIndexInfo); + TInstantCatalogFeatures = set of TInstantCatalogFeature; // An object that provides the metadata info used by a TInstantScheme object // to build itself. It abstracts the way the information is fetched and its *************** *** 397,404 **** // Scheme.Catalog := Broker.CreateCatalog(Scheme); // and the object ownership is transferred to Scheme, which is then ! // responsible for destroying the catalog object. TInstantCatalog = class private FScheme: TInstantScheme; public // Creates an instance and binds it to the specified TInstantScheme object. --- 399,408 ---- // Scheme.Catalog := Broker.CreateCatalog(Scheme); // and the object ownership is transferred to Scheme, which is then ! // responsible for destroying the catalog object. TInstantCatalog = class private FScheme: TInstantScheme; + protected + function GetFeatures: TInstantCatalogFeatures; virtual; public // Creates an instance and binds it to the specified TInstantScheme object. *************** *** 411,414 **** --- 415,422 ---- procedure InitTableMetadatas(ATableMetadatas: TInstantTableMetadatas); virtual; abstract; + // Returns a set of supported features. The predefined implementation + // says that the catalog support everything; derived classes might not + // support all features. + property Features: TInstantCatalogFeatures read GetFeatures; end; *************** *** 15333,15336 **** --- 15341,15349 ---- end; + function TInstantCatalog.GetFeatures: TInstantCatalogFeatures; + begin + Result := [cfReadTableInfo, cfReadColumnInfo, cfReadIndexInfo]; + end; + { TInstantSQLBrokerCatalog } Index: InstantDBBuild.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantDBBuild.pas,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** InstantDBBuild.pas 4 Sep 2005 23:15:54 -0000 1.8 --- InstantDBBuild.pas 7 Sep 2005 10:52:04 -0000 1.9 *************** *** 591,609 **** 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 ! AppendDropTableCommand(CommandSequence, TargetTableMetadata); ! AppendAddTableCommand(CommandSequence, TargetTableMetadata); ! // 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; --- 591,617 ---- begin // Recreate tables. ! if (cfReadTableInfo in CommandSequence.SourceScheme.Catalog.Features) and ! (cfReadTableInfo in CommandSequence.TargetScheme.Catalog.Features) then begin ! 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 ! AppendDropTableCommand(CommandSequence, TargetTableMetadata); ! AppendAddTableCommand(CommandSequence, TargetTableMetadata); ! // Recreate indexes ! if (cfReadIndexInfo in CommandSequence.SourceScheme.Catalog.Features) and ! (cfReadIndexInfo in CommandSequence.TargetScheme.Catalog.Features) then ! begin ! 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; end; |