DateTime-Lite
view release on metacpan or search on metacpan
scripts/build_tz_database.pl view on Meta::CPAN
if( @versions )
{
my( $latest ) = sort {
my( $ya, $la ) = $a =~ /^(\d{4})([a-z]+)$/;
my( $yb, $lb ) = $b =~ /^(\d{4})([a-z]+)$/;
$yb <=> $ya || $lb cmp $la;
} @versions;
_message( 3, "Latest version found is '", ( $latest // 'undef' ), "'" );
return( $latest );
}
}
# Fallback: download tzdata-latest.tar.gz, read the VERSION from Makefile
_message( 1, " Falling back to tzdata-latest.tar.gz..." );
my $tmp = $cache_dir->child( 'tzdata-latest.tar.gz' );
# _download_ftp( IANA_LATEST_DATA, $tmp );
_download_web( IANA_LATEST_DATA, $tmp );
my $version = _version_from_tarball( $tmp );
# Rename to versioned name in cache
my $dest = $cache_dir->child( "tzdata${version}.tar.gz" );
$tmp->rename( $dest ) ||
die( "Cannot rename '$tmp' to '$dest': ", $tmp->error, "\n" );
return( $version );
}
sub _fetch_mirror
{
my( $url, $local ) = @_;
require HTTP::Promise;
my $ua = HTTP::Promise->new(
auto_switch_https => 1,
ext_vary => 1,
max_body_in_memory_size => 102400,
max_redirect => 3,
timeout => 10,
use_promise => 0,
( $opts->{http_debug} ? ( debug => $opts->{http_debug} ) : () ),
) || die( "Error instantiating a HTTP::Promise object: ", HTTP::Promise->error );
my $resp = $ua->mirror( $url => $local ) ||
die( "Failed to get the remote file $url and cache it locally to $local: ", $ua->error );
if( $resp->code == 304 )
{
_message( 2, "Local copy is already up to date (304 Not Modified)." );
}
elsif( $resp->is_success )
{
_message( 2, sprintf( "Downloaded fresh copy (HTTP %d); saved to %s",
$resp->code,
$local
) );
}
else
{
_message( 2, sprintf( "Unexpected response: HTTP %d %s",
$resp->code,
$resp->message
) );
}
my $out = $resp->decoded_content_utf8;
return( $out ) if( defined( $out ) && length( $out ) );
return;
}
sub _fetch_url
{
my $url = shift( @_ );
require HTTP::Promise;
my $ua = HTTP::Promise->new(
auto_switch_https => 1,
ext_vary => 1,
max_body_in_memory_size => 102400,
max_redirect => 3,
timeout => 10,
use_promise => 0,
( $opts->{http_debug} ? ( debug => $opts->{http_debug} ) : () ),
) || die( "Error instantiating a HTTP::Promise object: ", HTTP::Promise->error );
my $resp = $ua->get( $url ) ||
die( "Error fetching remote URL $url: ", $ua->error );
my $out = $resp->decoded_content_utf8;
return( $out ) if( defined( $out ) && length( $out ) );
return;
}
my %_tool_cache;
sub _has_tool
{
my $t = shift( @_ );
return( $_tool_cache{ $t } ) if( exists( $_tool_cache{ $t } ) );
my $bin = which( $t );
return( $_tool_cache{ $t } = $bin );
}
# This version triggers the warning:
# "Hexadecimal number > 0xffffffff non-portable"
# sub _i32be
# {
# my( $s ) = @_;
#
# my $u = unpack( 'N', $s );
# return( $u >= 0x80000000 ) ? $u - 0x100000000 : $u;
# }
sub _i32be
{
my( $s ) = @_;
return( unpack( 'l>', $s ) );
}
# sub _i64be
# {
# my( $s ) = @_;
#
# my( $hi, $lo ) = unpack( 'NN', $s );
# my $u = ( $hi * 4294967296 ) + $lo;
#
# return( $hi >= 0x80000000 ) ? $u - 18446744073709551616 : $u;
# }
sub _i64be
{
my( $s ) = @_;
if( $HAS_NATIVE_I64 )
{
return( unpack( 'q>', $s ) );
}
my( $hi, $lo ) = unpack( 'NN', $s );
my $u = ( $hi * 4294967296 ) + $lo;
# return( unpack( 'q>', $s ) );
return( $hi >= 2147483648 ) ? $u - 18446744073709551616 : $u;
}
sub _load_schema
{
my $schema_file = shift( @_ ) ||
die( "No schema file provided." );
my $sql = $schema_file->load_utf8 ||
die( $schema_file->error );
( run in 0.793 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )