c

You are currently browsing articles tagged c.

Qualche tempo fa, ho avuto necessità di eseguire uno script esterno legato ad un trigger di PostgreSql.
All'epoca, l'unica soluzione che ho trovato è stata di creare una funzione in C che richiamasse lo script con i dovuti parametri.

Questo il codice:

#include <unistd.h>
#include <stdio.h>
#include "postgres.h"
#include <ctype.h>
#include "fmgr.h"
#include "utils/builtins.h"

#define _textout(str) DatumGetPointer(DirectFunctionCall1(textout, PointerGetDatum(str)))

PG_FUNCTION_INFO_V1(esegui);
Datum           esegui(PG_FUNCTION_ARGS);

Datum           esegui(PG_FUNCTION_ARGS){
    int pid;

    char *path, *cmd, *host, *user, *pwd, *param; //Parametri della funzione

    path   = _textout(PG_GETARG_TEXT_P(0));
    cmd    = _textout(PG_GETARG_TEXT_P(1));
    host   = _textout(PG_GETARG_TEXT_P(2));
    user   = _textout(PG_GETARG_TEXT_P(3));
    pwd    = _textout(PG_GETARG_TEXT_P(4));
    param  = _textout(PG_GETARG_TEXT_P(5));

    // Eseguo un fork per evitare di rallentare le operazioni sul database       
    switch(pid=fork()){
    case -1: //Errore. Non posso eseguire il fork.
        exit(-1);
    case 0 : //Fork riuscita. Eseguo il codice "figlio"
        execl(path, cmd, host, user, pwd, param,0); // Questo e' il codice "figlio"
        exit(1);
    default:
        return pid;
        exit(1);
   }
}

Per utilizzare questa funzione con postgres, sono necessari pochi semplici passi:

Per prima cosa compiliamo la nostra funzione c (nel mio caso il file era: execcmdrouter.c).

gcc -I/usr/include/postgresql/server/ -shared execcmdrouter.c -o execcmdrouter.so

Copiamo l'oggetto ottenuto in casa di postgres e attribuiamogliene la proprietà ;-)

cp execcmdrouter.so /var/lib/postgres/
chown postgres.postgres /var/lib/postgres/execcmdrouter.so

Quindi creiamo la funzione in postgres:


CREATE FUNCTION esegui(text,text,text,text,text,text) RETURNS INTEGER
AS '/var/lib/postgres/execcmdrouter.so' LANGUAGE C;

Fatto.

Spero possa a essere utile a qualcuno.

Tags: , , ,