From: Nando D. <na...@us...> - 2005-07-15 10:32:05
|
Update of /cvsroot/instantobjects/Source/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28051/Core Modified Files: InstantPersistence.pas Log Message: refactored scheme building and field metadata classes; removed obsolete code for external storage Index: InstantPersistence.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantPersistence.pas,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** InstantPersistence.pas 14 Jul 2005 07:38:35 -0000 1.47 --- InstantPersistence.pas 15 Jul 2005 10:31:49 -0000 1.48 *************** *** 280,285 **** FOptions: TInstantFieldOptions; FSize: Integer; - FExternalTableName: string; - FOriginalAttributeType: TInstantAttributeType; FAlternateDataTypes: TInstantDataTypes; function GetCollection: TInstantFieldMetadatas; --- 280,283 ---- *************** *** 304,312 **** read FAlternateDataTypes write FAlternateDataTypes; property Options: TInstantFieldOptions read FOptions write FOptions; - property ExternalTableName: string read FExternalTableName write FExternalTableName; property Size: Integer read FSize write FSize; property TableMetadata: TInstantTableMetadata read GetTableMetadata; - property OriginalAttributeType: TInstantAttributeType - read FOriginalAttributeType write FOriginalAttributeType default atUnknown; end; --- 302,307 ---- *************** *** 318,323 **** constructor Create(AOwner: TInstantTableMetadata); procedure AddFieldMetadata(const AName: string; ADataType: TInstantDataType; ! ASize: Integer; AOriginalAttributeType: TInstantAttributeType; ! AOptions: TInstantFieldOptions = []; AExternalTableName: string = ''); function Add: TInstantFieldMetadata; function Find(const AName: string): TInstantFieldMetadata; --- 313,317 ---- constructor Create(AOwner: TInstantTableMetadata); procedure AddFieldMetadata(const AName: string; ADataType: TInstantDataType; ! ASize: Integer; AOptions: TInstantFieldOptions = []); function Add: TInstantFieldMetadata; function Find(const AName: string): TInstantFieldMetadata; *************** *** 2268,2272 **** function InternalGenerateCreateIndexSQL(Metadata: TInstantIndexMetadata): string; virtual; function InternalGenerateCreateTableSQL(Metadata: TInstantTableMetadata): string; virtual; - function InternalGenerateCreateExternalTableSQL(TableName: string): string; virtual; function InternalGenerateDeleteConcurrentSQL(Map: TInstantAttributeMap): string; virtual; function InternalGenerateDeleteSQL(Map: TInstantAttributeMap): string; virtual; --- 2262,2265 ---- *************** *** 2275,2279 **** function InternalGenerateDropIndexSQL(Metadata: TInstantIndexMetadata): string; virtual; function InternalGenerateDropTableSQL(Metadata: TInstantTableMetadata): string; virtual; - function InternalGenerateDropExternalTableSQL(TableName: string): string; virtual; function InternalGenerateInsertSQL(Map: TInstantAttributeMap): string; virtual; function InternalGenerateInsertExternalSQL(Map: TInstantAttributeMap): string; virtual; --- 2268,2271 ---- *************** *** 2292,2296 **** function GenerateCreateIndexSQL(Metadata: TInstantIndexMetadata): string; function GenerateCreateTableSQL(Metadata: TInstantTableMetadata): string; - function GenerateCreateExternalTableSQL(TableName: string): string; function GenerateDeleteConcurrentSQL(Map: TInstantAttributeMap): string; function GenerateDeleteSQL(Map: TInstantAttributeMap): string; --- 2284,2287 ---- *************** *** 2299,2303 **** function GenerateDropIndexSQL(Metadata: TInstantIndexMetadata): string; function GenerateDropTableSQL(Metadata: TInstantTableMetadata): string; - function GenerateDropExternalTableSQL(TableName: string): string; function GenerateInsertSQL(Map: TInstantAttributeMap): string; function GenerateInsertExternalSQL(Map: TInstantAttributeMap): string; --- 2290,2293 ---- *************** *** 3747,3751 **** begin inherited Create(ACollection); - FOriginalAttributeType := atUnknown; end; --- 3737,3740 ---- *************** *** 3787,3792 **** procedure TInstantFieldMetadatas.AddFieldMetadata(const AName: string; ! ADataType: TInstantDataType; ASize: Integer; AOriginalAttributeType: TInstantAttributeType; ! AOptions: TInstantFieldOptions = []; AExternalTableName: string = ''); begin with Add do --- 3776,3781 ---- procedure TInstantFieldMetadatas.AddFieldMetadata(const AName: string; ! ADataType: TInstantDataType; ASize: Integer; ! AOptions: TInstantFieldOptions = []); begin with Add do *************** *** 3795,3801 **** DataType := ADataType; Size := ASize; - OriginalAttributeType := AOriginalAttributeType; Options := AOptions; - ExternalTableName := AExternalTableName; end; end; --- 3784,3788 ---- *************** *** 12778,12787 **** end; - function TInstantSQLGenerator.GenerateCreateExternalTableSQL( - TableName: string): string; - begin - Result := InternalGenerateCreateExternalTableSQL(TableName); - end; - function TInstantSQLGenerator.GenerateCreateIndexSQL( Metadata: TInstantIndexMetadata): string; --- 12765,12768 ---- *************** *** 12814,12823 **** end; - function TInstantSQLGenerator.GenerateDropExternalTableSQL( - TableName: string): string; - begin - Result := InternalGenerateDropExternalTableSQL(TableName); - end; - function TInstantSQLGenerator.GenerateDropFieldSQL( Metadata: TInstantFieldMetadata): string; --- 12795,12798 ---- *************** *** 12909,12933 **** end; - function TInstantSQLGenerator.InternalGenerateCreateExternalTableSQL( - TableName: string): string; - var - Columns: string; - begin - Columns := EmbraceField(InstantIdFieldName) + ' ' + - Broker.DataTypeToColumnType(Broker.Connector.IdDataType, Broker.Connector.IdSize) + ' NOT NULL'; - Columns := Columns + ', ' + EmbraceField(InstantParentClassFieldName) + ' ' + - Broker.DataTypeToColumnType(dtString, InstantDefaultFieldSize); - Columns := Columns + ', ' + EmbraceField(InstantParentIdFieldName) + ' ' + - Broker.DataTypeToColumnType(Broker.Connector.IdDataType, Broker.Connector.IdSize); - Columns := Columns + ', ' + EmbraceField(InstantChildClassFieldName) + ' ' + - Broker.DataTypeToColumnType(dtString, InstantDefaultFieldSize); - Columns := Columns + ', ' + EmbraceField(InstantChildIdFieldName) + ' ' + - Broker.DataTypeToColumnType(Broker.Connector.IdDataType, Broker.Connector.IdSize); - Columns := Columns + ', ' + EmbraceField(InstantSequenceNoFieldName) + ' ' + - Broker.DataTypeToColumnType(dtInteger, InstantDefaultFieldSize); - Columns := Columns + ', PRIMARY KEY (' + EmbraceField(InstantIdFieldName) + ')'; - Result := Format('CREATE TABLE %s (%s)', [EmbraceTable(TableName), Columns] ); - end; - function TInstantSQLGenerator.InternalGenerateCreateIndexSQL( Metadata: TInstantIndexMetadata): string; --- 12884,12887 ---- *************** *** 12960,12972 **** FieldMetadata := FieldMetadatas[I]; with FieldMetadata do ! // Not an "external" field ! if ExternalTableName = '' then ! begin ! if I > 0 then ! Columns := Columns + ', '; ! Columns := Columns + EmbraceField(Name) + ' ' + Broker.DataTypeToColumnType(DataType, Size); ! if foRequired in Options then ! Columns := Columns + ' NOT NULL'; ! end; end; PrimaryKey := ''; --- 12914,12924 ---- FieldMetadata := FieldMetadatas[I]; with FieldMetadata do ! begin ! if I > 0 then ! Columns := Columns + ', '; ! Columns := Columns + EmbraceField(Name) + ' ' + Broker.DataTypeToColumnType(DataType, Size); ! if foRequired in Options then ! Columns := Columns + ' NOT NULL'; ! end; end; PrimaryKey := ''; *************** *** 13012,13021 **** end; - function TInstantSQLGenerator.InternalGenerateDropExternalTableSQL( - TableName: string): string; - begin - Result := Format('DROP TABLE %s', [EmbraceTable(TableName)]); - end; - function TInstantSQLGenerator.InternalGenerateDropFieldSQL( Metadata: TInstantFieldMetadata): string; --- 12964,12967 ---- *************** *** 13242,13250 **** TableMetadata: TInstantTableMetadata; IndexMetadata: TInstantIndexMetadata; - FieldMetadata: TInstantFieldMetadata; begin if not Assigned(Scheme) then Exit; with Scheme do for I := 0 to Pred(TableMetadataCount) do begin --- 13188,13196 ---- TableMetadata: TInstantTableMetadata; IndexMetadata: TInstantIndexMetadata; begin if not Assigned(Scheme) then Exit; with Scheme do + begin for I := 0 to Pred(TableMetadataCount) do begin *************** *** 13254,13277 **** except end; - for J := 0 to Pred(TableMetadata.FieldMetadatas.Count) do - begin - FieldMetadata := TableMetadata.FieldMetadatas[J]; - if FieldMetadata.ExternalTableName <> '' then - begin - try - Execute(Generator.GenerateDropExternalTableSQL(FieldMetadata.ExternalTableName)); - except - end; - end; - end; - Execute(Generator.GenerateCreateTableSQL(TableMetadata)); - for J := 0 to Pred(TableMetadata.FieldMetadatas.Count) do - begin - FieldMetadata := TableMetadata.FieldMetadatas[J]; - if FieldMetadata.ExternalTableName <> '' then - Execute(Generator.GenerateCreateExternalTableSQL(FieldMetadata.ExternalTableName)); - end; with TableMetadata do for J := 0 to Pred(IndexMetadatas.Count) do begin --- 13200,13206 ---- except end; Execute(Generator.GenerateCreateTableSQL(TableMetadata)); with TableMetadata do + begin for J := 0 to Pred(IndexMetadatas.Count) do begin *************** *** 13280,13284 **** --- 13209,13215 ---- Execute(Generator.GenerateCreateIndexSQL(IndexMetadata)); end; + end; end; + end; end; *************** *** 15265,15269 **** --- 15196,15230 ---- I: Integer; TableMetadata: TInstantTableMetadata; + AttributeMetadata: TInstantAttributeMetadata; Options: TInstantFieldOptions; + + // Adds a table metadata definition matching AttributeMetadata, which + // must have StorageKind = skEmbedded. + procedure AddExternalTableMetadata; + var + TableMetadata: TInstantTableMetadata; + begin + TableMetadata := ATableMetadatas.Add; + with TableMetadata do + begin + Name := AttributeMetadata.ExternalStorageName; + // The structure of an external table is fixed. + FieldMetadatas.AddFieldMetadata(InstantIdFieldName, Scheme.IdDataType, + Scheme.IdSize, [foRequired, foIndexed]); + FieldMetadatas.AddFieldMetadata(InstantParentClassFieldName, dtString, + InstantDefaultFieldSize); + FieldMetadatas.AddFieldMetadata(InstantParentIdFieldName, Scheme.IdDataType, + Scheme.IdSize); + FieldMetadatas.AddFieldMetadata(InstantChildClassFieldName, dtString, + InstantDefaultFieldSize); + FieldMetadatas.AddFieldMetadata(InstantChildIdFieldName, Scheme.IdDataType, + Scheme.IdSize); + FieldMetadatas.AddFieldMetadata(InstantSequenceNoFieldName, dtInteger, + InstantDefaultFieldSize); + IndexMetadatas.AddIndexMetadata('', InstantIdFieldName, + [ixPrimary, ixUnique]); + end; + end; + begin TableMetadata := ATableMetadatas.Add; *************** *** 15272,15337 **** Name := Map.Name; ! { Class + Id + UpdateCount} FieldMetadatas.AddFieldMetadata(InstantClassFieldName, dtString, ! InstantDefaultFieldSize, atUnknown, [foRequired, foIndexed]); FieldMetadatas.AddFieldMetadata(InstantIdFieldName, Scheme.IdDataType, ! Scheme.IdSize, atUnknown, [foRequired, foIndexed]); ! FieldMetadatas.AddFieldMetadata(InstantUpdateCountFieldName, dtInteger, 0, ! atUnknown); IndexMetadatas.AddIndexMetadata('', InstantIndexFieldNames, [ixPrimary, ixUnique]); ! { Other } for I := 0 to Pred(Map.Count) do ! with Map[I] do begin ! if AttributeType = atReference then ! begin ! FieldMetadatas.AddFieldMetadata(FieldName + InstantClassFieldName, ! Scheme.AttributeTypeToDataType(atString), InstantDefaultFieldSize, ! AttributeType); ! FieldMetadatas.AddFieldMetadata(FieldName + InstantIdFieldName, ! Scheme.IdDataType, Scheme.IdSize, AttributeType); ! end ! else if AttributeType = atPart then begin ! if StorageKind = skEmbedded then ! FieldMetadatas.AddFieldMetadata(FieldName, ! Scheme.AttributeTypeToDataType(AttributeType), ! Size, AttributeType, []) ! else if StorageKind = skExternal then ! begin ! FieldMetadatas.AddFieldMetadata(FieldName + InstantClassFieldName, ! Scheme.AttributeTypeToDataType(atString), InstantDefaultFieldSize, ! AttributeType); ! FieldMetadatas.AddFieldMetadata(FieldName + InstantIdFieldName, ! Scheme.IdDataType, Scheme.IdSize, AttributeType); ! end; ! end ! else if AttributeType in [atParts, atReferences] then begin ! if StorageKind = skEmbedded then ! FieldMetadatas.AddFieldMetadata(FieldName, ! Scheme.AttributeTypeToDataType(AttributeType), Size, ! AttributeType, []) ! else if StorageKind = skExternal then ! FieldMetadatas.AddFieldMetadata(FieldName, ! Scheme.AttributeTypeToDataType(AttributeType), ! Size, AttributeType, [], ExternalStorageName) end else ! begin ! if IsIndexed then ! begin ! IndexMetadatas.AddIndexMetadata(Map.Name + FieldName, FieldName, []); ! Options := [foIndexed]; ! end ! else ! Options := []; ! FieldMetadatas.AddFieldMetadata(FieldName, ! Scheme.AttributeTypeToDataType(AttributeType), ! Size, AttributeType, Options); ! end; end; end; end; --- 15233,15294 ---- Name := Map.Name; ! // Class + Id + UpdateCount. FieldMetadatas.AddFieldMetadata(InstantClassFieldName, dtString, ! InstantDefaultFieldSize, [foRequired, foIndexed]); FieldMetadatas.AddFieldMetadata(InstantIdFieldName, Scheme.IdDataType, ! Scheme.IdSize, [foRequired, foIndexed]); ! FieldMetadatas.AddFieldMetadata(InstantUpdateCountFieldName, dtInteger, 0); IndexMetadatas.AddIndexMetadata('', InstantIndexFieldNames, [ixPrimary, ixUnique]); ! // Other. for I := 0 to Pred(Map.Count) do ! begin ! AttributeMetadata := Map[I]; ! if AttributeMetadata.AttributeType = atReference then begin ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName + InstantClassFieldName, ! Scheme.AttributeTypeToDataType(atString), InstantDefaultFieldSize); ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName + InstantIdFieldName, ! Scheme.IdDataType, Scheme.IdSize); ! end ! else if AttributeMetadata.AttributeType = atPart then ! begin ! if AttributeMetadata.StorageKind = skEmbedded then ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName, ! Scheme.AttributeTypeToDataType(AttributeMetadata.AttributeType), ! AttributeMetadata.Size) ! else if AttributeMetadata.StorageKind = skExternal then begin ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName + InstantClassFieldName, ! Scheme.AttributeTypeToDataType(atString), InstantDefaultFieldSize); ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName + InstantIdFieldName, ! Scheme.IdDataType, Scheme.IdSize); ! end; ! end ! else if AttributeMetadata.AttributeType in [atParts, atReferences] then ! begin ! if AttributeMetadata.StorageKind = skEmbedded then ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName, ! Scheme.AttributeTypeToDataType(AttributeMetadata.AttributeType), ! AttributeMetadata.Size) ! else if AttributeMetadata.StorageKind = skExternal then ! AddExternalTableMetadata; ! end ! else ! begin ! if AttributeMetadata.IsIndexed then begin ! IndexMetadatas.AddIndexMetadata(Map.Name + ! AttributeMetadata.FieldName, AttributeMetadata.FieldName, []); ! Options := [foIndexed]; end else ! Options := []; ! FieldMetadatas.AddFieldMetadata(AttributeMetadata.FieldName, ! Scheme.AttributeTypeToDataType(AttributeMetadata.AttributeType), ! AttributeMetadata.Size, Options); end; + end; end; end; |