[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