mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Add script to enumerate the timezones in the Windows registry and compare
it with the list we have in pgtz.c, showing any differences.
This commit is contained in:
parent
7a7663f61a
commit
17056e054e
@ -1,4 +1,4 @@
|
|||||||
$PostgreSQL: pgsql/src/timezone/README,v 1.8 2010/03/11 18:43:24 tgl Exp $
|
$PostgreSQL: pgsql/src/timezone/README,v 1.9 2010/04/15 11:00:45 mha Exp $
|
||||||
|
|
||||||
Timezone
|
Timezone
|
||||||
========
|
========
|
||||||
@ -24,3 +24,10 @@ Just search for the current or previous year and see what has changed.
|
|||||||
Sometimes a country changes its time zone offsets, for example Georgia
|
Sometimes a country changes its time zone offsets, for example Georgia
|
||||||
in 2004. Just grepping in the zic database files for 2004 is enough to
|
in 2004. Just grepping in the zic database files for 2004 is enough to
|
||||||
spot such a change. Then the files under tznames/ should be updated.
|
spot such a change. Then the files under tznames/ should be updated.
|
||||||
|
|
||||||
|
When there has been a new release of Windows (probably including Service
|
||||||
|
Packs), the list of matching timezones need to be updated. Run the
|
||||||
|
script in src/tools/win32tzlist.pl on a Windows machine running this new
|
||||||
|
release and apply any new timezones that it detects. Never remove any
|
||||||
|
mappings in case they are removed in Windows, since we still need to
|
||||||
|
match properly on the old version.
|
||||||
|
@ -12,7 +12,8 @@ For All Releases (major, minor, beta, RC)
|
|||||||
o add SGML markup
|
o add SGML markup
|
||||||
o check if 'gmake HISTORY.html' works for <link>s
|
o check if 'gmake HISTORY.html' works for <link>s
|
||||||
|
|
||||||
* Update timezone data to match latest zic database (see src/timezone/README)
|
* Update timezone data to match latest zic database and new
|
||||||
|
Windows releases, if any (see src/timezone/README)
|
||||||
|
|
||||||
* Translation updates
|
* Translation updates
|
||||||
Translations are kept in the project "pgtranslation" on PgFoundry.
|
Translations are kept in the project "pgtranslation" on PgFoundry.
|
||||||
|
134
src/tools/win32tzlist.pl
Executable file
134
src/tools/win32tzlist.pl
Executable file
@ -0,0 +1,134 @@
|
|||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
# win32tzlist.pl -- compare Windows timezone information
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2010, PostgreSQL Global Development Group
|
||||||
|
#
|
||||||
|
# $PostgreSQL: pgsql/src/tools/win32tzlist.pl,v 1.1 2010/04/15 11:00:45 mha Exp $
|
||||||
|
#################################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script compares the timezone information in the Windows
|
||||||
|
# registry with that in pgtz.c. A list of changes will be written
|
||||||
|
# to stdout - no attempt is made to automatically edit the file.
|
||||||
|
#
|
||||||
|
# Run the script from the src/timezone directory.
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Win32::Registry;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fetch all timezones in the registry
|
||||||
|
#
|
||||||
|
my $basekey;
|
||||||
|
$HKEY_LOCAL_MACHINE->Open("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", $basekey)
|
||||||
|
or die $!;
|
||||||
|
|
||||||
|
my @subkeys;
|
||||||
|
$basekey->GetKeys(\@subkeys);
|
||||||
|
|
||||||
|
my @system_zones;
|
||||||
|
|
||||||
|
foreach my $keyname (@subkeys)
|
||||||
|
{
|
||||||
|
my $subkey;
|
||||||
|
my %vals;
|
||||||
|
|
||||||
|
$basekey->Open($keyname, $subkey) or die $!;
|
||||||
|
$subkey->GetValues(\%vals) or die $!;
|
||||||
|
$subkey->Close();
|
||||||
|
|
||||||
|
die "Incomplete timezone data for $keyname!\n"
|
||||||
|
unless ($vals{Std} && $vals{Dlt} && $vals{Display});
|
||||||
|
push @system_zones,
|
||||||
|
{
|
||||||
|
'std'=>$vals{Std}->[2],
|
||||||
|
'dlt'=>$vals{Dlt}->[2],
|
||||||
|
'display'=>clean_displayname($vals{Display}->[2]),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
$basekey->Close();
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fetch all timezones currently in the file
|
||||||
|
#
|
||||||
|
my @file_zones;
|
||||||
|
open(PGTZ,'<pgtz.c') or die "Could not open pgtz.c!\n";
|
||||||
|
my $t = $/;
|
||||||
|
undef $/;
|
||||||
|
my $pgtz = <PGTZ>;
|
||||||
|
close(PGTZ);
|
||||||
|
$/ = $t;
|
||||||
|
|
||||||
|
# Attempt to locate and extract the complete win32_tzmap struct
|
||||||
|
$pgtz =~ /win32_tzmap\[\] =\s+{\s+\/\*[^\/]+\*\/\s+(.+?)};/gs
|
||||||
|
or die "Could not locate struct win32_tzmap in pgtz.c!";
|
||||||
|
$pgtz = $1;
|
||||||
|
|
||||||
|
# Extract each individual record from the struct
|
||||||
|
while ($pgtz =~ m/{\s+"([^"]+)",\s+"([^"]+)",\s+"([^"]+)",?\s+},\s+\/\*(.+?)\*\//gs)
|
||||||
|
{
|
||||||
|
push @file_zones,
|
||||||
|
{
|
||||||
|
'std'=>$1,
|
||||||
|
'dlt'=>$2,
|
||||||
|
'match'=>$3,
|
||||||
|
'display'=>clean_displayname($4),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Look for anything that has changed
|
||||||
|
#
|
||||||
|
my @add;
|
||||||
|
|
||||||
|
for my $sys (@system_zones)
|
||||||
|
{
|
||||||
|
my $match = 0;
|
||||||
|
for my $file (@file_zones)
|
||||||
|
{
|
||||||
|
if ($sys->{std} eq $file->{std})
|
||||||
|
{
|
||||||
|
$match=1;
|
||||||
|
if ($sys->{dlt} ne $file->{dlt})
|
||||||
|
{
|
||||||
|
print "Timezone $sys->{std}, changed name of daylight zone!\n";
|
||||||
|
}
|
||||||
|
if ($sys->{display} ne $file->{display})
|
||||||
|
{
|
||||||
|
print
|
||||||
|
"Timezone $sys->{std} changed displayname ('$sys->{display}' from '$file->{display}')!\n";
|
||||||
|
}
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unless ($match)
|
||||||
|
{
|
||||||
|
push @add, $sys;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@add)
|
||||||
|
{
|
||||||
|
print "\n\nOther than that, add the following timezones:\n";
|
||||||
|
for my $z (@add)
|
||||||
|
{
|
||||||
|
print
|
||||||
|
"\t{\n\t\t\"$z->{std}\", \"$z->{dlt}\",\n\t\t\"FIXME\"\n\t},\t\t\t\t\t\t\t/* $z->{display} */\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub clean_displayname
|
||||||
|
{
|
||||||
|
my $dn = shift;
|
||||||
|
|
||||||
|
$dn =~ s/\s+/ /gs;
|
||||||
|
$dn =~ s/\*//gs;
|
||||||
|
$dn =~ s/^\s+//gs;
|
||||||
|
$dn =~ s/\s+$//gs;
|
||||||
|
return $dn;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user