[firebase-br] UDF - Linux Para o Marlon David

marcelo marcelo em inovacao.inf.br
Sex Jul 14 17:30:40 -03 2006


Caro Marlon,

    Seu exemplo funcionou, tive que fazer uma alteração no código da função. 
Ao passar o resultado ao inves de usar o StrPCopy tive que usar
o Pchar(x) pois com o StrPCopy não funcionou. E outra coisa que estava 
errando era colocar o parametro FREE_IT na declaração do RETURNS
ou seja
DECLARE EXTERNAL FUNCTION Teste
        CSTRING(16)
        RETURNS CSTRING(12)  *** FREE_IT ****
        ENTRY_POINT 'Fn_Teste' MODULE_NAME 'udfteste.so';

Isto também faz com que a UDF não funcione em Linux pois no windows 
funcionou sem problema.
Lendo o manual do antigo Interbase 6.01 verifiquei que esta sugerindo sempre 
usar o FREE_IT quando retornar C String, CHAR ou VARCHAR.
Você tem notícias de que a não declaração do FREE_IT possa gerar algum 
problema de performance ou travar o banco ?
( Isto esta no PDF oficiais da borland, Developer´s Guide página 78 )

Também saberia me dizer porque o StrPCopy não funcionou e o Pchar(X) 
funcionou ??

Agradeço muito a atenção e paciência.
Marcelo

----- Original Message ----- 
From: "marlon david de souza" <marlon em sysmo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, July 13, 2006 1:29 PM
Subject: Re: [firebase-br] UDF - Linux Para o Marlon David


DECLARE EXTERNAL FUNCTION Teste
        CSTRING(16)
        RETURNS CSTRING(12)
        ENTRY_POINT 'Fn_Teste' MODULE_NAME 'udfteste.so';

function Fn_Teste(APrm1: PChar): PChar; cdecl; export;

.
.
.

function Fn_Teste(APrm1: PChar): PChar;
var
  sLinha: String;
begin
  sLinha := APrm1;
  .
  .
  StrPCopy(result, sLinha);
end;

Em Qui 13 Jul 2006 18:41, marcelo escreveu:
> Caro Marlon, primeiramente obrigado.
>
> Usei a sua sugestão, mas infelizmente não funcionou. Fiz um outro teste na
> UDF para que o resultado fosse numerico de acordo com o dado recebido.
> O que conclui é que a string não esta chegando corretamente. Pois fazendo
> um teste na UDF se o dado enviado fosse = "X" eu retornaria 0 caso
> contrário retornaria 1, sempre retornou 1 ou seja o problema é na chegada
> dos dados. Você já fez alguma UDF com string que funcionasse em Linux
> compilada com o Kylix ? Se sim pode me mandar um exemplo. ? Existe alguma
> configuração especial no FB para este tipo de UDF ?
>
> Marcelo
>
>
>
>
> ----- Original Message -----
> From: "marlon david de souza" <marlon em sysmo.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Thursday, July 13, 2006 11:16 AM
> Subject: Re: [firebase-br] UDF - Linux
>
>
> No Firebird defina os parametros string da função como sendo do tipo
> "CSTRING". Já no Kylix defina como sendo do tipo "PChar" e use o parametro
> "cdecl". Obs: para passar o resultado da função para a variável "result"
> use o comando "StrPCopy". Exemplo: StrPCopy(result, sVar1);
>
> Em Qui 13 Jul 2006 13:27, marcelo escreveu:
> > 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
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para editar sua configuração na lista, use o endereço
> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br Para
> > consultar mensagens antigas: http://firebase.com.br/pesquisa
>
> --
> Sem mais,
>
> ----------------------
> Marlon David de Souza
> Desenvolvimento
> Sysmo Informática Ltda

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa



-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.394 / Virus Database: 268.10.0/388 - Release Date: 13/07/2006






Mais detalhes sobre a lista de discussão lista