WIN32 Non Blocking

From: "Darko Prenosil" <darko_prenosil(at)yahoo(dot)com>
To: pgsql-bugs(at)postgresql(dot)org
Subject: WIN32 Non Blocking
Date: 2001-07-16 22:12:48
Message-ID: 9ivp00$1nmo$1@news.tht.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi ,Bruce !
There is diff for fe-connect.c.
Diff was made with options -cr as You asked.
I must say that this is the first time I ever use diff, so I do not know if
if it is ok.

I did not check if all of non-blocking functions are working,
but I checked PQsetnonblocking,PQisnonblocking,
PQsendQuery, PQgetResult and few others.
I think that

*** ./fe-connect.c Tue Jun 12 20:03:04 2001
--- ./fe-connect1.c Fri Jun 29 05:25:18 2001
***************
*** 189,195 ****
static void defaultNoticeProcessor(void *arg, const char *message);
static int parseServiceInfo(PQconninfoOption *options,
PQExpBuffer errorMessage);
!

/* ----------------
* Connecting to a Database
--- 189,195 ----
static void defaultNoticeProcessor(void *arg, const char *message);
static int parseServiceInfo(PQconninfoOption *options,
PQExpBuffer errorMessage);
! static char FLastError[200];

/* ----------------
* Connecting to a Database
***************
*** 240,249 ****
PQconnectdb(const char *conninfo)
{
PGconn *conn = PQconnectStart(conninfo);
-
if (conn && conn->status != CONNECTION_BAD)
(void) connectDBComplete(conn);
-
return conn;
}

--- 240,247 ----
***************
*** 291,296 ****
--- 289,295 ----
{
conn->status = CONNECTION_BAD;
/* errorMessage is already set */
+ sprintf( FLastError, "PQconnectStart-Invalid Connection Info");
return conn;
}

***************
*** 516,523 ****
conn->require_ssl = 0;
#endif

! if (error)
conn->status = CONNECTION_BAD;
else
{
if (connectDBStart(conn))
--- 515,524 ----
conn->require_ssl = 0;
#endif

! if (error){
conn->status = CONNECTION_BAD;
+ sprintf( FLastError, "Failed to set DBLogin");
+ }
else
{
if (connectDBStart(conn))
***************
*** 709,717 ****
if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
#endif
{
printfPQExpBuffer(&conn->errorMessage,
! "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n",
! errno, strerror(errno));
return 0;
}

--- 710,724 ----
if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
#endif
{
+ #ifdef WIN32
+ sprintf( FLastError, "connectMakeNonblocking -- fcntl() failed:
errno=%d\n%s\n",
+ WSAGetLastError());
+ #else
printfPQExpBuffer(&conn->errorMessage,
! "connectMakeNonblocking -- fcntl() failed: errno=%d\n%s\n",
! errno, strerror(errno));
! #endif
!
return 0;
}

***************
*** 788,794 ****
{
int portno,
family;
-
#ifdef USE_SSL
StartupPacket np; /* Used to negotiate SSL connection */
char SSLok;
--- 795,800 ----
***************
*** 932,943 ****
* Thus, we have make arrangements for all eventualities.
* ----------
*/
if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0)
{
- #ifndef WIN32
if (errno == EINPROGRESS || errno == 0)
#else
! if (WSAGetLastError() == WSAEINPROGRESS)
#endif
{

--- 938,952 ----
* Thus, we have make arrangements for all eventualities.
* ----------
*/
+
+ #ifndef WIN32
if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0)
{
if (errno == EINPROGRESS || errno == 0)
#else
! if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) != 0)
! {
! if (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() ==
WSAEWOULDBLOCK)
#endif
{

***************
*** 1056,1061 ****
--- 1065,1071 ----
conn->status = CONNECTION_BAD;

return 0;
+
}

***************
*** 1095,1100 ****
--- 1105,1111 ----
if (pqWait(1, 0, conn))
{
conn->status = CONNECTION_BAD;
+ sprintf(FLastError,conn->errorMessage.data);
return 0;
}
break;
***************
*** 1103,1108 ****
--- 1114,1120 ----
if (pqWait(0, 1, conn))
{
conn->status = CONNECTION_BAD;
+ sprintf(FLastError,conn->errorMessage.data);
return 0;
}
break;
***************
*** 1110,1115 ****
--- 1122,1128 ----
default:
/* Just in case we failed to set it in PQconnectPoll */
conn->status = CONNECTION_BAD;
+ sprintf(FLastError,conn->errorMessage.data);
return 0;
}

***************
*** 1208,1222 ****
{
ACCEPT_TYPE_ARG3 laddrlen;

- #ifndef WIN32
- int optval;
-
- #else
- char optval;
-
- #endif
- ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
-
/*
* Write ready, since we've made it here, so the
* connection has been made.
--- 1221,1226 ----
***************
*** 1226,1235 ****
* Now check (using getsockopt) that there is not an error
* state waiting for us on the socket.
*/

if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
! (char *) &optval, &optlen) == -1)
! {
printfPQExpBuffer(&conn->errorMessage,
"PQconnectPoll() -- getsockopt() failed: "
"errno=%d\n%s\n",
--- 1230,1241 ----
* Now check (using getsockopt) that there is not an error
* state waiting for us on the socket.
*/
+ #ifndef WIN32
+ int optval;
+ ACCEPT_TYPE_ARG3 optlen = sizeof(optval);

if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
! (char *) &optval, &optlen) == -1){
printfPQExpBuffer(&conn->errorMessage,
"PQconnectPoll() -- getsockopt() failed: "
"errno=%d\n%s\n",
***************
*** 1247,1252 ****
--- 1253,1272 ----
connectFailureMessage(conn, "PQconnectPoll()", optval);
goto error_return;
}
+ #else
+ char far optval[8];
+ ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
+
+ int OptResult=getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,optval,
&optlen);
+ if (OptResult==SOCKET_ERROR){
+ printfPQExpBuffer(&conn->errorMessage,
+ "PQconnectPoll() -- getsockopt() failed: "
+ "errno=%i\n",
+ WSAGetLastError());
+ connectFailureMessage(conn, "PQconnectPoll()", OptResult);
+ goto error_return;
+ }
+ #endif

/* Fill in the client address */
laddrlen = sizeof(conn->laddr);
***************
*** 1929,1934 ****
--- 1949,1955 ----
#endif
if (conn->sock >= 0)
#ifdef WIN32
+ //WSACleanup();
closesocket(conn->sock);
#else
close(conn->sock);
***************
*** 2699,2706 ****
char *
PQerrorMessage(const PGconn *conn)
{
if (!conn)
! return "PQerrorMessage: conn pointer is NULL\n";

return conn->errorMessage.data;
}
--- 2720,2732 ----
char *
PQerrorMessage(const PGconn *conn)
{
+ //char ErrBuffer[200];
if (!conn)
! #ifdef WIN32
! return FLastError;
! #else
! return "PQerrorMessage: conn pointer is NULL\n";
! #endif

return conn->errorMessage.data;
}

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Sumant , The Programmer 2001-07-17 12:20:55 Doubt
Previous Message Bruce Momjian 2001-07-16 19:17:40 Re: pgsql