Re: Compilar una funcion en C

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.

In response to

Responses

Browse pgsql-es-ayuda by date

  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