]> granicus.if.org Git - postgresql/commitdiff
i've spotted a following problem using DBD::Pg under win32. winsock
authorBruce Momjian <bruce@momjian.us>
Fri, 20 Jul 2001 17:45:06 +0000 (17:45 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 20 Jul 2001 17:45:06 +0000 (17:45 +0000)
functions do not set errno, so some normal conditions are treated as
fatal errors. e.g. fetching large tuples fails, as at some point recv()
returns EWOULDBLOCK. here's a patch, which replaces errno with
WSAGetLastError(). i've tried to to affect non-win32 code.

Dmitry Yurtaev

src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-misc.c
src/interfaces/libpq/win32.h

index 82008a58c3e90924c532e4492e00527a788d22a4..2582cdee8a8da86eee0cabd60e7ba1d07d41ebae 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.168 2001/07/16 20:05:51 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.169 2001/07/20 17:45:05 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -736,9 +736,6 @@ connectNoDelay(PGconn *conn)
                printfPQExpBuffer(&conn->errorMessage,
                                                  libpq_gettext("could not set socket to TCP no delay mode: %s\n"),
                                                  strerror(errno));
-#ifdef WIN32
-               printf("Winsock error: %i\n", WSAGetLastError());
-#endif
                return 0;
        }
 
@@ -937,11 +934,7 @@ connectDBStart(PGconn *conn)
         */
        if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0)
        {
-#ifndef WIN32
                if (errno == EINPROGRESS || errno == 0)
-#else
-               if (WSAGetLastError() == WSAEINPROGRESS)
-#endif
                {
 
                        /*
@@ -2142,7 +2135,11 @@ PQrequestCancel(PGconn *conn)
                strcpy(conn->errorMessage.data,
                           "PQrequestCancel() -- connection is not open\n");
                conn->errorMessage.len = strlen(conn->errorMessage.data);
+#ifdef WIN32
+               WSASetLastError(save_errno);
+#else
                errno = save_errno;
+#endif
                return FALSE;
        }
 
@@ -2184,11 +2181,12 @@ PQrequestCancel(PGconn *conn)
        /* Sent it, done */
 #ifdef WIN32
        closesocket(tmpsock);
+       WSASetLastError(save_errno);
 #else
        close(tmpsock);
+       errno = save_errno;
 #endif
 
-       errno = save_errno;
        return TRUE;
 
 cancel_errReturn:
@@ -2199,11 +2197,12 @@ cancel_errReturn:
        {
 #ifdef WIN32
                closesocket(tmpsock);
+               WSASetLastError(save_errno);
 #else
                close(tmpsock);
+               errno = save_errno;
 #endif
        }
-       errno = save_errno;
        return FALSE;
 }
 
index fcd2724b8ebdf19277548abf38b49483e1a50a84..924da5fcf257ae075d6d317d50c8afd51ba72442 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.103 2001/07/15 13:45:04 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.104 2001/07/20 17:45:06 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -223,7 +223,7 @@ pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary)
        }
 
        /* If there's enough space in the current block, no problem. */
-       if (nBytes <= res->spaceLeft)
+       if (nBytes <= (size_t)res->spaceLeft)
        {
                space = res->curBlock->space + res->curOffset;
                res->curOffset += nBytes;
@@ -1024,7 +1024,7 @@ getAnotherTuple(PGconn *conn, int binary)
                                vlen = 0;
                        if (tup[i].value == NULL)
                        {
-                               tup[i].value = (char *) pqResultAlloc(result, vlen + 1, binary);
+                               tup[i].value = (char *) pqResultAlloc(result, vlen + 1, (bool)binary);
                                if (tup[i].value == NULL)
                                        goto outOfMemory;
                        }
@@ -2051,7 +2051,11 @@ PQoidValue(const PGresult *res)
        if (!res || !res->cmdStatus || strncmp(res->cmdStatus, "INSERT ", 7) != 0)
                return InvalidOid;
 
+#ifdef WIN32
+       WSASetLastError(0);
+#else
        errno = 0;
+#endif
        result = strtoul(res->cmdStatus + 7, &endptr, 10);
 
        if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno == ERANGE)
index af7998ce97cb1821318b89d93347eb869910fd5c..6a4d753cebfd6a5acd2306d6569eddc283f4266b 100644 (file)
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.51 2001/07/15 13:45:04 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.52 2001/07/20 17:45:06 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "postgres_fe.h"
 
+#include <errno.h>
+#include <signal.h>
+#include <time.h>
+
 #ifdef WIN32
 #include "win32.h"
 #else
 #include <sys/time.h>
 #endif
 
-#include <errno.h>
-#include <signal.h>
-#include <time.h>
-
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
index c8cddb51dc4b88d4f2020c345748d0f1f1c1ae76..eb250350be42886499563cbb4f5598ade496c6f1 100644 (file)
  * crypt not available (yet)
  */
 #define crypt(a,b) a
+
+/*
+ * assumes that errno is used for sockets only
+ *
+ */
+
+#undef errno
+#undef EINTR
+#undef EAGAIN  /* doesn't apply on sockets */
+
+#define errno WSAGetLastError()
+#define EINTR WSAEINTR
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define ECONNRESET WSAECONNRESET
+#define EINPROGRESS WSAEINPROGRESS