[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.