[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