diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 0104057584..7dd13f8a40 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.210 2002/10/15 01:48:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.211 2002/10/16 02:55:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1052,10 +1052,7 @@ connectDBComplete(PGconn *conn) { PostgresPollingStatusType flag = PGRES_POLLING_WRITING; - time_t finish_time = 0, - current_time; - struct timeval remains, - *rp = NULL; + time_t finish_time = -1; if (conn == NULL || conn->status == CONNECTION_BAD) return 0; @@ -1065,20 +1062,21 @@ connectDBComplete(PGconn *conn) */ if (conn->connect_timeout != NULL) { - remains.tv_sec = atoi(conn->connect_timeout); - if (!remains.tv_sec) + int timeout = atoi(conn->connect_timeout); + + if (timeout == 0) { conn->status = CONNECTION_BAD; return 0; } - remains.tv_usec = 0; /* We don't use subsecond timing */ - rp = &remains; - + /* Rounding could cause connection to fail;we need at least 2 secs */ + if (timeout == 1) + timeout++; /* calculate the finish time based on start + timeout */ - finish_time = time((time_t *) NULL) + remains.tv_sec; + finish_time = time(NULL) + timeout; } - while (rp == NULL || remains.tv_sec > 0) + while (finish_time == -1 || time(NULL) >= finish_time) { /* * Wait, if necessary. Note that the initial state (just after @@ -1094,7 +1092,7 @@ connectDBComplete(PGconn *conn) return 1; /* success! */ case PGRES_POLLING_READING: - if (pqWaitTimed(1, 0, conn, rp)) + if (pqWaitTimed(1, 0, conn, finish_time)) { conn->status = CONNECTION_BAD; return 0; @@ -1102,7 +1100,7 @@ connectDBComplete(PGconn *conn) break; case PGRES_POLLING_WRITING: - if (pqWaitTimed(0, 1, conn, rp)) + if (pqWaitTimed(0, 1, conn, finish_time)) { conn->status = CONNECTION_BAD; return 0; @@ -1119,20 +1117,6 @@ connectDBComplete(PGconn *conn) * Now try to advance the state machine. */ flag = PQconnectPoll(conn); - - /* - * If connecting timeout is set, calculate remaining time. - */ - if (rp != NULL) - { - if (time(¤t_time) == -1) - { - conn->status = CONNECTION_BAD; - return 0; - } - - remains.tv_sec = finish_time - current_time; - } } conn->status = CONNECTION_BAD; return 0; diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index 7b5a2eeb15..6cb7013514 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -25,7 +25,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.83 2002/10/14 18:11:17 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.84 2002/10/16 02:55:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -779,11 +779,11 @@ pqFlush(PGconn *conn) int pqWait(int forRead, int forWrite, PGconn *conn) { - return pqWaitTimed(forRead, forWrite, conn, (const struct timeval *) NULL); + return pqWaitTimed(forRead, forWrite, conn, -1); } int -pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout) +pqWaitTimed(int forRead, int forWrite, PGconn *conn, time_t finish_time) { fd_set input_mask; fd_set output_mask; @@ -820,7 +820,7 @@ retry5: FD_SET(conn->sock, &output_mask); FD_SET(conn->sock, &except_mask); - if (NULL != timeout) + if (finish_time != -1) { /* * select() may modify timeout argument on some platforms so @@ -831,7 +831,9 @@ retry5: * incorrect timings when select() is interrupted. * bjm 2002-10-14 */ - tmp_timeout = *timeout; + if ((tmp_timeout.tv_sec = finish_time - time(NULL)) < 0) + tmp_timeout.tv_sec = 0; /* possible? */ + tmp_timeout.tv_usec = 0; ptmp_timeout = &tmp_timeout; } if (select(conn->sock + 1, &input_mask, &output_mask, diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index e2ee2491f8..cde2b2d2b0 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: libpq-int.h,v 1.59 2002/10/14 17:15:11 momjian Exp $ + * $Id: libpq-int.h,v 1.60 2002/10/16 02:55:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -340,7 +340,8 @@ extern int pqReadData(PGconn *conn); extern int pqFlush(PGconn *conn); extern int pqSendSome(PGconn *conn); extern int pqWait(int forRead, int forWrite, PGconn *conn); -extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout); +extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn, + time_t finish_time); extern int pqReadReady(PGconn *conn); extern int pqWriteReady(PGconn *conn);