i've spotted a following problem using DBD::Pg under win32. winsock

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
This commit is contained in:
Bruce Momjian 2001-07-20 17:45:06 +00:00
parent 8f75c1b0c7
commit 8c79f3c4a3
4 changed files with 36 additions and 18 deletions

View 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;
}

View 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)

View File

@ -25,13 +25,17 @@
*
*
* 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
@ -39,10 +43,6 @@
#include <sys/time.h>
#endif
#include <errno.h>
#include <signal.h>
#include <time.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

View File

@ -21,3 +21,18 @@
* 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