From: <sr...@us...> - 2006-02-17 03:05:39
|
Revision: 611 Author: srmitch Date: 2006-02-16 19:05:20 -0800 (Thu, 16 Feb 2006) ViewCVS: http://svn.sourceforge.net/instantobjects?rev=611&view=rev Log Message: ----------- Changes: 1. Updated InstantIBFbCatalog to allow for the skipping of unsupported data types with warning during database evolve. 2. A bug fix to InstantNexusDBCatalog previous update. Modified Paths: -------------- trunk/Source/Brokers/NexusDb/InstantNexusDBCatalog.pas trunk/Source/Catalogs/IBFb/InstantIBFbCatalog.pas Modified: trunk/Source/Brokers/NexusDb/InstantNexusDBCatalog.pas =================================================================== --- trunk/Source/Brokers/NexusDb/InstantNexusDBCatalog.pas 2006-02-16 22:49:16 UTC (rev 610) +++ trunk/Source/Brokers/NexusDb/InstantNexusDBCatalog.pas 2006-02-17 03:05:20 UTC (rev 611) @@ -176,11 +176,11 @@ FieldMetadata.Size := Fields.FieldByName('FIELD_UNITS').AsInteger else FieldMetadata.Size := Fields.FieldByName('FIELD_LENGTH').AsInteger; - Fields.Next; end else DoWarning(Format(SUnsupportedColumnSkipped, [TableMetadata.Name, FieldMetadata.Name, FieldDataType])); + Fields.Next; end; finally Fields.Close; Modified: trunk/Source/Catalogs/IBFb/InstantIBFbCatalog.pas =================================================================== --- trunk/Source/Catalogs/IBFb/InstantIBFbCatalog.pas 2006-02-16 22:49:16 UTC (rev 610) +++ trunk/Source/Catalogs/IBFb/InstantIBFbCatalog.pas 2006-02-17 03:05:20 UTC (rev 611) @@ -24,6 +24,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): + * Steven Mitchell * * ***** END LICENSE BLOCK ***** *) @@ -49,13 +50,13 @@ procedure AddFieldMetadatas(TableMetadata: TInstantTableMetadata); procedure AddIndexMetadatas(TableMetadata: TInstantTableMetadata); procedure AddTableMetadatas(TableMetadatas: TInstantTableMetadatas); - // Returns the TInstantDataType value that matches the supplied - // combination of ColumnType, BlobSubType and FieldScale. If more than - // on datatypes apply, alternate data types are returned in + // Returns True if the TInstantDataType value that matches the supplied + // combination of ColumnType, BlobSubType and FieldScale is found. If + // more than one datatypes apply, alternate data types are returned in // AlternateDataTypes, otherwise AlternateDataTypes is [] on exit. function ColumnTypeToDataType(const ColumnType: string; - const BlobSubType, FieldScale: Integer; - out AlternateDataTypes: TInstantDataTypes): TInstantDataType; + const BlobSubType, FieldScale: Integer; out DataType: TInstantDataType; + out AlternateDataTypes: TInstantDataTypes): Boolean; function GetSelectFieldsSQL(const ATableName: string): string; function GetSelectIndexesSQL(const ATableName: string): string; function GetSelectIndexFieldsSQL(const AIndexName: string): string; @@ -68,7 +69,7 @@ implementation uses - SysUtils, Classes, DB; + SysUtils, Classes, DB, InstantConsts; { TInstantIBFbCatalog } @@ -139,6 +140,7 @@ Fields: TDataSet; FieldMetadata: TInstantFieldMetadata; AlternateDataTypes: TInstantDataTypes; + FieldMetaDataType: TInstantDataType; begin Fields := Broker.AcquireDataSet(GetSelectFieldsSQL(TableMetadata.Name)); try @@ -148,21 +150,29 @@ begin FieldMetadata := TableMetadata.FieldMetadatas.Add; FieldMetadata.Name := Trim(Fields.FieldByName('RDB$FIELD_NAME').AsString); - FieldMetadata.DataType := ColumnTypeToDataType( + if ColumnTypeToDataType( Trim(Fields.FieldByName('RDB$TYPE_NAME').AsString), Fields.FieldByName('RDB$FIELD_SUB_TYPE').AsInteger, Fields.FieldByName('RDB$FIELD_SCALE').AsInteger, - AlternateDataTypes); - FieldMetadata.AlternateDataTypes := AlternateDataTypes; - FieldMetadata.Options := []; - if Fields.FieldByName('RDB$NULL_FLAG').AsInteger <> 0 then - FieldMetadata.Options := FieldMetadata.Options + [foRequired]; - if TableMetadata.IndexMetadatas.IsFieldIndexed(FieldMetadata) then - FieldMetadata.Options := FieldMetadata.Options + [foIndexed]; - if FieldMetadata.DataType = dtString then - FieldMetadata.Size := Fields.FieldByName('RDB$CHARACTER_LENGTH').AsInteger + FieldMetaDataType, + AlternateDataTypes) then + begin + FieldMetadata.DataType := FieldMetaDataType; + FieldMetadata.AlternateDataTypes := AlternateDataTypes; + FieldMetadata.Options := []; + if Fields.FieldByName('RDB$NULL_FLAG').AsInteger <> 0 then + FieldMetadata.Options := FieldMetadata.Options + [foRequired]; + if TableMetadata.IndexMetadatas.IsFieldIndexed(FieldMetadata) then + FieldMetadata.Options := FieldMetadata.Options + [foIndexed]; + if FieldMetadata.DataType = dtString then + FieldMetadata.Size := Fields.FieldByName('RDB$CHARACTER_LENGTH').AsInteger + else + FieldMetadata.Size := Fields.FieldByName('RDB$FIELD_LENGTH').AsInteger; + end else - FieldMetadata.Size := Fields.FieldByName('RDB$FIELD_LENGTH').AsInteger; + DoWarning(Format(SUnsupportedColumnSkipped, + [TableMetadata.Name, FieldMetadata.Name, + Trim(Fields.FieldByName('RDB$TYPE_NAME').AsString)])); Fields.Next; end; finally @@ -202,35 +212,37 @@ end; function TInstantIBFbCatalog.ColumnTypeToDataType(const ColumnType: string; - const BlobSubType, FieldScale: Integer; - out AlternateDataTypes: TInstantDataTypes): TInstantDataType; + const BlobSubType, FieldScale: Integer; out DataType: TInstantDataType; + out AlternateDataTypes: TInstantDataTypes): Boolean; begin AlternateDataTypes := []; + Result := True; { TODO : How to use FieldScale? } if SameText(ColumnType, 'TEXT') or SameText(ColumnType, 'VARYING') then - Result := dtString - else if SameText(ColumnType, 'SHORT') then begin - Result := dtBoolean; + DataType := dtString + else if SameText(ColumnType, 'SHORT') then + begin + DataType := dtBoolean; Include(AlternateDataTypes, dtInteger); end else if SameText(ColumnType, 'LONG') then - Result := dtInteger + DataType := dtInteger else if SameText(ColumnType, 'FLOAT') or SameText(ColumnType, 'DOUBLE') then - Result := dtFloat + DataType := dtFloat else if SameText(ColumnType, 'TIMESTAMP') or SameText(ColumnType, 'DATE') or SameText(ColumnType, 'TIME')then - Result := dtDateTime + DataType := dtDateTime else if SameText(ColumnType, 'BLOB') then begin if BlobSubType = 1 then - Result := dtMemo + DataType := dtMemo else - Result := dtBlob; + DataType := dtBlob; end else if SameText(ColumnType, 'INT64') then - Result := dtCurrency + DataType := dtCurrency else - raise Exception.CreateFmt('ColumnType %s not supported.', [ColumnType]); + Result := False; end; function TInstantIBFbCatalog.GetSelectFieldsSQL( |