Weather-GHCN-Fetch
view release on metacpan or search on metacpan
lib/Weather/GHCN/CacheURI.pm view on Meta::CPAN
$self->store($key, $content) if $content;
return ($FROM_URI, $content);
} else {
# page is unchanged, so use the cached file
my $content = $self->load($key);
return ($FROM_CACHE, $content);
}
}
# there's no cached file, so get the page from the URI and cache it
my $content = get($uri);
$self->store($key, $content) if $content;
return ($FROM_URI, $content);
}
method _fetch_refresh_n_days ($uri, $cutoff_mtime) {
# check whether the cache or page is older than N days
# if the cache file is younger than N days ago, use it
# otherwise get the latest page from the server
# check the server if the file is older than this year
my $key = $self->_uri_to_key($uri);
my $file = $self->_path_to_key($key);
my $st = stat $file;
if ($st and $st->mtime >= $cutoff_mtime) {
# the cached file we have is at or new than the cutoff, so we'll use it
my $content = $self->load($key);
return ($FROM_CACHE, $content);
}
# get the mtime for the URI
my ($ctype, $doclen, $mtime, $exp, $svr) = head($uri)
or croak '*E* unable to fetch header for: ' . $uri;
# our cached file is older than the cutoff, but if it's up to date
# with the web page then we can use it
if ($st and $st->mtime >= $mtime) {
# web page hasn't changed since it was cached. so we'll use it
my $content = $self->load($key);
return ($FROM_CACHE, $content);
}
# there's no cached file, or the cached file is out of date, so
# we get the page from the URI and cache it
my $content = get($uri);
$self->store($key, $content) if $content;
return ($FROM_URI, $content);
}
method _fetch_without_cache ($uri) {
# check for a fresher copy on the server
my $key = $self->_uri_to_key($uri);
my $content = get($uri);
return ($FROM_URI, $content);
}
method _uri_to_key ($uri) {
my @parts = split m{ $FSLASH }xms, $uri;
my $key = $parts[-1]; # use the last part as the key
# this transformation is for testing using CPAN pages and is not
# necessary for the NOAA GHCN pages we actually deal with
$key =~ s{ [:] }{}xmsg;
return $key;
}
method _path_to_key ($uri) {
return if not defined $uri;
my $key = $self->_uri_to_key( $uri );
my $filepath = path($_cachedir)->child($key)->stringify;
return $filepath;
}
######################################################################
# Private subroutines
######################################################################
sub _read_file ( $file ) {
return path($file)->slurp_utf8;
}
sub _write_file ( $file, $data ) {
return path($file)->spew_utf8( $data );
}
1;
__END__
=head1 AUTHOR
Gary Puckering (jgpuckering@rogers.com)
=head1 LICENSE AND COPYRIGHT
Copyright 2022, Gary Puckering
=cut
( run in 0.584 second using v1.01-cache-2.11-cpan-71847e10f99 )