Received: from postgresql.org.org (webmail.postgresql.org [216.126.85.28]) by postgresql.org (8.11.3/8.11.1) with SMTP id f6HBrDa95605 for ; Tue, 17 Jul 2001 07:53:13 -0400 (EDT) (envelope-from pgsql-interfaces-owner@postgresql.org) Received: from news.tht.net (news.hub.org [216.126.91.242]) by postgresql.org (8.11.3/8.11.1) with ESMTP id f6GN13a75888 for ; Mon, 16 Jul 2001 19:01:03 -0400 (EDT) (envelope-from news@news.tht.net) Received: (from news@localhost) by news.tht.net (8.11.4/8.11.4) id f6GMkXV57399 for pgsql-interfaces@postgresql.org; Mon, 16 Jul 2001 18:46:33 -0400 (EDT) (envelope-from news) From: "Darko Prenosil" X-Newsgroups: comp.databases.postgresql.interfaces Subject: WIN32 NON-BLOCKING Date: Tue, 17 Jul 2001 00:46:20 +0200 Organization: Hub.Org Networking Services (http://www.hub.org) Lines: 291 Message-ID: <9ivqs7$1o1k$1@news.tht.net> X-Complaints-To: scrappy@hub.org X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4522.1200 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 To: pgsql-interfaces@postgresql.org X-Archive-Number: 200107/62 X-Sequence-Number: 1815 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; }