>> Do you agree that using a hashtable for it in general is a good idea
authorBruce Momjian
Wed, 15 Jun 2005 00:09:26 +0000 (00:09 +0000)
committerBruce Momjian
Wed, 15 Jun 2005 00:09:26 +0000 (00:09 +0000)
>> 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

src/timezone/pgtz.c

index 38c719640654f44299606a85d9629a0d132d53e7..b5b9107c758c3b34638c003778a546aac270a929 100644 (file)
@@ -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]));