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

#201 Re : C et C++ » PqisBusy » 27/09/2011 16:02:28

dans mon post précédent, j'ai fait une petite bourde, je voulais dire quand BQisBusy return true.

#202 C et C++ » PqisBusy » 27/09/2011 15:25:14

Postgres.0
Réponses : 14

Bonjour,

j'ai des fuites de mémoire dans mon programme à cause nottamment de PQisBusy :

192 bytes in 1 blocks are definitely lost in loss record 25 of 31
==26082==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==26082==    by 0x3C8340E194: PQmakeEmptyPGresult (in /usr/lib64/libpq.so.5.1)
==26082==    by 0x3C83415FAC: ??? (in /usr/lib64/libpq.so.5.1)
==26082==    by 0x3C8340D5AF: PQisBusy (in /usr/lib64/libpq.so.5.1)
==26082==    by 0x401FC1: is_result_ready(pg_conn*) (replic.cpp:767)
==26082==    by 0x404B36: build_request_in() (replic.cpp:452)
==26082==    by 0x405368: main (replic.cpp:169)

la je vois un PQmakeEmptyPGresult, je ne sais pas d'où il sort, je sais qu'il n'est pas dans mon code.
J'ai pu lire sur le net que quand PQisBusy return false, postgres cree un objet PGresult, c'est lui la que je dois liberer.
Le problème est que je n y accède pas.

#203 Re : C et C++ » Multiple PQconnectdb » 08/09/2011 16:23:38

Merci,

c'est ce que je pensais, mais on m'a presque convaincu du contraire.

Si chque thread construit sa requetes avec ses propres variables et l'envoie, les riques que ça plante sont minums.

#204 Re : C et C++ » Multiple PQconnectdb » 08/09/2011 14:06:11

Bonjour,

si je décidais d'utiliser des threads pour paralléliser ce traitement, est-ce-que si un thread plante, tout le programme va palnter ?

Merci

#205 Re : C et C++ » Multiple PQconnectdb » 02/09/2011 18:19:09

J'ai pensé à cette solution pour envoyer une requete avec PQsendQueryPrepared sur une connexion differente qui n'est pas entrain d'executer une autre requete.

#206 Re : C et C++ » Multiple PQconnectdb » 02/09/2011 18:12:17

comment ferrez vous par exemple pour un tebleau de 10 connexions :

Moi, je penche pour un truc comme ça :

PGconn * Tab_con[10] ;

for(i =0; i <10;i++) Tab_con[i]  = PQconnectdb("...");

#207 C et C++ » Multiple PQconnectdb » 02/09/2011 16:07:47

Postgres.0
Réponses : 7

Bonjour,

j'aimerai savoir comment je pourrais faire pour avoir plusieurs connexion en même temps avec PQconnectdb.
Est-ce-que si je fait PGconn * conn puis conn = PQconnectdb("..."), je pourrais utiliser conn[1], conn[2], conn[3]....conn[n] comme étant des connexions.

#208 Re : C et C++ » libpq Assynchrone » 01/09/2011 09:28:32

Ma question se porte sur l'utilisation des curseurs binaire :

Leur declaration est simple, mais pour que les donnée du curseur  puissent etre envoyées par PQsendquery et surtout afficher par le serveur ou le client, faut il faire apelle à d'autre fonctions ou d'autres librairie.

Si vous avez un code qui utilise PQsendquery pour envoyer les données d'un curseur binaire, je suis preneur.

#209 Re : C et C++ » libpq Assynchrone » 30/08/2011 10:36:27

Ok,  si un thread plante, est-ce-que tout va planter ?
je pose cette question par rapport à la prod.


La, je vois qu'utiliser PQsendQueryPrepared, ne peux pas améliorer les performances.
alors j'ai decidé de revenir à PQsenquery, mais il demeurre un souci que je vais expliquer :

je declare un curseur binaire

DECLARE  cursor_select  BINARY CURSOR  FOR SELECT field1, field2, field3


FETCH  FORWARD ALL IN cursor_select

je construit mes requetes Insert1, Insert2, Insert3 avec PQgetvalue(result, i , j)


je fais une PQsendquery(Insert1; Insert2; Insert3;)

je boucle sur PQgetResult(conn_in).

Mais à la fin je n'ai rien inserer, y a t-il quelque chose de spécial que je de rajouter avec les curseurs binaires (un cast par exemple).

#210 Re : C et C++ » libpq Assynchrone » 29/08/2011 11:30:40

Je suis obligé de me rajouter 2 ou 1 seconde d'attente, je n'ai pas le choix !
Avez vous idée de comment éviter de rajouter ces ou cette seconde d'attente ?
Pouvez vous me proposer, à partir du code,  un traitement assynchrone qui soit plus rapide que ce que j'ai écrit ?
Si je n'attend pas une seconde, j'aurais certainement des lignes de ma table qui ne seront pa envoyées.

Est-ce-que je peux faire un traitement assynchrone qui soit parrallèle ?

#211 Re : C et C++ » libpq Assynchrone » 25/08/2011 16:24:18

