mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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:
parent
8f75c1b0c7
commit
8c79f3c4a3
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user