Re: WIN32 Non Blocking

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Darko Prenosil <darko_prenosil(at)yahoo(dot)com>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: WIN32 Non Blocking
Date: 2001-07-17 12:51:45
Message-ID: 200107171251.f6HCpjX25947@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


I just got a new Win32 libpq patch. Please see it at:

http://candle.pha.pa.us/cgi-bin/pgpatches

How does your match with that one? I haven't applied it yet.

> 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;
> }
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly
>

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Bruce Momjian 2001-07-17 14:07:25 Re: WIN32 Non Blocking
Previous Message Denis A. Doroshenko 2001-07-17 12:30:50 Re: WIN32 Non Blocking