[Pgsql-ayuda] Llamada a programas externos desde postgres

Manuel Sugawara masm@fciencias.unam.mx
26 Jan 2004 13:50:38 -0600


"Magnvs -- Carles Querol" <magnvsctv@hotmail.com> writes:

> Hola a todos,
>=20
> Me he pasado la =FAltima semana rompi=E9ndome la cabeza para escribir una
> funci=F3n en C que llame a un procedimiento externo para poder generar
> documentos XML, pero no hay forma de que funcione.=20

Otra vez ... No uses execl ni ninguna de las llamadas de sistema de la
familia execve, a menos de que sepas lo que estas haciendo lo cual
*claramente* no es el caso. De la p=E1gina del manual de execve

       execve() no regresa en caso de =E9xito, y el c=F3digo, datos, bss y =
la pila
       del  proceso  invocador se reescriben con los correspondientes del p=
ro-
       grama cargado. El programa invocado hereda el PID del proceso invoca=
dor
       y  cualquier  descriptor de fichero abierto que no se halla configur=
ado
       para "cerrar en ejecuci=F3n" (close on exec). Las se=F1ales pendient=
es  del
       proceso  invocador se limpian. Cualquier se=F1al capturada por el pr=
oceso
       invocador es devuelta a su comportamiento por defecto.

Si haces esto matas al postmaster y *realmente* no quieres hacer eso
(por ejemplo intenta exec clear desde tu shell). Otra vez, usa system
y tu funci=F3n quedar=EDa m=E1s o menos as=ED (c=F3digo sin probar!!!):

>    13 Datum
>    14 CridarExec (PG_FUNCTION_ARGS) {
>    15         int retornat;
>    16
>    17         text * path =3D PG_GETARG_TEXT_P(0);
>    18         text * args =3D PG_GETARG_TEXT_P(1);
>    19
>    20         size_t filename_len  =3D VARSIZE(path)-VARHDRSZ;
>    21         size_t arguments_len =3D VARSIZE(args)-VARHDRSZ;
>    22
                char *cmd =3D palloc(filename_len + arguments_len + 2);
                memcpy(cmd, VARDATA(path), filename_len);
                memcpy(cmd + filename_len, " ", 1);
                memcpy(cmd + filename_len + 1, VARDATA(args), arguments_len=
);
                *(cmd + filename_len + 1 + arguments_len) =3D '\0';
                retornat =3D system(cmd);

>    40         PG_RETURN_INT32((int32)retornat);
>    41 }


Saludos,
Manuel.