[firebase-br] UDF - Linux

marcelo marcelo em inovacao.inf.br
Qui Jul 13 10:27:02 -03 2006


Caros amigos da Lista.

Utilizo o Firebird já a um bom tempo e desde o inicio tive necessidade de criar algumas
rotinas proprias atraves das UDF. Fiz uma UDF própria para Windows ( Via Delphi ) e 
recompilava a mesma no Kylix para Linux. Tudo funcionou muito bem ate que tive a necessidade
de criar uma função para tratar Strings. No windows funcionou mas no linux o servidor de
banco trava quando faço a chamada da função.
Detalhes : Estou utilizando o Firebird 1.5.2 ( Windows e Linux ), Delphi 7 e Kylix 3.

Exemplo de uma UDF QUE ESTA FUNCIONANDO tanto em Windows quanto em Linux.
Declaracao :
DECLARE EXTERNAL FUNCTION truncnum
 DOUBLE PRECISION, INTEGER
 RETURNS DOUBLE PRECISION BY VALUE
 ENTRY_POINT 'Truncate' MODULE_NAME 'Nova_UDF';



Função no Delphi/Kylix
function Truncate(var W_Nr: Double; var W_Dec: Integer): Double; cdecl; export;
var
  W_Mult  Double;
begin

  W_Mult := W_Nr * 100;

end;

Esta função acima é somente para exemplificar, se eu fizer algo como 
SELECT TRUNCNUM(COLUNA1) FROM TABELA1, o Windows executa e o LInux também sem
problema nenhum.


Exemplo de uma UDF QUE ESTA FUNCIONANDO no Windows MAS NAO FUNCIONA em Linux.

Declaracao no banco:

DECLARE EXTERNAL FUNCTION CONECTA
 CSTRING(100)
 RETURNS CSTRING(100) FREE_IT
 ENTRY_POINT 'NConecta' MODULE_NAME 'Nova_UDF';

Função no Delphi/Kylix :

function NConecta(W_String: PChar): PChar; cdecl; export;

begin

  Result := 'Meu retorno';


end;

Esta função acima é somente para exemplificar, se eu fizer algo como 
SELECT CONECTA(COLUNA1) FROM TABELA1, o Windows executa mas o LInux Não.

Acredito que problema possa ser :
a) Na declaracao da UDF no banco, estou utilizando CSTring mas já tentei
enviar como CHAR e VARCHAR e também não resolveu. 
b) OU pode ser o tipo de dados que estou recebendo em minha DLL ( PChar ), 
utilizei PChar pois no Windows foi a unica maneira de funcionar.
C) Ou parametros cdecl que é declarado na DLL ( Não sei a diferença entre
cdecl e stdcall, por isso mantive a que vi em alguns exemplos. )



Se alguém tiver alguma dica agradeceria muito.

Marcelo


Mais detalhes sobre a lista de discussão lista