Bonjour,
je ne sais pas si je dois poster dans le forum C ou PostgreSQL.
En C j'essaye d'envoyer une commande 'Parse' a un serveur PostgreSQL (je suis deja connecté).

Voici la structure d'une commande 'Parse' :
Parse (F)

Byte1('P')
Marqueur de commande Parse.
Int32
Taille du message en octets, y compris la taille elle-même.
String
Nom de l'instruction préparée de destination (une chaîne vide sélectionne l'instruction préparée non-nommée).
String
Chaîne de requête à analyser.
Int16
Nombre de types de données de paramètre spécifiés (peut valoir zéro). Ce n'est pas une indication du nombre de paramètres pouvant apparaître dans la chaîne de requête, mais simplement le nombre de paramètres pour lesquels le client veut pré-spécifier les types.

Pour chaque paramètre, on trouve ensuite :

Int32
ID de l'objet du type de données du paramètre. la valeur zéro équivaut à ne pas spécifier le type.
Dans mon cas à moi, je selectionne une instruction préparée non nommée (chaine vide donc), nombre de types de donnée de paramètres spécifiés = 0 codé sur 16 bits donc.

j'ai donc codé une fonction pour réaliser cette commande Parse, qui m'enregistre dans un buffer la chaine suivante :

'P000730SELECT intval, floatval, strval FROM test_sqlclient WHERE name=$1;00 '

P = Marqueur de commande 'Parse'
00073 = 4 octets qui indiquent la taille
0 = chaine vide (instruction non nommée)
00 = Nombre de types de données de paramètre spécifiés (a la fin aprés le point virgule)

Je vous donne ma fonction en C :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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
32
/* Construct the 'Parse' message	*/
	do
	{
		msg_len = 0;
		if (msg)		memcpy(msg + msg_len, "", 1);				// An empty string selects the non-prepared statement named.
		msg_len += 1;
		if (msg)		memcpy(msg + msg_len, query, strlen(query));// Query string to analyse.
		msg_len += strlen(query);
		if (count > 0 && paramtypes)
		{
			if (msg)	sql_put_int(sizeof(int16), count, msg + msg_len);		
			msg_len += sizeof(int16);
			for (i=0; i<count; i++)
			{
				if (msg)sql_put_int(sizeof(int32), paramtypes[i], msg + msg_len);// Object ID of the data type of the parameter.
				msg_len += sizeof(int32);
			}
		}
		else
		{
			if (msg)	sql_put_int(sizeof(int16), 0, msg + msg_len);			// Many types of data specified parameter.
			msg_len += sizeof(int16);
		}
		if (msg) break;	
		msg = (char *) malloc(msg_len);
	}
	while(msg);
 
	for (i=0; i<msg_len; i++)
	fprintf(stdout,"%c",msg[i]);
 
	sql_send_msg(sql_conn, 'P', msg_len, msg);
La fonction sql_send_msg ajoute le message type 'P' , puis la taille calculée (taille du message + taille elle meme"), puis le message.

C'est un probleme un peu special que j'ai l'a (developper un client postgrsql sans lib) mais je bloque pas mal et je vois pas ou est le probleme (j'ai presque fais un copier coller de la libpq bibliotheque de postgresql)

Merci d'avance en tout ca