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

marlon david de souza marlon em sysmo.com.br
Sex Jul 14 15:08:47 -03 2006


Nunca tive problema por não usar, tanto no Windows como no Linux.

Em Sex 14 Jul 2006 20:30, marcelo escreveu:
> 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




Mais detalhes sobre a lista de discussão lista