1 #################################################################
3 # win32tzlist.pl -- compare Windows timezone information
5 # Copyright (c) 2008-2019, PostgreSQL Global Development Group
7 # src/tools/win32tzlist.pl
8 #################################################################
11 # This script compares the timezone information in the Windows registry
12 # with that in src/bin/initdb/findtimezone.c. A list of changes will be
13 # written to stdout - no attempt is made to automatically edit the file.
15 # Run the script from the top-level PG source directory.
23 my $tzfile = 'src/bin/initdb/findtimezone.c';
26 # Fetch all timezones in the registry
29 $HKEY_LOCAL_MACHINE->Open(
30 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", $basekey)
34 $basekey->GetKeys(\@subkeys);
38 foreach my $keyname (@subkeys)
43 $basekey->Open($keyname, $subkey) or die $!;
44 $subkey->GetValues(\%vals) or die $!;
47 die "Incomplete timezone data for $keyname!\n"
48 unless ($vals{Std} && $vals{Dlt} && $vals{Display});
51 'std' => $vals{Std}->[2],
52 'dlt' => $vals{Dlt}->[2],
53 'display' => clean_displayname($vals{Display}->[2]),
60 # Fetch all timezones currently in the file
63 open(my $tzfh, '<', $tzfile) or die "Could not open $tzfile!\n";
70 # Attempt to locate and extract the complete win32_tzmap struct
71 $pgtz =~ /win32_tzmap\[\] =\s+{\s+\/\*[^\/]+\*\/\s+(.+?)};/gs
72 or die "Could not locate struct win32_tzmap in $tzfile!";
75 # Extract each individual record from the struct
77 m/{\s+"([^"]+)",\s+"([^"]+)",\s+"([^"]+)",?\s+},\s+\/\*(.+?)\*\//gs)
84 'display' => clean_displayname($4),
89 # Look for anything that has changed
93 for my $sys (@system_zones)
96 for my $file (@file_zones)
98 if ($sys->{std} eq $file->{std})
101 if ($sys->{dlt} ne $file->{dlt})
104 "Timezone $sys->{std}, changed name of daylight zone!\n";
106 if ($sys->{display} ne $file->{display})
109 "Timezone $sys->{std} changed displayname ('$sys->{display}' from '$file->{display}')!\n";
122 print "\n\nOther than that, add the following timezones:\n";
126 "\t{\n\t\t\"$z->{std}\", \"$z->{dlt}\",\n\t\t\"FIXME\"\n\t},\t\t\t\t\t\t\t/* $z->{display} */\n";
130 sub clean_displayname