PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 28/04/2010 15:49:52

R.Seif
Membre

la lecture ça passe, l'écriture ça casse.

Bonjour,

J'ai un problème que j'arrive pas à résoudre.
j'appelle une fonction sql qui utilise un select, et ça marche.
j'appelle une fonction qui utilise un insert et ça ne s'exécute pas.

 
PGresult* result1;
	PGresult* result2;
	PGresult* result3;
	PGresult* result4;
 
	
	//sprintf(commande_sql1,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
	const char *commande_sql1="select * from ips;";
	result1 = PQexec(connect_database, commande_sql1);
	char *val1 = PQgetvalue(result1,0,0);
	printf("%s \n", val1);
 
	if ((PQresultStatus(result1) != PGRES_TUPLES_OK ))
	{
           fprintf(stderr, "couldnt execute query 1\n");
	  
           PQclear(result1);
        
	}
	else {
	printf ("commande 1 exécutée\n");
	}
 
	
	//sprintf(commande_sql2,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
	const char *commande_sql2="select mape_add_ip('192.168.1.4');";
	result2 = PQexec(connect_database, commande_sql2);
	char *val2 = PQgetvalue(result2,0,0);
	printf("%s \n", val2);
	if ((PQresultStatus(result2) != PGRES_TUPLES_OK ))
	{
           fprintf(stderr, "couldnt execute query 2\n");
	  
           PQclear(result2);
        
	}
	else {
	printf ("commande 2 exécutée\n");
	}
 
	
 
	//sprintf(commande_sql3,"select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);");
	const char *commande_sql3="select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);";
	result3 = PQexec(connect_database, commande_sql3);
	char *val3 = PQgetvalue(result3,0,0);
	printf ("%s\n", val3);
	if ((PQresultStatus(result3) != PGRES_TUPLES_OK ))
	{
           fprintf(stderr, "couldnt execute query 3\n");
	  
           PQclear(result3);
        
	}
	else {
	printf ("commande 3 exécutée\n");
	}
 
	
 
	//sprintf(commande_sql4,"select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);");
	const char *commande_sql4="select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);";
	result4 = PQexec(connect_database, commande_sql4);
	char *val4 = PQgetvalue(result4,0,0);
	printf ("%s\n", val4);
	if ((PQresultStatus(result4) != PGRES_TUPLES_OK ))
	{
           fprintf(stderr, "couldnt execute query 4\n");
	  
           PQclear(result4);
        
	}
	else {
	printf ("commande 4 exécutée\n");
	}

les deux premières requêtes fonctionnent puisqu'il s'agit d'une sélection simple, et d'une fonction qui utilise la sélection.
les deux dernières ne s'exécutent pas puisqu'ils font appels à une fonction qui ne fait que l'insertion
R.Seif est actuellement connecté

Hors ligne

#2 28/04/2010 16:10:44

gleu
Administrateur

Re : la lecture ça passe, l'écriture ça casse.

PGRES_TUPLES_OK est le code de retour lorsque la commande exécutée réussit et renvoie des lignes. PGRES_COMMAND_OK est le code de retour lorsque la commande exécutée réussit mais ne renvoie aucun résultat. Vous devriez donc plutôt utiliser cette variante que la première.


Guillaume.

Hors ligne

#3 28/04/2010 16:13:46

Marc Cousin
Membre

Re : la lecture ça passe, l'écriture ça casse.

Je doute que ce qui est exécuté dans la fonction ait la moindre importance quant à votre code, puisque ce que vous exécutez reste des SELECT.

Vous n'avez aucun message d'erreur ? Rien dans les logs de PostgreSQL non plus ? Que vaut PQresultStatus ?


Marc.

Hors ligne

#4 28/04/2010 16:39:53

R.Seif
Membre

Re : la lecture ça passe, l'écriture ça casse.

j'ai ces erreurs ci:

Connection String: hostaddr=217.109.105.136 host=mape-manager user=mape password=pDocr1M! sslmode=require dbname=mapemanager port=5432
connection to DB ok!
commande 1 exécutée
1 
NOTICE:  l'adresse 192.168.1.14 existe déjà, son ID est le suivant:
commande 2 exécutée
7 
row number 0 is out of range 0..-1
couldnt execute query 3
row number 0 is out of range 0..-1
couldnt execute query 4

PQresultStatus me retourne la valeur 7.

Hors ligne

#5 28/04/2010 16:44:17

Marc Cousin
Membre

Re : la lecture ça passe, l'écriture ça casse.

select verify_replicat retourne t'elle un enregistrement ?

vous effectuez PQgetvalue(result3,0,0) sur son résultat, mais y a t'il un enregistrement retourné ?


Marc.

Hors ligne

#6 28/04/2010 16:47:21

R.Seif
Membre

Re : la lecture ça passe, l'écriture ça casse.

non, rien.
par contre la fonction mape_add_ip contient l'insert, et ça s'effectue sans problème.

Hors ligne

#7 28/04/2010 16:57:27

Marc Cousin
Membre

Re : la lecture ça passe, l'écriture ça casse.

S'il n'y a pas d'enregistrement retourné, c'est tout à fait normal que PQgetvalue(result3,0,0) ne fonctionne pas.

Le principal problème que je vois dans votre code est le suivant :
On effectue PQresultStatus AVANT PQgetvalue, afin de savoir si on peut récupérer des enregistrements. Pas après.

Par ailleurs, vous devriez vous arranger pour que vos fonctions vous retournent malgré tout un résultat. Un simple booléen par exemple, afin de savoir qu'elles se sont bien exécutées.


Marc.

Hors ligne

#8 28/04/2010 17:08:46

R.Seif
Membre

Re : la lecture ça passe, l'écriture ça casse.

:oops:
ça commence à m'enerver.
je n'ai rien comme réponse pour ces deux requêtes.

Hors ligne

#9 29/04/2010 10:29:32

R.Seif
Membre

Re : la lecture ça passe, l'écriture ça casse.

en fait c'est ce que je fait avec la fonction verify_replicat, meme s'il y a un message d'erreur je récupère un 0, sinon ça me retourne 1.

Hors ligne

Pied de page des forums