mirror of
https://github.com/postgres/postgres.git
synced 2025-12-09 02:08:45 +03:00
Back-patch commit1c1a7cbd6a, along with subsequent portability fixes, into all active branches. Also, back-patch commits696027727and596857043(addition of zic -P option) into 9.1 and 9.2, just to reduce differences between the branches. src/timezone/ is now largely identical in all active branches, except that in 9.1, pgtz.c retains the initial-timezone-selection code that was moved over to initdb in 9.2. Ordinarily we wouldn't risk this much code churn in back branches, but it seems necessary in this case, because among the changes are two feature additions in the "zic" zone data file compiler (a larger limit on the number of allowed DST transitions, and addition of a "%z" escape in zone abbreviations). IANA have not yet started to use those features in their tzdata files, but presumably they will before too long. If we don't update then we'll be unable to adopt new timezone data. Also, installations built with --with-system-tzdata (which includes most distro-supplied builds, I believe) might fail even if we don't update our copies of the data files. There are assorted bug fixes too, mostly affecting obscure timezones or post-2037 dates. Discussion: <13601.1468868947@sss.pgh.pa.us>
76 lines
1.9 KiB
C
76 lines
1.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pgtz.h
|
|
* Timezone Library Integration Functions
|
|
*
|
|
* Note: this file contains only definitions that are private to the
|
|
* timezone library. Public definitions are in pgtime.h.
|
|
*
|
|
* Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* src/timezone/pgtz.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef _PGTZ_H
|
|
#define _PGTZ_H
|
|
|
|
#include "pgtime.h"
|
|
#include "tzfile.h"
|
|
|
|
|
|
#define SMALLEST(a, b) (((a) < (b)) ? (a) : (b))
|
|
#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
|
|
|
|
struct ttinfo
|
|
{ /* time type information */
|
|
int32 tt_gmtoff; /* UT offset in seconds */
|
|
bool tt_isdst; /* used to set tm_isdst */
|
|
int tt_abbrind; /* abbreviation list index */
|
|
bool tt_ttisstd; /* transition is std time */
|
|
bool tt_ttisgmt; /* transition is UT */
|
|
};
|
|
|
|
struct lsinfo
|
|
{ /* leap second information */
|
|
pg_time_t ls_trans; /* transition time */
|
|
int64 ls_corr; /* correction to apply */
|
|
};
|
|
|
|
struct state
|
|
{
|
|
int leapcnt;
|
|
int timecnt;
|
|
int typecnt;
|
|
int charcnt;
|
|
bool goback;
|
|
bool goahead;
|
|
pg_time_t ats[TZ_MAX_TIMES];
|
|
unsigned char types[TZ_MAX_TIMES];
|
|
struct ttinfo ttis[TZ_MAX_TYPES];
|
|
char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, 3 /* sizeof gmt */ ),
|
|
(2 * (TZ_STRLEN_MAX + 1)))];
|
|
struct lsinfo lsis[TZ_MAX_LEAPS];
|
|
int defaulttype; /* for early times or if no transitions */
|
|
};
|
|
|
|
|
|
struct pg_tz
|
|
{
|
|
/* TZname contains the canonically-cased name of the timezone */
|
|
char TZname[TZ_STRLEN_MAX + 1];
|
|
struct state state;
|
|
};
|
|
|
|
|
|
/* in pgtz.c */
|
|
extern int pg_open_tzfile(const char *name, char *canonname);
|
|
|
|
/* in localtime.c */
|
|
extern int tzload(const char *name, char *canonname, struct state * sp,
|
|
bool doextend);
|
|
extern bool tzparse(const char *name, struct state * sp, bool lastditch);
|
|
|
|
#endif /* _PGTZ_H */
|