1 #################################################################
3 # win32tzlist.pl -- compare Windows timezone information
5 # Copyright (c) 2008-2024, 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.
19 use warnings FATAL
=> 'all';
23 our $HKEY_LOCAL_MACHINE;
27 if ($Config{osname
} eq 'MSWin32' || $Config{osname
} eq 'msys')
29 require Win32
::Registry
;
30 Win32
::Registry
->import;
34 my $tzfile = 'src/bin/initdb/findtimezone.c';
37 # Fetch all timezones in the registry
40 $HKEY_LOCAL_MACHINE->Open(
41 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", $basekey)
45 $basekey->GetKeys(\
@subkeys);
49 foreach my $keyname (@subkeys)
54 $basekey->Open($keyname, $subkey) or die $!;
55 $subkey->GetValues(\
%vals) or die $!;
58 die "Incomplete timezone data for $keyname!\n"
59 unless ($vals{Std
} && $vals{Dlt
} && $vals{Display
});
62 'std' => $vals{Std
}->[2],
63 'dlt' => $vals{Dlt
}->[2],
64 'display' => clean_displayname
($vals{Display
}->[2]),
71 # Fetch all timezones currently in the file
75 open(my $tzfh, '<', $tzfile) or die "Could not open $tzfile!\n";
82 # Attempt to locate and extract the complete win32_tzmap struct
83 $pgtz =~ /win32_tzmap\[\] =\s+{\s+\/\
*[^\
/]+\*\/\s
+(.+?
)};/gs
84 or die "Could not locate struct win32_tzmap in $tzfile!";
87 # Extract each individual record from the struct
89 m/{\s+\/\
*(.+?
)\
*\
/\s+"([^"]+)",\s+"([^"]+)",\s+"([^"]+)",?\s+},/gs)
93 'display' => clean_displayname
($1),
101 # Look for anything that has changed
105 for my $sys (@system_zones)
108 for my $file (@file_zones)
110 if ($sys->{std
} eq $file->{std
})
113 if ($sys->{dlt
} ne $file->{dlt
})
116 "Timezone $sys->{std}, changed name of daylight zone!\n";
118 if ($sys->{display
} ne $file->{display
})
121 "Timezone $sys->{std} changed displayname ('$sys->{display}' from '$file->{display}')!\n";
134 print "\n\nOther than that, add the following timezones:\n";
138 "\t{\n\t\t/* $z->{display} */\n\t\t\"$z->{std}\", \"$z->{dlt}\",\n\t\t\"FIXME\"\n\t},\n";
142 sub clean_displayname