mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03: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:
@@ -12,7 +12,8 @@ For All Releases (major, minor, beta, RC)
|
||||
o add SGML markup
|
||||
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
|
||||
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;
|
||||
}
|
Reference in New Issue
Block a user