From 4d56dbd678fb84cac66a47421ae06a090d438a99 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Thu, 31 Dec 1998 16:30:59 +0000 Subject: [PATCH] Change ordering of HAVE_TM_ZONE and HAVE_INT_TIMEZONE code blocks to give HAVE_TM_ZONE priority. This fixes glibc2 machines and any other machine which passes both tests in configure. Repair HAVE_TM_ZONE code which stuffs tm structure with date type values. Same problems as were originally there before v6.1, but never noticed. Thanks to Oleg for nagging :) --- src/backend/utils/adt/datetime.c | 46 +++++++++++++++++-------- src/backend/utils/adt/dt.c | 59 ++++++++++++++++++-------------- src/backend/utils/adt/nabstime.c | 23 ++++++------- 3 files changed, 76 insertions(+), 52 deletions(-) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 9b612ea4cf..bb5d6ed278 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.25 1998/09/01 03:25:54 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.26 1998/12/31 16:30:56 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -339,7 +339,7 @@ abstime_date(AbsoluteTime abstime) * and then convert again to try to get the time zones correct. */ static int -date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn) +date2tm(DateADT dateVal, int *tzp, struct tm *tm, double *fsec, char **tzn) { struct tm *tx; time_t utime; @@ -357,14 +357,18 @@ date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn) /* convert to system time */ utime = ((dateVal + (date2j(2000, 1, 1) - date2j(1970, 1, 1))) * 86400); - utime += (12 * 60 * 60);/* rotate to noon to get the right day in - * time zone */ + /* rotate to noon to get the right day in time zone */ + utime += (12 * 60 * 60); #ifdef USE_POSIX_TIME tx = localtime(&utime); #ifdef DATEDEBUG -#ifdef HAVE_INT_TIMEZONE +#if defined(HAVE_TM_ZONE) + printf("date2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s dst=%d\n", + tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, (double) tm->tm_sec, + tx->tm_zone, tx->tm_isdst); +#elif defined(HAVE_INT_TIMEZONE) printf("date2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s %s dst=%d\n", tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, (double) tm->tm_sec, tzname[0], tzname[1], tx->tm_isdst); @@ -375,21 +379,21 @@ date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn) tm->tm_mday = tx->tm_mday; tm->tm_isdst = tx->tm_isdst; -#ifdef HAVE_INT_TIMEZONE - *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); - if (tzn != NULL) - *tzn = tzname[(tm->tm_isdst > 0)]; - -#else /* !HAVE_INT_TIMEZONE */ +#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = tx->tm_gmtoff; tm->tm_zone = tx->tm_zone; - *tzp = (tm->tm_isdst ? (tm->tm_gmtoff - 3600) : tm->tm_gmtoff); /* tm_gmtoff is - * Sun/DEC-ism */ + /* tm_gmtoff is Sun/DEC-ism */ + *tzp = -(tm->tm_gmtoff); if (tzn != NULL) - *tzn = tm->tm_zone; + *tzn = (char *)tm->tm_zone; +#elif defined(HAVE_INT_TIMEZONE) + *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); + if (tzn != NULL) + *tzn = tzname[(tm->tm_isdst > 0)]; +#else +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif - #else /* !USE_POSIX_TIME */ *tzp = CTimeZone; /* V7 conventions; don't know timezone? */ if (tzn != NULL) @@ -411,6 +415,18 @@ date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn) *tzn = NULL; } +#ifdef DATEDEBUG +#if defined(HAVE_TM_ZONE) + printf("date2tm- %d.%02d.%02d %02d:%02d:%02.0f (%d %s) dst=%d\n", + tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, (double) tm->tm_sec, + *tzp, tm->tm_zone, tm->tm_isdst); +#elif defined(HAVE_INT_TIMEZONE) + printf("date2tm- %d.%02d.%02d %02d:%02d:%02.0f (%d %s %s) dst=%d\n", + tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, (double) tm->tm_sec, + *tzp, tzname[0], tzname[1], tm->tm_isdst); +#endif +#endif + return 0; } /* date2tm() */ diff --git a/src/backend/utils/adt/dt.c b/src/backend/utils/adt/dt.c index fc9a71cc59..f08d70ccc5 100644 --- a/src/backend/utils/adt/dt.c +++ b/src/backend/utils/adt/dt.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.59 1998/10/08 18:30:07 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.60 1998/12/31 16:30:57 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -1454,11 +1454,12 @@ datetime_trunc(text *units, DateTime *datetime) tm->tm_year += 1900; tm->tm_mon += 1; -#ifdef HAVE_INT_TIMEZONE - tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); - -#else /* !HAVE_INT_TIMEZONE */ +#if defined(HAVE_TM_ZONE) tz = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ +#elif defined(HAVE_INT_TIMEZONE) + tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); +#else +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif #else /* !USE_POSIX_TIME */ @@ -2414,16 +2415,17 @@ datetime2tm(DateTime dt, int *tzp, struct tm * tm, double *fsec, char **tzn) #ifdef USE_POSIX_TIME tx = localtime(&utime); #ifdef DATEDEBUG -#ifdef HAVE_INT_TIMEZONE +#if defined(HAVE_TM_ZONE) + printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s dst=%d\n", + tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, sec, + tx->tm_zone, tx->tm_isdst); +#elif defined(HAVE_INT_TIMEZONE) printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s %s dst=%d\n", tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, sec, tzname[0], tzname[1], tx->tm_isdst); #else - printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s dst=%d\n", - tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, sec, - tx->tm_zone, tx->tm_isdst); +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif -#else #endif tm->tm_year = tx->tm_year + 1900; tm->tm_mon = tx->tm_mon + 1; @@ -2442,18 +2444,19 @@ datetime2tm(DateTime dt, int *tzp, struct tm * tm, double *fsec, char **tzn) #endif tm->tm_isdst = tx->tm_isdst; -#ifdef HAVE_INT_TIMEZONE - *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); - if (tzn != NULL) - *tzn = tzname[(tm->tm_isdst > 0)]; - -#else /* !HAVE_INT_TIMEZONE */ +#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = tx->tm_gmtoff; tm->tm_zone = tx->tm_zone; *tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ if (tzn != NULL) - *tzn = tm->tm_zone; + *tzn = (char *)tm->tm_zone; +#elif defined(HAVE_INT_TIMEZONE) + *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); + if (tzn != NULL) + *tzn = tzname[(tm->tm_isdst > 0)]; +#else +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif #else /* !USE_POSIX_TIME */ @@ -2488,7 +2491,10 @@ datetime2tm(DateTime dt, int *tzp, struct tm * tm, double *fsec, char **tzn) #ifdef DATEDEBUG #ifdef USE_POSIX_TIME -#ifdef HAVE_INT_TIMEZONE +#if defined(HAVE_TM_ZONE) + printf("datetime2tm- timezone is %s; offset is %d\n", + tm->tm_zone, ((tzp != NULL) ? *tzp : 0)); +#elif defined(HAVE_INT_TIMEZONE) printf("datetime2tm- timezone is %s; offset is %d (%d); daylight is %d\n", tzname[tm->tm_isdst != 0], ((tzp != NULL) ? *tzp : 0), CTimeZone, CDayLight); #endif @@ -3034,11 +3040,12 @@ DecodeDateTime(char **field, int *ftype, int nf, tm->tm_year += 1900; tm->tm_mon += 1; -#ifdef HAVE_INT_TIMEZONE - *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); - -#else /* !HAVE_INT_TIMEZONE */ +#if defined(HAVE_TM_ZONE) *tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ +#elif defined(HAVE_INT_TIMEZONE) + *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); +#else +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif #else /* !USE_POSIX_TIME */ @@ -4104,12 +4111,14 @@ EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, cha #ifdef DATEDEBUG #ifdef USE_POSIX_TIME -#ifdef HAVE_INT_TIMEZONE +#if defined(HAVE_TM_ZONE) + printf("EncodeDateTime- timezone is %s (%s); offset is %ld (%d); daylight is %d (%d)\n", + *tzn, tm->tm_zone, (-tm->tm_gmtoff), CTimeZone, tm->tm_isdst, CDayLight); +#elif defined(HAVE_INT_TIMEZONE) printf("EncodeDateTime- timezone is %s (%s); offset is %d (%d); daylight is %d (%d)\n", *tzn, tzname[0], *tzp, CTimeZone, tm->tm_isdst, CDayLight); #else - printf("EncodeDateTime- timezone is %s (%s); offset is %ld (%d); daylight is %d (%d)\n", - *tzn, tm->tm_zone, (-tm->tm_gmtoff), CTimeZone, tm->tm_isdst, CDayLight); +#error USE_POSIX_TIME is defined but neither HAVE_TM_ZONE or HAVE_INT_TIMEZONE are defined #endif #else printf("EncodeDateTime- timezone is %s (%s); offset is %d; daylight is %d\n", diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index 95c1442ac3..b6147490be 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -4,7 +4,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: nabstime.c,v 1.50 1998/12/15 15:28:57 scrappy Exp $ + * $Id: nabstime.c,v 1.51 1998/12/31 16:30:59 thomas Exp $ * */ #include @@ -57,7 +57,7 @@ GetCurrentAbsoluteTime(void) if (!HasCTZSet) { #ifdef USE_POSIX_TIME -#ifdef HAVE_TM_ZONE +#if defined(HAVE_TM_ZONE) tm = localtime(&now); CTimeZone = -tm->tm_gmtoff; /* tm_gmtoff is Sun/DEC-ism */ @@ -86,9 +86,8 @@ GetCurrentAbsoluteTime(void) CTimeZone = tb.timezone * 60; CDayLight = (tb.dstflag != 0); - /* - * XXX does this work to get the local timezone string in V7? - - * tgl 97/03/18 + /* XXX does this work to get the local timezone string in V7? + * - tgl 97/03/18 */ strftime(CTZName, MAXTZLEN, "%Z", localtime(&now)); #endif @@ -136,14 +135,14 @@ abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn) #endif #if defined(DATEDEBUG) -#if (! defined(HAVE_TM_ZONE)) && defined(HAVE_INT_TIMEZONE) - printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02d %s %s dst=%d\n", - tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, tx->tm_sec, - tzname[0], tzname[1], tx->tm_isdst); -#else +#if defined(HAVE_TM_ZONE) printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02d %s dst=%d\n", tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, tx->tm_sec, tx->tm_zone, tx->tm_isdst); +#elif defined(HAVE_INT_TIMEZONE) + printf("datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02d %s %s dst=%d\n", + tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, tx->tm_sec, + tzname[0], tzname[1], tx->tm_isdst); #endif #endif @@ -157,7 +156,7 @@ abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn) tm->tm_sec = tx->tm_sec; tm->tm_isdst = tx->tm_isdst; -#ifdef HAVE_TM_ZONE +#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = tx->tm_gmtoff; tm->tm_zone = tx->tm_zone; @@ -171,7 +170,7 @@ abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn) *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); if (tzn != NULL) strcpy(tzn, tzname[tm->tm_isdst]); -#else /* !HAVE_INT_TIMEZONE */ +#else #error POSIX time support is broken #endif #else /* ! USE_POSIX_TIME */