From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Nicolás Domínguez Florit <ndomin(at)rec(dot)unicen(dot)edu(dot)ar> |
Cc: | Jaime Casanova <systemguards(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Compilar una funcion en C |
Date: | 2006-06-28 14:18:56 |
Message-ID: | 20060628141856.GC4414@surnet.cl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Nicolás Domínguez Florit escribió:
> Con respecto a 2) lo maximo que logre fue compilar una funcion C que
> contenia el siguiente codigo:
> int add_one(int arg)
> { return arg + 1; }
Eso no te sirve, porque tienes que declarar la funcion usando "el
protocolo fmgr V1". Es un Postgres-ismo que se usa para pasar y
retornar argumentos.
Por ej.
#include "postgres.h"
#include "fmgr.h"
PG_FUNCTION_INFO_V1(digitoVer);
Datum digitoVer(PG_FUNCTION_ARGS) {
int rut = PG_GETARG_INT32(0);
text *ret;
int M=0, S=1;
for (; rut; rut = rut / 10)
S = (S + rut % 10 * (9 - M++ % 6)) % 11;
ret = (text *) palloc(VARHDRSZ + 1);
VARATT_SIZEP(ret) = 5;
sprintf(VARDATA(ret), "%c", S ? S + '0' - 1 : 'K');
PG_RETURN_TEXT_P(ret);
}
Luego compilas eso con
gcc -Wall -O2 -c -fpic
-I`pg_config --includedir`
-I`pg_config --includedir`/server
pglib.c
gcc -shared pglib.o -o pglib.so
Lo metes en el directorio que te entregue pg_config --libdir, y
finalmente haces
CREATE OR REPLACE FUNCTION
digito_verificador(INTEGER)
RETURNS TEXT
STRICT IMMUTABLE
AS '$libdir/pglib.so',
'digitoVer' LANGUAGE C;
Despues pruebas esto:
select digito_verificador(14052209);
Ahora, te digo de inmediato que lo que quieres hacer fallara de
inmediato en cuanto haya un trigger, porque si el trigger modifica el
registro que se esta insertando, debug_query_string va a tener el valor
original y no el valor que el trigger le puso a la variable.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2006-06-28 14:25:11 | Re: Parametros en Funciones |
Previous Message | Edwin Quijada | 2006-06-28 14:15:34 | Banca y PG |