Ao tentar instalar ou utilizar componentes como UniDAC e EHLib em ambientes Lazarus configurados com Free Pascal Compiler (FPC) versão 3.3.1, podem surgir erros de compilação ou comportamento inesperado. A causa principal reside em uma atualização significativa na enumeração TFieldType do FPC 3.3.1, que introduziu sete novos tipos de campo em comparação com a versão 3.2.2.
O Problema: Novas Definições em TFieldType
A versão 3.3.1 do FPC expandiu a enumeração TFieldType para incluir tipos adicionais que não existiam nas versões anteriores. Essa alteração é fundamental, pois bibliotecas de acesso a dados como UniDAC e EHLib dependem da estrutura completa de TFieldType para mapear e manipular dados. Quando essas bibliotecas são compiladas com uma versão do FPC que possui uma enumeração TFieldType maior do que a esperada por seu código-fonte, os arrays de mapeamento internos tornam-se inconsistentes, resultando em falhas.
Os novos tipos de campo adicionados são:
ftOraTimeStampftOraIntervalftLongWordftShortintftByteftExtendedftSingle
Solução: Atualizando os Mapeamentos de Tipos
Para resolver essa incompatibilidade, é necessário modificar manualmante os arquivos-fonte de UniDAC e EHLib que contêm os arrays de mapeamento de tipos de campo. As alterações envolvem adicionar entradas corerspondentes aos sete novos tipos de TFieldType nesses arrays. Embora alguns desses novos tipos possam ser mapeados para um tipo "desconhecido" ou "vazio" inicialmente, é crucial garantir que o array tenha o tammanho correto para acomodar todos os membros da enumeração TFieldType do FPC 3.3.1.
Modificações no UniDAC
Os seguintes arquivos do UniDAC requerem ajustes:
1. MemDS.pas
No arquivo MemDS.pas, localize a constante DataTypeMap e adicione as entradas para os novos tipos de campo dentro do bloco de compilação condicional para FPC:
const
DataTypeMap: array [TFieldType] of word = (
// ... (outros mapeamentos existentes) ...
// ftTimeStamp, ftFMTBcd
{$IFNDEF FPC}, dtSQLTimeStamp{$ELSE}, 0{$ENDIF}, dtFmtBCD
{$IFDEF FPC}
// ftFixedWideChar, ftWideMemo
, dtWideString, dtWideMemo
{$if FPC_FULLVERSION > 30202} // Novas tipos introduzidos no FPC 3.3.1+
, dtUnknown // ftOraTimeStamp
, dtUnknown // ftOraInterval
, dtUnknown // ftLongWord
, dtUnknown // ftShortint
, dtUnknown // ftByte
, dtUnknown // ftExtended
, dtUnknown // ftSingle
{$endif}
{$ENDIF}
// ... (outros blocos condicionais se existirem) ...
);
2. OraServicesUni.pas
No arquivo OraServicesUni.pas, ajuste a constante OraDataTypeMap. Este arquivo já oferece mapeamentos mais específicos para alguns dos novos tipos:
const
OraDataTypeMap: array [TFieldType] of word = (
// ... (outros mapeamentos existentes) ...
// ftVariant, ftInterface, ftIDispatch, ftGuid,
0, 0, 0, dtGuid,
// ftTimeStamp, ftFMTBcd,
{$IFNDEF FPC}dtSQLTimeStamp,{$ELSE}0,{$ENDIF} dtFMTBcd
{$IFDEF FPC}
// ftFixedWideChar, ftWideMemo,
, dtFixedWideChar, dtWideMemo
{$if FPC_FULLVERSION > 30202} // Mapeamento para tipos adicionais do FPC 3.3.1+
, 0 // ftOraTimeStamp
, 0 // ftOraInterval
, dtUInt32 // ftLongWord
, dtInt8 // ftShortint
, dtUInt8 // ftByte
, dtExtended // ftExtended
, dtSingle // ftSingle
{$endif}
{$ENDIF}
// ... (outros blocos condicionais se existirem) ...
);
3. VirtualQuery.pas
No arquivo VirtualQuery.pas, modifique a constante DataTypeMap de forma similar a MemDS.pas:
const
DataTypeMap: array [TFieldType] of word = (
// ... (outros mapeamentos existentes) ...
// ftVariant, ftInterface, ftIDispatch, ftGuid
dtVariant, 0, 0, dtGuid
// ftTimeStamp, ftFMTBcd
{$IFNDEF FPC}, dtSQLTimeStamp{$ELSE}, 0{$ENDIF}, dtFmtBCD
{$IFDEF FPC}
// ftFixedWideChar, ftWideMemo
, dtWideString, dtWideMemo
{$if FPC_FULLVERSION >= 30301} // FPC 3.3.1 ou superior
, dtUnknown // ftOraTimeStamp
, dtUnknown // ftOraInterval
, dtUnknown // ftLongWord
, dtUnknown // ftShortint
, dtUnknown // ftByte
, dtUnknown // ftExtended
, dtUnknown // ftSingle
{$endif}
{$ENDIF}
// ... (outros blocos condicionais se existirem) ...
);
4. DAParamsFrame.pas
No arquivo DAParamsFrame.pas, ajuste o array FieldTypeVarMap dentro do bloco condicional do FPC:
{$IFDEF FPC}
const
FieldTypeVarMap: array[TFieldType] of Word = (
varEmpty, varString, varInteger, varInteger, varInteger,
varBoolean, varDouble, varCurrency, varCurrency, varDate, varDate, varDate,
varEmpty, varEmpty, varInteger, varEmpty, varString, varEmpty,
varEmpty, varEmpty, varEmpty, varEmpty, varEmpty, varString, varOleStr,
varEmpty, varEmpty, varEmpty, varEmpty, varEmpty, varEmpty, varEmpty,
varVariant, varUnknown, varDispatch, varString, varEmpty, varEmpty,
varOleStr, varOleStr
{$if FPC_FULLVERSION > 30202} // Novas entradas para FPC 3.3.1+
, varEmpty // ftOraTimeStamp
, varEmpty // ftOraInterval
, varEmpty // ftLongWord
, varEmpty // ftShortint
, varEmpty // ftByte
, varEmpty // ftExtended
, varEmpty // ftSingle
{$endif}
);
{$ENDIF}
Modificações no EHLib
Para EHLib, a modificação é necessária no seguinte arquivo:
1. MemTableDataEh.pas
No arquivo MemTableDataEh.pas, adicione as entradas correspondentes na variável DefaultDataFieldClasses:
var
DefaultDataFieldClasses: array[TFieldType] of TMTDataFieldClassEh = (
// ... (outros mapeamentos existentes) ...
TMTStringDataFieldEh { ftGuid }
, TMTSQLTimeStampDataFieldEh { ftTimeStamp }
, TMTNumericDataFieldEh { ftFMTBCD }
{$IFDEF FPC}
, nil // ftFixedWideChar (ou mapeamento mais específico, se aplicável)
, nil // ftWideMemo (ou mapeamento mais específico, se aplicável)
{$ELSE}
// ... (blocos para outras versões, se existirem) ...
{$ENDIF}
{$IFDEF EH_LIB_13}
, TMTSQLTimeStampDataFieldEh { ftTimeStampOffset }
, nil { ftObject }
, TMTNumericDataFieldEh { ftSingle }
{$ENDIF}
{$if FPC_FULLVERSION > 30202} // Novas entradas para FPC 3.3.1+
, nil // ftOraTimeStamp
, nil // ftOraInterval
, nil // ftLongWord
, nil // ftShortint
, nil // ftByte
, nil // ftExtended
, nil // ftSingle
{$endif}
);
Após realizar essas modificações nos respectivos arquivos-fonte e recompilar os pacotes UniDAC e EHLib no seu ambiente Lazarus/FPC 3.3.1, a instalação e o uso dos componentes devem ocorrer sem os problemas de compatibilidade mencionados. Este método pode ser adaptado para outros componentes que enfrentem desafios semelhantes devido a alterações na estrutura de tipos de dados do Free Pascal Compiler.