From: | Nicolás Domínguez Florit <ndomin(at)rec(dot)unicen(dot)edu(dot)ar> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Compilar una funcion en C |
Date: | 2006-06-28 15:30:10 |
Message-ID: | 44A2A082.3010008@rec.unicen.edu.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Sorprendente!!! Muchas gracias Alvaro.
Solo me faltaria compilar lo mismo para windows y obtener una dll ¿no?
Aaaa, tendre en cuenta lo que me dices de los triggers, igualmente ahora
me sirva o no lo quiero hacer. Ya que me gusta el potencial de poder
usar funciones C.
Saludos, Nicolas.
Alvaro Herrera escribió:
> 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.
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2006-06-28 15:46:45 | Re: Compilar una funcion en C |
Previous Message | Adriana Rita | 2006-06-28 15:05:49 | problemas con apostrofes |