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

#26 21/07/2011 11:44:06

Postgres.0
Membre

Re : C vs C++

Pour la connexion j'ai trouvé le problème.
Mais concernant le TIMEOUT, j'aimerai couper la connexion quand au bout de 30 secondes,  il y a plus de paquets envoyés entre les deux serveurs.

Hors ligne

#27 21/07/2011 17:29:37

Postgres.0
Membre

Re : C vs C++

Hello,

dans mon programme j'ai quelques chose du genre insert itn table(a,b,c,d) values ($1,$2,$3,$4);
Sachant que j'ai pas de fonction, je ne vois pas ce que pourrait etre ces variables avec les dolars.

Hors ligne

#28 21/07/2011 17:53:13

gleu
Administrateur

Re : C vs C++

Ce doit être une requête préparée : http://docs.postgresql.fr/9.0/sql-prepare.html


Guillaume.

Hors ligne

#29 29/07/2011 16:34:02

Postgres.0
Membre

Re : C vs C++

Bonjour,

j'ouvre un curseur avec FETCH ALL,  ensuite j'appelle PQsendQuery sur plusieurs instructions ( que des insert), le problème est que pour certaines données il a besoin que je mette mes données entre cotes  ''.
Comment je pourrais faire pour éviter de mettre beaucoup d'instructions if, qui me permettent de savoir quelle donnée doit être entouré de cote.

J'ai pensé à cette fonction PQsendQueryParams, mais le problème est que j'ai plusieurs insert dans ma commande que j'envoie au serveur.

Hors ligne

#30 29/07/2011 17:12:48

Postgres.0
Membre

Re : C vs C++

Désolé c'est encore moi, j'ai redefinis mon cursueur en curseur binaire, et le problème a été résolu, sauf que j'ai une nouvelle erreure


ERROR:  invalid byte sequence for encoding "UTF8": 0xb5
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

ce qui veux dire que le serveur ne connait pas le format d'une de mes données, comment je pourrais faire pour lui signifier qu'il doit reconnaitre le format de mes données.

Merci
Cordialement

Hors ligne

#31 03/08/2011 12:17:42

Postgres.0
Membre

Re : C vs C++

Merci, j'ai bien avancé et mon projet est entrain de finir.
Seulement, j'ai un problème :
Après la connexion aux serveurs A et B, quand j'envoie (de A vers B) une commande avec des inserts, rien n'arrive à B et la connexion n'est pas coupé, dès fois on peut mettre 48 h pour s'en rendre compte.

Je sais que la solution est dans le timeout de statement, mais je ne sais comment le faire techniquement.
Mais le problème est surtout  que j'ai peur qu'il arrete le traitement si mes requetes depasse en temps d'execution le timeout.

Hors ligne

#32 04/08/2011 17:32:33

gleu
Administrateur

Re : C vs C++

Vous pouvez aussi paramétrer les paramètres TCP keepalive pour détecter plus rapidement une perte de connexion.


Guillaume.

Hors ligne

#33 05/08/2011 16:37:00

Postgres.0
Membre

Re : C vs C++

La realité c'est que la connexion n'est pas coupé, c'est un problème avec le firewall, alors il faut que j'envoie des requetes vides .
S'il y a pas de reponse je couperai la connexion.

!!!!!!!!!!!!!!!!!!!

Par contre la j'ai vraiment un problème qui risque de faire capoter mon projet.

Un peu plus haut j'ai dit que j'allais uiliser les curseur binaire, mais on m'a demander de les laissere tomber, car c'est compliqué de convertir le binaire en d'autre format et surtout psql ne peux lire les donnée en binaire (et moi je peux pas les afficher avec cout << pgetvalue).
Alors je me suis retrouvé au problème que j'ai signalé auparavant :



j'ouvre un curseur avec FETCH ALL,  ensuite j'appelle PQsendQuery sur plusieurs instructions ( que des insert), le problème est que pour certaines données il a besoin que je mette mes données entre cotes  '  '.
Comment je pourrais faire pour éviter de mettre beaucoup d'instructions if, qui me permettent de savoir quelle donnée doit être entouré de cote.