Je suis un peux surpris de me rendre compte qu'avec libpq la replication synchrone est plus rapide que le mode assynchrone.


Par rapport à ce que je veux obtenir, je vous fais une copie succinte de mon programme :

nb_transaction = 1000;

PQexec(conn_out, "FETCH   ALL IN cursor_select")

for (i=0; i<nb_transaction; i++)
   {                 
           
         /* requete déjà préparée avec PQsendPrepare*/

            status = PQsendQueryPrepared(conn,
                         l_query.c_str(),
                         v_nb_column,
                         (const char* const *)paramValues,
                         paramLengths,
                         paramFormats,
                         0); 
                         
               
                  if(PQconsumeInput(conn))
                   {     
                     if(PQisBusy(conn)) 
                      {
                         
                       sleep(2);  /* ici je perd du temps */
                       result_in = PQgetResult(conn);
                      }
                  else
                  {
                    result_in = PQgetResult(conn_in);
                  }             
             }
            else
             {
              cout << "erreur on :" << i << endl;
             
             }
}

j'essaye d'envoyer mes transactions de la manière ci-dessus, mais je remarque que je perd du temps et mon temps d'exection est moins bon

que quand j'envoie en mode synchrone (PQexecPrepared), confirmez s'il vous plait que c'est normal.


Je remarque surtout que si je n' appelle pas le sleep() ou bien si j'appelle sleep(1), je ne reçois que la moitié de mes transactions.

S'il vous plait aidez moi, car je ne vois plus du tout comment sortir de ce petrin.

#212 Re : C et C++ » libpq Assynchrone » 19/08/2011 17:11:40

Au fait,

quand je fais plusieurs fois appel à PQsendQueryParams, ça marche la première fois.
Mais en suite, il m'affiche ce message : another command is already in progress

Est-ce-que vous pouriez me dire comment utiliser PSconsumeInput, PQbusy, pour éviter ce problème.

#213 Re : C et C++ » libpq Assynchrone » 19/08/2011 09:34:49

Merci, je vois plus clair.
je me suis orienté vers  PQsendQueryParams pour essayer de  faire le même traitement, mais cette fois ci envoyer ligne par ligne sans attendre la reponse du serveur.
Il insert bien la première transaction, mais j'ai l'impression que l'on peut pas faire deux appels successifs de PQsendQueryParams sur la même connexion.

#214 Re : C et C++ » libpq Assynchrone » 18/08/2011 18:18:59

Quand j'affiche trois fois  le retour de PQgetResult(conn) ça me donne ça :

0x15e89a60   
0
0

   
Mon analyse est que 0x15e89a60 correpond au retour de la requete qui essaye d'inserer une ligne qui existe déjà, donc erreur.
En suite, tous les appels de PQgetresult pointe sur 0, alors qu'ils doivent pointer sur les requetes suivantes.

#215 C et C++ » libpq Assynchrone » 18/08/2011 14:29:54

Postgres.0
Réponses : 14

Bonjour,

quelqu'un peut il m'expliquer le fonctionnement de PQgetResult en mode assynchrone avec plusieurs requetes.
J'envoie plusieurs insert en une commande avec pqsendQuery(conn, commande).
Après, je boucle sur PQgetResult  :
   
       code = PQsendQuery(conn, query.c_str());

        while(NULL != (result_in = PQgetResult(conn)))
        {           
           
                 
             try
               {   
                   
                   if (PQresultStatus(result) != PGRES_COMMAND_OK)
                       
                    throw string (" problem   : ");
                   
                   
                   else if(strcmp(PQcmdTuples(result),"1") == 0)
                   { 
                      cout << "requete " << endl;         
                     
                  }
                   
               
               }
               catch(string const &chaine0)   
               {
               
                        if ( PQresultErrorField(result_in, PG_DIAG_SQLSTATE) == UNIQUE_VIOLATION )
                 
                          v_error_code =  "1000";
                       
                        else
                 
                           v_error_code = "99900";
                                         
                   
                           
                       
                        cerr  << chaine0   << PQresultErrorMessage (result) << endl;
                         
               }
                       
             
            PQclear(result);
         
           }

Mais le problème est que si la première requete contient une erreur, il va sortir de la boucle et du coup je ne pourrai plus controler les autres requetes.

#216 Re : C et C++ » C vs C++ » 18/08/2011 13:56:18

Je me suis dit que je dois peut être utilisé  PQconsumeInput(conn_in) et !PQisBusy(conn_in) pour pouvoir gérer ce problème.

#217 Re : C et C++ » C vs C++ » 18/08/2011 13:50:24

Ok, je le ferrai .

En fait, je boucle comme ça while(NULL != (result = PQgetResult(conn))), mais si il trouve une erreur à la première instruction, il sort de la boucle du coup je ne peux plus savoir si les autres instructions ce sont bien passées.

#218 Re : C et C++ » C vs C++ » 18/08/2011 11:46:31

ok, je penses que mes données en bytea sont altérées !

