Re: pqlib in c++: PQconnectStart PQconnectPoll - Mailing list pgsql-general

From madhtr
Subject Re: pqlib in c++: PQconnectStart PQconnectPoll
Date
Msg-id 011401c7e033$ea877bd0$7b55503f@useronewin2klt
Whole thread Raw
In response to Moving to postgresql and some ignorant questions  ("Phoenix Kiula" <phoenix.kiula@gmail.com>)
List pgsql-general
Ok, i figured something out anyway ... hopefully it will be helpful to the
group ...
The following works on my WinXP pro machine most of the time.  I have
confirmed
that I have the latest versions of everything.

///////////////////////////////////
#pragma once

#include <stdlib.h>
#include <libpq-fe.h>
#include <windows.h>
#include <winsock2.h>

PGconn* asyncconnect(const char* cs,bool* lp_USER_cancel){
 int pqcp = 0;
 PGconn* lpcn = 0;
 if (lpcn = PQconnectStart(cs)){
  if (CONNECTION_BAD != PQstatus(lpcn)){
   bool keepon = true;
   while (keepon && !*lp_USER_cancel){
    switch(pqcp = PQconnectPoll(lpcn)){
    case PGRES_POLLING_READING:
     {
      SOCKET s = PQsocket(lpcn);
      timeval tv = {0,100000};
      int ns = 0;
      while (!*lp_USER_cancel && !ns){
       fd_set fdr,fde;
       FD_ZERO(&fdr);
       FD_ZERO(&fde);
       FD_SET(s,&fdr);
       FD_SET(s,&fde);
       ns = select(0,&fdr,0,&fde,&tv);
      };
     };
     break;
    case PGRES_POLLING_FAILED:
    case PGRES_POLLING_OK:
     keepon = false;
     break;
    };

    // NO!
    //  Sleep(1);

    /******************
    I'm guessing the connection gets discoed while the
    thread is sleeping, resetting
    the error message buffer to something other than
    the initial error?

    if we use a select(), (the right way) we do not
    have to sleep. Still, even the select does NOT always
    allow for catching it in time.

    IMHO, the error that causes
    the disco should never be overwritten by the disco
    message itself:

     'server closed the connection unexpectedly
     This probably means the server terminated abnormally
     before or while processing the request.'

    within the internal connection thread, IF this is
    indeed what is happening.
    *********************/
   };
  };
 };
 return lpcn;
};

int main(int na,char** sa){
 char* host    = "localhost";
 unsigned short port  = 5432;
 char* dbname   = "nonexistantdb";
 char* user    = "";
 char* password   = "";

 bool cancel = false;
 char cs[1024];

 sprintf(
  cs,
  "host=%s port=%u dbname=%s user=%s password=%s",
  host,port,dbname,user,password
 );

 if (PGconn* lpcn = asyncconnect(cs,&cancel)){
  printf("PQerrorMessage(lpcn) returns:\n\n%s\n\nPQstatus(lpcn) returns
%d\n",PQerrorMessage(lpcn),PQstatus(lpcn));
  PQfinish(lpcn);
 };

 return 0;

};
/////////////////////////////////////////////////

cheers, madhtr


----- Original Message -----
From: "Tom Lane" <tgl@sss.pgh.pa.us>
To: "madhtr" <madhtr@schif.org>
Cc: <pgsql-general@postgresql.org>
Sent: Tuesday, August 14, 2007 21:42
Subject: Re: [GENERAL] pqlib in c++: PQconnectStart PQconnectPoll


> "madhtr" <madhtr@schif.org> writes:
>> From: "Tom Lane" <tgl@sss.pgh.pa.us>
>>> ... although it takes a good long while (several seconds) because of the
>>> "sleep(1)" in the interaction with the postmaster.
>
>> Sleep(1) should be only 1/1000 of a second. I do that so I don't hammer
>> the
>> processor with my while loop when i am not  using a select().
>
> Ah.  I was interpreting it in Unix terms, where sleep() measures in
> seconds.  With a wait of a few msec it might not be too intolerable.
>
> regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>       choose an index scan if your joining column's datatypes do not
>       match



pgsql-general by date:

Previous
From: Michael Glaesemann
Date:
Subject: Re: automatic rollback?
Next
From: Ranjan Kumar Baisak
Date:
Subject: How to use Integer array in where IN clause parameter