J'ai pensé à cette fonction PQsendQueryParams, mais le problème est que j'ai plusieurs insert et plusieurs update dans ma commande que j'envoie au serveur.

int PQsendQueryParams(PGconn *conn,
                      const char *command,
                      int nParams,
                      const Oid *paramTypes,
                      const char * const *paramValues,
                      const int *paramLengths,
                      const int *paramFormats,
                      int resultFormat);


Commait j'ai plusieurs insert et update, je ne sais pas comment mettre les valeurs de mes parametres dans paramValues.

Hors ligne

#34 05/08/2011 16:44:15

Postgres.0
Membre

Re : C vs C++

désolé

pour la dernière ligne lire Comme et pas commait, je commence à être fatigué.

Hors ligne

#35 05/08/2011 19:15:32

gleu
Administrateur

Re : C vs C++

La realité c'est que la connexion n'est pas coupé, c'est un problème avec le firewall, alors il faut que j'envoie des requetes vides .

Les paramètres TCP keepalive sont fait pour ça.

Comment je pourrais faire pour éviter de mettre beaucoup d'instructions if, qui me permettent de savoir quelle donnée doit être entouré de cote.

Seules les données de type texte (char, varchar, text) et binaire (bytea) ont besoin des guillemets.

J'ai pensé à cette fonction PQsendQueryParams, mais le problème est que j'ai plusieurs insert et plusieurs update dans ma commande que j'envoie au serveur.

Dans ce cas, vous ne pouvez pas utiliser cette fonction. Elle accepte seulement une requête à la fois et pas plusieurs comme PQexec et PQsendQuery.


Guillaume.

Hors ligne

#36 05/08/2011 19:56:46

Postgres.0
Membre

Re : C vs C++

Voilà ce qu'il me met quand je mets des cotes à un bytea :


WARNING:  nonstandard use of escape in a string literal
LINE 1: ...','01','A  001710','00','4','0','','000000001100','\000 \000...
                                                             ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
WARNING:  nonstandard use of escape in a string literal
LINE 1: ...,'','','0','2011-04-01 09:21:25',0,'','7','0','0','\001c\000...
                                                             ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
1
probleme de result errorcode : ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".


Si non est ce que vous pouvez m'expliquer comment on parametre le TCP keepalive.

Hors ligne

#37 06/08/2011 17:33:05

gleu
Administrateur

Re : C vs C++

Le premier message (WARNING:  nonstandard use of escape in a string literal) indique que vous insérez des antislashs dans la valeur de la colonne et que vous devez pour cela précéder la chaîne du caractère E (E'\000...').

Le deuxième message (ERROR:  invalid byte sequence for encoding "UTF8": 0x00) indique que vous essayez d'insérer l'octet 0x00 dans une chaîne de caractères (donc pas un bytea), ce qui n'est pas autorisé.


Guillaume.

Hors ligne

#38 06/08/2011 17:34:00

gleu
Administrateur

Re : C vs C++

Quant au TCP Keepalive, toute la documentation se trouve sur http://docs.postgresql.fr/9.0/runtime-c … ction.html


Guillaume.

Hors ligne

#39 08/08/2011 09:57:50

Postgres.0
Membre

Re : C vs C++

Merci, je vous donnerai des nouvelles de mes avancements.

Hors ligne

#40 08/08/2011 13:25:45

Postgres.0
Membre

Re : C vs C++

Alors,

j'insère une valeur dans un champ de ty bytea :

