mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-30 19:01:19 +02:00
Sync tzload() and tzparse() APIs with IANA release tzcode2016c.
This brings us a bit closer to matching upstream, but since it affects files outside src/timezone/, we might choose not to back-patch it. Hence keep it separate from the main update patch.
This commit is contained in:
parent
f5f15ea6aa
commit
1f4e9da624
@ -99,15 +99,15 @@ pg_load_tz(const char *name)
|
|||||||
*/
|
*/
|
||||||
if (strcmp(name, "GMT") == 0)
|
if (strcmp(name, "GMT") == 0)
|
||||||
{
|
{
|
||||||
if (tzparse(name, &tz.state, TRUE) != 0)
|
if (!tzparse(name, &tz.state, true))
|
||||||
{
|
{
|
||||||
/* This really, really should not happen ... */
|
/* This really, really should not happen ... */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (tzload(name, NULL, &tz.state, TRUE) != 0)
|
else if (tzload(name, NULL, &tz.state, true) != 0)
|
||||||
{
|
{
|
||||||
if (name[0] == ':' || tzparse(name, &tz.state, FALSE) != 0)
|
if (name[0] == ':' || !tzparse(name, &tz.state, false))
|
||||||
{
|
{
|
||||||
return NULL; /* unknown timezone */
|
return NULL; /* unknown timezone */
|
||||||
}
|
}
|
||||||
|
@ -409,7 +409,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
|
|||||||
struct state *ts = &lsp->u.st;
|
struct state *ts = &lsp->u.st;
|
||||||
|
|
||||||
up->buf[nread - 1] = '\0';
|
up->buf[nread - 1] = '\0';
|
||||||
if (tzparse(&up->buf[1], ts, false) == 0
|
if (tzparse(&up->buf[1], ts, false)
|
||||||
&& ts->typecnt == 2)
|
&& ts->typecnt == 2)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -534,7 +534,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
|
|||||||
* given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
|
* given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
tzload(const char *name, char *canonname, struct state * sp, int doextend)
|
tzload(const char *name, char *canonname, struct state * sp, bool doextend)
|
||||||
{
|
{
|
||||||
union local_storage ls;
|
union local_storage ls;
|
||||||
|
|
||||||
@ -864,13 +864,10 @@ transtime(int year, const struct rule * rulep,
|
|||||||
/*
|
/*
|
||||||
* Given a POSIX section 8-style TZ string, fill in the rule tables as
|
* Given a POSIX section 8-style TZ string, fill in the rule tables as
|
||||||
* appropriate.
|
* appropriate.
|
||||||
*
|
* Returns true on success, false on failure.
|
||||||
* Returns 0 on success, -1 on failure. (Note: tzcode has converted this
|
|
||||||
* to a bool true-on-success convention, but we're holding the line in PG
|
|
||||||
* for the moment, to avoid external API changes.)
|
|
||||||
*/
|
*/
|
||||||
int
|
bool
|
||||||
tzparse(const char *name, struct state * sp, int lastditch)
|
tzparse(const char *name, struct state * sp, bool lastditch)
|
||||||
{
|
{
|
||||||
const char *stdname;
|
const char *stdname;
|
||||||
const char *dstname = NULL;
|
const char *dstname = NULL;
|
||||||
@ -908,7 +905,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
stdname = name;
|
stdname = name;
|
||||||
name = getqzname(name, '>');
|
name = getqzname(name, '>');
|
||||||
if (*name != '>')
|
if (*name != '>')
|
||||||
return -1;
|
return false;
|
||||||
stdlen = name - stdname;
|
stdlen = name - stdname;
|
||||||
name++;
|
name++;
|
||||||
}
|
}
|
||||||
@ -918,13 +915,13 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
stdlen = name - stdname;
|
stdlen = name - stdname;
|
||||||
}
|
}
|
||||||
if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */
|
if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */
|
||||||
return -1;
|
return false;
|
||||||
name = getoffset(name, &stdoffset);
|
name = getoffset(name, &stdoffset);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return -1;
|
return false;
|
||||||
charcnt = stdlen + 1;
|
charcnt = stdlen + 1;
|
||||||
if (sizeof sp->chars < charcnt)
|
if (sizeof sp->chars < charcnt)
|
||||||
return -1;
|
return false;
|
||||||
load_ok = tzload(TZDEFRULES, NULL, sp, false) == 0;
|
load_ok = tzload(TZDEFRULES, NULL, sp, false) == 0;
|
||||||
}
|
}
|
||||||
if (!load_ok)
|
if (!load_ok)
|
||||||
@ -936,7 +933,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
dstname = ++name;
|
dstname = ++name;
|
||||||
name = getqzname(name, '>');
|
name = getqzname(name, '>');
|
||||||
if (*name != '>')
|
if (*name != '>')
|
||||||
return -1;
|
return false;
|
||||||
dstlen = name - dstname;
|
dstlen = name - dstname;
|
||||||
name++;
|
name++;
|
||||||
}
|
}
|
||||||
@ -947,15 +944,15 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
dstlen = name - dstname; /* length of DST zone name */
|
dstlen = name - dstname; /* length of DST zone name */
|
||||||
}
|
}
|
||||||
if (!dstlen)
|
if (!dstlen)
|
||||||
return -1;
|
return false;
|
||||||
charcnt += dstlen + 1;
|
charcnt += dstlen + 1;
|
||||||
if (sizeof sp->chars < charcnt)
|
if (sizeof sp->chars < charcnt)
|
||||||
return -1;
|
return false;
|
||||||
if (*name != '\0' && *name != ',' && *name != ';')
|
if (*name != '\0' && *name != ',' && *name != ';')
|
||||||
{
|
{
|
||||||
name = getoffset(name, &dstoffset);
|
name = getoffset(name, &dstoffset);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return -1;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dstoffset = stdoffset - SECSPERHOUR;
|
dstoffset = stdoffset - SECSPERHOUR;
|
||||||
@ -972,13 +969,13 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
|
|
||||||
++name;
|
++name;
|
||||||
if ((name = getrule(name, &start)) == NULL)
|
if ((name = getrule(name, &start)) == NULL)
|
||||||
return -1;
|
return false;
|
||||||
if (*name++ != ',')
|
if (*name++ != ',')
|
||||||
return -1;
|
return false;
|
||||||
if ((name = getrule(name, &end)) == NULL)
|
if ((name = getrule(name, &end)) == NULL)
|
||||||
return -1;
|
return false;
|
||||||
if (*name != '\0')
|
if (*name != '\0')
|
||||||
return -1;
|
return false;
|
||||||
sp->typecnt = 2; /* standard time and DST */
|
sp->typecnt = 2; /* standard time and DST */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1044,7 +1041,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
int j;
|
int j;
|
||||||
|
|
||||||
if (*name != '\0')
|
if (*name != '\0')
|
||||||
return -1;
|
return false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initial values of theirstdoffset and theirdstoffset.
|
* Initial values of theirstdoffset and theirdstoffset.
|
||||||
@ -1148,7 +1145,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
|
|||||||
memcpy(cp, dstname, dstlen);
|
memcpy(cp, dstname, dstlen);
|
||||||
*(cp + dstlen) = '\0';
|
*(cp + dstlen) = '\0';
|
||||||
}
|
}
|
||||||
return 0;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -256,7 +256,7 @@ pg_tzset(const char *name)
|
|||||||
*/
|
*/
|
||||||
if (strcmp(uppername, "GMT") == 0)
|
if (strcmp(uppername, "GMT") == 0)
|
||||||
{
|
{
|
||||||
if (tzparse(uppername, &tzstate, true) != 0)
|
if (!tzparse(uppername, &tzstate, true))
|
||||||
{
|
{
|
||||||
/* This really, really should not happen ... */
|
/* This really, really should not happen ... */
|
||||||
elog(ERROR, "could not initialize GMT time zone");
|
elog(ERROR, "could not initialize GMT time zone");
|
||||||
@ -266,7 +266,7 @@ pg_tzset(const char *name)
|
|||||||
}
|
}
|
||||||
else if (tzload(uppername, canonname, &tzstate, true) != 0)
|
else if (tzload(uppername, canonname, &tzstate, true) != 0)
|
||||||
{
|
{
|
||||||
if (uppername[0] == ':' || tzparse(uppername, &tzstate, false) != 0)
|
if (uppername[0] == ':' || !tzparse(uppername, &tzstate, false))
|
||||||
{
|
{
|
||||||
/* Unknown timezone. Fail our call instead of loading GMT! */
|
/* Unknown timezone. Fail our call instead of loading GMT! */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -69,7 +69,7 @@ extern int pg_open_tzfile(const char *name, char *canonname);
|
|||||||
|
|
||||||
/* in localtime.c */
|
/* in localtime.c */
|
||||||
extern int tzload(const char *name, char *canonname, struct state * sp,
|
extern int tzload(const char *name, char *canonname, struct state * sp,
|
||||||
int doextend);
|
bool doextend);
|
||||||
extern int tzparse(const char *name, struct state * sp, int lastditch);
|
extern bool tzparse(const char *name, struct state * sp, bool lastditch);
|
||||||
|
|
||||||
#endif /* _PGTZ_H */
|
#endif /* _PGTZ_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user