[firebase-br] problema com a biblioteca rfunc

Edson T. Marques marques em oriontec.com.br
Ter Out 19 15:11:43 -03 2004


Olá pessoal;

Já mandei essa mensagem para tudo enquanto é link relacionado com a rfunc e 
com a Polaris, mas ninguém me ajuda.

Espero que alguém entre vocês possam me dar uma mão!

Trabalho aqui com a rFunc, que é uma ótima library de UDFs, só que eu 
necessitava de uma UDF para calcular a data de aniversário dos clientes 
cadastrados na minha tabela de clientes. Então, pesando que seria simples 
(não tenho experiência com programação C) fiz o seguinte:

no final da unidade rdatetime.c, eu fiz assim: 
  
 ISC_QUAD* EXPORT fn_aniversario(ARG(ISC_QUAD*, nasc), ARG(ISC_QUAD*, hoje)) 
 ARGLIST(ISC_QUAD *nasc) 
 ARGLIST(ISC_QUAD *hoje) 
 { 
 ISC_QUAD *bufquad = (ISC_QUAD *) MALLOC (sizeof(ISC_QUAD));  
 long dia = fn_day(nasc); 
 long mes = fn_month(nasc); 
 long ano = fn_year(hoje); 
 int bis = ((fn_mod(ano, 4) == 0) &&  
 (fn_mod(ano, 100) != 0) &&  
 (fn_mod(ano, 400) == 0) &&  
 (fn_mod(ano, 3300) != 0)); 
  
 mes = ((mes == 2) && (dia == 29) && (bis == 0)) ? 3 : mes; 
 dia = ((mes == 2) && (dia == 29) && (bis == 0)) ? 1 : dia; 
 ano = (fn_yearday(hoje) > fn_yearday(nasc)) ? (ano + 1) : ano; 
 bufquad = fn_encodedate(mes, dia, ano); 
  
 return bufquad; 
 } 
  
E no final da unidade rdatetime.h, eu fiz assim:
  
 ISC_QUAD* EXPORT fn_aniversario(ARG(ISC_QUAD*, nasc), ARG(ISC_QUAD*, hoje)); 
  
Daí eu compilei novamente a rfunc usando o gcc (linux) (eu já tinha feito isso 
com o código original porque baixei todas as atualizações do sourceforge). 
Então eu coloquei a nova rFunc no lugar da antiga 
em /usr/local/firebird/UDF/, e declarei a UDF no meu banco assim:
  
 DECLARE EXTERNAL FUNCTION ANIVERSARIO 
 DATE, DATE 
 RETURNS DATE FREE_IT 
 ENTRY_POINT 'fn_aniversario' MODULE_NAME 'rfunc'; 

depois assim:

 DECLARE EXTERNAL FUNCTION ANIVERSARIO 
 DATE, DATE 
 RETURNS DATE
 ENTRY_POINT 'fn_aniversario' MODULE_NAME 'rfunc'; 

depois assim:

 DECLARE EXTERNAL FUNCTION ANIVERSARIO 
 TIMESTAMP, TIMESTAMP 
 RETURNS TIMESTAMP  FREE_IT
 ENTRY_POINT 'fn_aniversario' MODULE_NAME 'rfunc'; 

depois assim:

 DECLARE EXTERNAL FUNCTION ANIVERSARIO 
 TIMESTAMP, TIMESTAMP 
 RETURNS TIMESTAMP 
 ENTRY_POINT 'fn_aniversario' MODULE_NAME 'rfunc'; 

...dropando e redeclarando para toda vez que dava errado.

Mas não  teve jeito sempre que usei a função no campo aniversário assim:

ALTER TABLE CLIENTES add ANIVERSARIO COMPUTED BY (Aniversario(NASCIMENTO, 
CURRENT_DATE)) 

o banco de dados ameaça fazer o servidor cair e eu recebia uma mensagem de 
violação de memória e o firebird me desconectava.

Onde foi que eu errei?

Desde já agradeço!

Edson T. Marques
marques em oriontec.com.br




Mais detalhes sobre a lista de discussão lista