INSERT INTO table(champ) VALUES (E'\001\223\001\000\000\002p\001\000\000d\031\276\227\202\017n\232%\247\300O\025\300\372V\302\305+FF \244g\255S\317\251HX\230\263\352,\347~\217:s\207\324g\005\241\331\265\257\201\025\376\331V\3660\330\307G\012\264n\354\253&6\212\341\2644\200\271d[9\250\364\316\023\317\313\011#\236v\3369\274\316\211\257n\273\177\337U@\315#\362j\220|\277\376\3226\353\300\2019\307\3552<\024U\357\273\330SK-#P\364\307\266nZ\200\236\331\273\313\230;\012t\005\207+\025N\037\257\367\216\311\323\252$\345\243^F6\371e&\337|0Y\023\205\321)'@\355){\313\2355\250P\317\242v\317\335\312\256\244\202\347\305\342\307\006B\275\177\202M\020\013\257{V\030\021\236\332\365(\260\355I\360\265D\005\341p\251?\243,\2344p\264\247\206\206\306:\333\366\007[\315\220\303\244g\325\255\371\377\230U\352\260m\241\244\236\212\3449\274(\343!\014\226\267\350\214\350\005J\275\012\374\362\253\356\0020\313I\315\342\2713\345d\356xy\342E\273*\376^\226\326\372\276\225\326\327\3132x{/\2533$\273\357\341v\023\334Z\317\351\274\262\201\341\374\267h^!\307Y\225\346\333[H\211\360J\370\223a\207 \222T\256\235s0p\004'\350\225\216<w\330\277TM[\3233\304U\372&+\374J4\330g\003\004\000\000\000\000\000\000\000\004\020\000\000\0)00U\373+d\321\355\\\371\327\310E\022Lk\226\263')

Mais j'a toujours la même chose :


ERROR:  invalid byte sequence for encoding "UTF8": 0x93
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".


Désolé, je sais que c'es moche, mais je voulais vous montrer que je mettais bien une donnée binaire dans un champs bytea.

Cordialement

Hors ligne

#41 08/08/2011 14:28:16

gleu
Administrateur

Re : C vs C++

En fait, il faut deux antislashs pour les données binaires. Voir http://docs.postgresql.fr/9.0/datatype-binary.html pour les détails.


Guillaume.

Hors ligne

#42 08/08/2011 16:42:23

Postgres.0
Membre

Re : C vs C++

Est-ce-que quelqu'un a déjà utilisé un curseur binaire ?

Quand on envoi les données sur le serveur, comment on fait pour les remettres en format texte.
Quand j'affiche les donnée du cursseur binaire avec un cout je n'ai rien du tout.
Comment faire pour les afficher.

Hors ligne

#43 08/08/2011 16:48:44

Postgres.0
Membre

Re : C vs C++

ESt ce que vous avez quelque code sur un curseur binaire

Hors ligne

#44 08/08/2011 17:00:21

gleu
Administrateur

Re : C vs C++

J'ai rien de mon côté en tout cas.


Guillaume.

Hors ligne

#45 08/08/2011 17:10:03

Postgres.0
Membre

Re : C vs C++

je suis tomber sur ça

char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);


est-ce-que vous l'avez déjà utilisé ?

Est-ce-que dans mon cas, où j'ai un chaine de caractère constituée de plusieurs INSERT et UPDATE (separés par des ";") ça peut être utile avant le PQsendQuery.

Hors ligne

#46 08/08/2011 17:37:11

Postgres.0
Membre

Re : C vs C++

cette fonction n'est pas du connu de mon postgres :
Ci-dessous le message de mon compilateur g++ :
PQescapeLiteral was not declared in this scope

Hors ligne

#47 08/08/2011 17:38:16

gleu
Administrateur

Re : C vs C++

PQescapeLiteral ne concerne que les chaînes de caractères, pas les données binaires. Ces dernières doivent plutôt passer par PQescapeByteaConn.


Guillaume.

Hors ligne

#48 08/08/2011 17:56:02

Postgres.0
Membre

Re : C vs C++

est-ce-que elle existe uniquement dans la version 9 de postgre

Hors ligne

#49 08/08/2011 18:07:24

gleu
Administrateur

Re : C vs C++

Comme l'indique la documentation, elle est dispo depuis la 7.4.


Guillaume.

Hors ligne

#50 08/08/2011 18:29:06

Postgres.0
Membre

Re : C vs C++

j'ai appelé la fonction PQescapeByteaConn :

mais il trouve encore le moyen de m'embeter :

probleme de result errorcode : ERROR:  syntax error at or near "\"
LINE 1: ...) = (1999422,A\\265(U\\2...
                                    ^

Dernière modification par Postgres.0 (08/08/2011 18:30:41)

Hors ligne

Pied de page des forums