J'ai une question concernant PQgetResult() :

Imaginez que j'envoie, avec PQsendQuery, la commande composée de "Begin; Insert1; Insert2; Insert3; End;"
En suite, je boucle sur PQgetResult()  mais la je remarque que Insert1 s'est mal passé : il m'affiche, en bonne et dûe forme, le message suivant, grace à PQresultErrorMessage : "duplicate key value violates unique constraint".
Ma question est : si le deuxième Insert s'est mal passé, comment je pourrais faire pour recupérer le message d'erreur avec PQresultErrorMessage, car là, cette aapi me renvoie une chaine vide.

#219 Re : C et C++ » C vs C++ » 11/08/2011 10:07:06

Je ne pense pas que les données soient vraiment au bon format binaire.

#220 Re : C et C++ » C vs C++ » 10/08/2011 17:28:29

tous les champs sont des bytea.

#221 Re : C et C++ » C vs C++ » 10/08/2011 17:25:30

Pour faire plus simple je vous mets ma requete, je ne sais ps si vous pouvez la tester chez vous

INSERT INTO Table(raisondemautob,pc,xi,trans,merchant) values (E'\000 \000\001',E'\001c\000\000\000\002@\000\000\000\342`\342\374\241\2656\307?\363b\210\207*\223G\345\177J\205\333\232!{u1u\325\203\207 k\324 8f\307^L\266,\326\221\234\222\370\360\372:.3'\302\236\262*oW\372\031\363\341%\370\003\004\000\000\000\000\000\000\000\004\020\000\000\000\273\273r\331\355\0047\346\364\253L\310+\262{\261\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000',E'',E'',E'\001\303\001\000\000\002\240\001\000\000\261+K\034\352\012\246\023\344;\224\267B).3K\324`,\236P\302#)\370\304\001:\242\375\347\344\210\177\007\034\2553\304\377^\211\036\012\374\323\321\333#\356\353\011\025D5\220\253\272;6Ax~\002\003\312\356\213{p\314\305\210\244\2648\347\370\3446\246\011\002\365u^\201B\355\003_(\234\010\243?\026\343\261[p\206\372\354|\333\202\215\360g \344\300pSl\262\252\246\330\317\270\360\254q\254\276\373\011\325}\024\027*\350\354\323\374\214\375R\353\331\207d\367\340\243\211<\270!<\004\253\0102>\313\316 \2526\320\325\\?\345\265\341\252C\026\214\200-\024y\030\252\371\210\023wD\364\370Z?\007\303\222yn\025+\012\205y\367\010\013C'\316,\214\220L(Y\277\333lO\347P\021O}\276\334'\226\2677\232V\220(\200\231\356\200]\022\321\001\240]o\252\272\212\341\206X\234\026bG\377+\030\350\224\277\340\021\252qK\305\254\327C\365\351cm\334\207\253\252\274\011\346\256n\177\263 \357\227\204w\365\262s\223\321Dm\307O{c\270\331\211_'\010\017\224z\301\361@~\260\204WkA\300\2265rG\020\273\256\013\260y\032\366\327\200\025\256\314)Y\320\276\301\206\273\301[\374s \256l\314\202(\213\247\362\341\320+\367\344^\235P\270y\245\274g\354\335\014.\3442\2411\342\206\230\347\355\242*$/\215V\304\366\325/\212Av\200g\203\035!\275\324M\205Y\004C\376\243u0\344-\213\262\254x\003\003\004\000\000\000\000\000\000\000\004\020\000\000\000K\367\371\223\327\010\353\215\2678(\252"\363A\312')

#222 Re : C et C++ » C vs C++ » 10/08/2011 16:15:04

gleu :

j'ai une nouvelle erreur : : ERROR:  invalid byte sequence for encoding "UTF8": 0x00

En cherchant sur internet, j'ai compris que j'envoie au serveur un caractère de fin de chaine qu'il ne sait pas lire.
Est-ce-que vous avez une idée de comment le supprimer de ma requete ?

#223 Re : C et C++ » C vs C++ » 09/08/2011 10:17:24

Cette date pose un problème aussi bien au curseur binaire qu'au curseur normal.

j'ai des cotes autour de mes  dates (literal) et autre varchar.
sauf que quand j'appelle PQescapeByteaConn, elle me double les cotes autour de la date...
Et quand je parcours la chaine pour transformer les doubles cotes en cotes simple, il me sort des erreurs sur mes données bytea, sur les antislash.

Est ce qu'on peut appliquer succesivement PQescapeliteral et PQescapeByteaConn a la même chaine de caractère.
Je pose cette question, car, dans ma requetes Insert, il y a des champs de type varchar, bytea, char, date, int...

#224 Re : C et C++ » C vs C++ » 09/08/2011 10:16:12

la valeur de la  date avant d'être transformée en binaire était :

2011-04-01 09:21:26

#225 Re : C et C++ » C vs C++ » 09/08/2011 10:07:37

Update table set (clé, date1) =(1999422, Aµ(U)

Pied de page des forums

Propulsé par FluxBB