diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-02-17 02:09:32 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-02-17 02:09:32 +0000 |
commit | cd004067742ee16ee63e55abfb4acbd5f09fbaab (patch) | |
tree | 62995d45f55faf5f5cdddc791d4d83d3de495b03 /src/bin/pg_controldata/pg_controldata.c | |
parent | ee7a6770f607e9e7f0e1b29dc25a7b7d63cb7940 (diff) | |
download | postgresql-cd004067742ee16ee63e55abfb4acbd5f09fbaab.tar.gz postgresql-cd004067742ee16ee63e55abfb4acbd5f09fbaab.zip |
Replace time_t with pg_time_t (same values, but always int64) in on-disk
data structures and backend internal APIs. This solves problems we've seen
recently with inconsistent layout of pg_control between machines that have
32-bit time_t and those that have already migrated to 64-bit time_t. Also,
we can get out from under the problem that Windows' Unix-API emulation is not
consistent about the width of time_t.
There are a few remaining places where local time_t variables are used to hold
the current or recent result of time(NULL). I didn't bother changing these
since they do not affect any cross-module APIs and surely all platforms will
have 64-bit time_t before overflow becomes an actual risk. time_t should
be avoided for anything visible to extension modules, however.
Diffstat (limited to 'src/bin/pg_controldata/pg_controldata.c')
-rw-r--r-- | src/bin/pg_controldata/pg_controldata.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index 682a5cf3807..4cb6ada3129 100644 --- a/src/bin/pg_controldata/pg_controldata.c +++ b/src/bin/pg_controldata/pg_controldata.c @@ -6,7 +6,7 @@ * copyright (c) Oliver Elphick <olly@lfix.co.uk>, 2001; * licence: BSD * - * $PostgreSQL: pgsql/src/bin/pg_controldata/pg_controldata.c,v 1.36 2008/01/21 11:17:46 petere Exp $ + * $PostgreSQL: pgsql/src/bin/pg_controldata/pg_controldata.c,v 1.37 2008/02/17 02:09:29 tgl Exp $ */ #include "postgres.h" @@ -69,6 +69,7 @@ main(int argc, char *argv[]) char ControlFilePath[MAXPGPATH]; char *DataDir; pg_crc32 crc; + time_t time_tmp; char pgctime_str[128]; char ckpttime_str[128]; char sysident_str[32]; @@ -134,13 +135,20 @@ main(int argc, char *argv[]) "is expecting. The results below are untrustworthy.\n\n")); /* + * This slightly-chintzy coding will work as long as the control file + * timestamps are within the range of time_t; that should be the case + * in all foreseeable circumstances, so we don't bother importing the + * backend's timezone library into pg_controldata. + * * Use variable for format to suppress overly-anal-retentive gcc warning * about %c */ + time_tmp = (time_t) ControlFile.time; strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt, - localtime(&(ControlFile.time))); + localtime(&time_tmp)); + time_tmp = (time_t) ControlFile.checkPointCopy.time; strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt, - localtime(&(ControlFile.checkPointCopy.time))); + localtime(&time_tmp)); /* * Format system_identifier separately to keep platform-dependent format |