PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Probleme avec les fonctions SPI (procédure stockée en C)

Technique - général | Probleme avec les fonctions SPI (procédure stockée en C)

Par max75014 le 11/07/2007 - 11:19

Bonjour,

j'ai un serieux problème avec l'utilisation des fonctions SPI (spi.h) dans une fonction (procédure) stockée en C.

J'utilise PostgreSQL 8.2.0.
Je travaille sur un poste linux fedora 5 et j'utilise PGadmin sur un poste windows voisin pour créer mes fonctions stockées, lancer des requètes, gérer mes tables, etc...

ma fonction stockée (test_spi.c) est la suivante:

#include "executor/spi.h"
#include "server/fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

/************************************************************************************/
PG_FUNCTION_INFO_V1(test_spi);
/************************************************************************************/

Datum test_spi (PG_FUNCTION_ARGS)
{

char *commande;
int ret;
int proc;

commande = PG_GETARG_CSTRING(0);

SPI_connect();

ret = SPI_exec(commande,0);

proc = SPI_processed;

if ((ret>0) && (SPI_tuptable != NULL))
{

TupleDesc tupdesc = SPI_tuptable->tupdesc;
SPITupleTable *tuptable = SPI_tuptable;
char buf[2000];
int i,j;

for (j=0;j {

HeapTuple tuple = tuptable->vals[j];

for (i=1, buf[0]=0; i<= tupdesc->natts; i++)
snprintf(buf+strlen(buf), sizeof(buf) - strlen(buf), " %s%s", SPI_getvalue(tuple, tupdesc, i), (i==tupdesc->natts) ? " " : " |");
elog(INFO, "EXECQ: %s", buf);
}
}

SPI_finish();
pfree(commande);

PG_RETURN_INT32 (proc);

exit(0);
}

Cette fonction est quasiment la même que celle présente dans la doc de postgres 8.2.0 mais adaptée en version 1.
je la compile avec les lignes suivantes sous linux:

cc -fpic -c test_spi.c -I /usr/local/pgsql/include/server/ -I /usr/local/pgsql/include
cc -shared -o test_spi.so test_spi.o

Mon test_spi.so est ainsi créé dans le repertoire /home/postgres/programmes de mon poste linux.

Ensuite, je créé la fonction test_spi() sur PGadmin.
Le code SQL de la fonction créée est le suivant:

CREATE OR REPLACE FUNCTION test_spi(commande cstring)
RETURNS integer AS
'/home/postgres/programmes/test_spi', 'test_spi'
LANGUAGE 'c' VOLATILE;
ALTER FUNCTION test_spi(commande cstring) OWNER TO postgres;

Enfin je lance les deux lignes suivantes sur le programme PGadmin du poste voisin:

load '/home/postgres/programmes/test_spi';
select test_spi('CREATE TABLE a (x integer)');

Et la, PAN (!) la connexion avec le client postgres de mon poste linux se plante, la fonction ne renvoie rien (pgadmin affiche ":" en guise de réponse) et l'erreur suivante apparait:

server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.

Au niveau de l'execution de ma fonction stockée, le programme "bloque" sur la fonction SPI_connect();

Je pense, aprés un certain nombre de recherches sur le problème, que cela vient de la configuration de Postgres: j'ai du omettre une config de pg_hba.conf ou postgresql.conf mais je ne voit pas laquelle.

Si quelqu'un possède une piste pour m'aider à résoudre ce problème de SPI...

Merci d'avance.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Le problème a changé!!!

max75014/ = 11 Juillet, 2007 - 11:43

Je viens de refaire mon process de compilation et de lancement: ca marche!

Maintenant le véritable problème est que je doit créer cette procédure stockée sur un serveur AIX 5.3.

-je repart de mon test_spi.c ci-dessus;
-je le charge sur mon serveur via une commande ftp;
-je le compile via les lignes suivantes:
cc -k PIC -c test_spi.c -I /postgres/include/server/ -I /postgres/include/
cc -G -o test_spi.so test_spi.o

-mon test_spi.so est créé;
-je créé le script SQL de ma fonction sur PGadmin (même que ci-dessus)
-je lance les deux lignes de requêtes comme ci-dessus (load ... ; select test_spi(.....); )

La meme erreur apparait :

server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.

DONC cela vient de la compilation car le reste n'a pas changé!

Aprés tout ce baratin ma question est simple:

Comment compiler une procédure sur AIX 5.3 !!!????

Merci


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.