Vous n'êtes pas identifié(e).
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
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
Ce doit être une requête préparée : http://docs.postgresql.fr/9.0/sql-prepare.html
Guillaume.
Hors ligne
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
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
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
Vous pouvez aussi paramétrer les paramètres TCP keepalive pour détecter plus rapidement une perte de connexion.
Guillaume.
Hors ligne
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
désolé
pour la dernière ligne lire Comme et pas commait, je commence à être fatigué.
Hors ligne
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
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
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
Quant au TCP Keepalive, toute la documentation se trouve sur http://docs.postgresql.fr/9.0/runtime-c … ction.html
Guillaume.
Hors ligne
Merci, je vous donnerai des nouvelles de mes avancements.
Hors ligne
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
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
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
ESt ce que vous avez quelque code sur un curseur binaire
Hors ligne
J'ai rien de mon côté en tout cas.
Guillaume.
Hors ligne
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
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
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
est-ce-que elle existe uniquement dans la version 9 de postgre
Hors ligne
Comme l'indique la documentation, elle est dispo depuis la 7.4.
Guillaume.
Hors ligne
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