Update of /cvsroot/instantobjects/Source/Catalogs/IBFb
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16891/Catalogs/IBFb
Modified Files:
InstantIBFbCatalog.pas
Log Message:
added support for alternate data type for a database column; fixes some mapping problems that prevent recognizing f. ex. a boolean field in IB/Fb during database evolution
Index: InstantIBFbCatalog.pas
===================================================================
RCS file: /cvsroot/instantobjects/Source/Catalogs/IBFb/InstantIBFbCatalog.pas,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** InstantIBFbCatalog.pas 26 Jun 2005 13:29:46 -0000 1.2
--- InstantIBFbCatalog.pas 13 Jul 2005 09:47:50 -0000 1.3
***************
*** 15,20 ****
procedure AddIndexMetadatas(TableMetadata: TInstantTableMetadata);
procedure AddTableMetadatas(TableMetadatas: TInstantTableMetadatas);
function ColumnTypeToDataType(const ColumnType: string;
! const BlobSubType, FieldScale: Integer): TInstantDataType;
function GetSelectFieldsSQL(const ATableName: string): string;
function GetSelectIndexesSQL(const ATableName: string): string;
--- 15,25 ----
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
+ // AlternateDataTypes, otherwise AlternateDataTypes is [] on exit.
function ColumnTypeToDataType(const ColumnType: string;
! const BlobSubType, FieldScale: Integer;
! out AlternateDataTypes: TInstantDataTypes): TInstantDataType;
function GetSelectFieldsSQL(const ATableName: string): string;
function GetSelectIndexesSQL(const ATableName: string): string;
***************
*** 99,102 ****
--- 104,108 ----
Fields: TDataSet;
FieldMetadata: TInstantFieldMetadata;
+ AlternateDataTypes: TInstantDataTypes;
begin
Fields := Broker.AcquireDataSet(GetSelectFieldsSQL(TableMetadata.Name));
***************
*** 111,115 ****
Trim(Fields.FieldByName('RDB$TYPE_NAME').AsString),
Fields.FieldByName('RDB$FIELD_SUB_TYPE').AsInteger,
! Fields.FieldByName('RDB$FIELD_SCALE').AsInteger);
FieldMetadata.Options := [];
if Fields.FieldByName('RDB$NULL_FLAG').AsInteger <> 0 then
--- 117,123 ----
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
***************
*** 161,170 ****
function TInstantIBFbCatalog.ColumnTypeToDataType(const ColumnType: string;
! const BlobSubType, FieldScale: Integer): TInstantDataType;
begin
{ TODO : How to use FieldScale? }
if SameText(ColumnType, 'TEXT') or SameText(ColumnType, 'VARYING') then
Result := dtString
! else if SameText(ColumnType, 'SHORT') or SameText(ColumnType, 'LONG') then
Result := dtInteger
else if SameText(ColumnType, 'FLOAT') or SameText(ColumnType, 'DOUBLE') then
--- 169,184 ----
function TInstantIBFbCatalog.ColumnTypeToDataType(const ColumnType: string;
! const BlobSubType, FieldScale: Integer;
! out AlternateDataTypes: TInstantDataTypes): TInstantDataType;
begin
+ AlternateDataTypes := [];
{ 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;
! Include(AlternateDataTypes, dtInteger);
! end
! else if SameText(ColumnType, 'LONG') then
Result := dtInteger
else if SameText(ColumnType, 'FLOAT') or SameText(ColumnType, 'DOUBLE') then
***************
*** 180,183 ****
--- 194,199 ----
Result := dtBlob;
end
+ else if SameText(ColumnType, 'INT64') then
+ Result := dtCurrency
else
raise Exception.CreateFmt('ColumnType %s not supported.', [ColumnType]);
|