diff options
author | Bruce Momjian <bruce@momjian.us> | 2005-06-15 00:09:26 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2005-06-15 00:09:26 +0000 |
commit | f4c4f1ce52b53d61bd000e2f113f352f8a52d8c2 (patch) | |
tree | a8e3ff3c7aff44cf87c6d6822509fd0d72a072b0 /src | |
parent | b4132fd0acd506ff62404edb8f9296dfaa8a4427 (diff) | |
download | postgresql-f4c4f1ce52b53d61bd000e2f113f352f8a52d8c2.tar.gz postgresql-f4c4f1ce52b53d61bd000e2f113f352f8a52d8c2.zip |
>> Do you agree that using a hashtable for it in general is a good idea
>> assuming this sideeffect is removed, though?
>
>I have no problem with the hashtable, only with preloading it with
>everything. What I'd like to see is that the table inherited at fork()
>contains just the data for the default timezone. (At least in the
>normal case where that setting hasn't been changed since postmaster
>start.)
Here's a patch doing this. Changes score_timezone not to use pg_tzset(),
and thus not loading all the zones in the cache. The actual timezone
being picked will be set using set_global_timezone() which in turn calls
pg_tzset() and loads it in the cache.
Magnus Hagander
Diffstat (limited to 'src')
-rw-r--r-- | src/timezone/pgtz.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/timezone/pgtz.c b/src/timezone/pgtz.c index 38c71964065..b5b9107c758 100644 --- a/src/timezone/pgtz.c +++ b/src/timezone/pgtz.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.32 2005/05/29 04:23:07 tgl Exp $ + * $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.33 2005/06/15 00:09:26 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -162,14 +162,19 @@ score_timezone(const char *tzname, struct tztry * tt) struct tm *systm; struct pg_tm *pgtm; char cbuf[TZ_STRLEN_MAX + 1]; - pg_tz *tz; + pg_tz tz; - tz = pg_tzset(tzname); - if (!tz) - return -1; /* can't handle the TZ name at all */ + + /* Load timezone directly. Don't use pg_tzset, because we don't want + * all timezones loaded in the cache at startup. */ + if (tzload(tzname, &tz.state) != 0) { + if (tzname[0] == ':' || tzparse(tzname, &tz.state, FALSE) != 0) { + return -1; /* can't handle the TZ name at all */ + } + } /* Reject if leap seconds involved */ - if (!tz_acceptable(tz)) + if (!tz_acceptable(&tz)) { elog(DEBUG4, "Reject TZ \"%s\": uses leap seconds", tzname); return -1; @@ -179,7 +184,7 @@ score_timezone(const char *tzname, struct tztry * tt) for (i = 0; i < tt->n_test_times; i++) { pgtt = (pg_time_t) (tt->test_times[i]); - pgtm = pg_localtime(&pgtt, tz); + pgtm = pg_localtime(&pgtt, &tz); if (!pgtm) return -1; /* probably shouldn't happen */ systm = localtime(&(tt->test_times[i])); |