BackPAN-Version-Discover
view release on metacpan or search on metacpan
lib/BackPAN/Version/Discover/_BackPAN/Index.pm view on Meta::CPAN
for my $sql (@indexes) {
$dbh->do($sql);
}
}
sub _get_backpan_index {
my $self = shift;
my $url = $self->backpan_index_url;
return if !$self->_backpan_index_has_changed;
my $status = getstore($url, $self->_backpan_index_archive.'');
die "Error fetching $url: $status" unless is_success($status);
# Faster
local $Archive::Extract::PREFER_BIN = 1;
# Archive::Extract is vulnerable to the ORS.
local $\;
my $ae = Archive::Extract->new( archive => $self->_backpan_index_archive );
$ae->extract( to => $self->_backpan_index_file )
or die "Problem extracting @{[ $self->_backpan_index_archive ]}: @{[ $ae->error ]}";
# If the backpan index age is older than the TTL this prevents us
# from immediately looking again.
# XXX Should probably use a "last checked" semaphore file
$self->_backpan_index_file->touch;
return;
}
sub _backpan_index_archive {
my $self = shift;
my $file = URI->new($self->backpan_index_url)->path;
$file = Path::Class::file($file)->basename;
return Path::Class::file($file)->absolute($self->cache->directory);
}
sub _backpan_index_file {
my $self = shift;
my $file = $self->_backpan_index_archive;
$file =~ s{\.[^.]+$}{};
return Path::Class::file($file);
}
sub _backpan_index_has_changed {
my $self = shift;
my $file = $self->_backpan_index_file;
return 1 unless -e $file;
my $local_mod_time = stat($file)->mtime;
my $local_age = time - $local_mod_time;
return 0 unless $local_age > $self->cache->ttl;
# We looked, don't have to look again until the ttl is up.
$self->_backpan_index_file->touch;
my(undef, undef, $remote_mod_time) = head($self->backpan_index_url);
return $remote_mod_time > $local_mod_time;
}
sub files {
my $self = shift;
return $self->schema->resultset('File');
}
sub dist {
my($self, $dist) = @_;
return $self->dists->single({ name => $dist });
}
sub releases {
my($self, $dist) = @_;
return $self->schema->resultset("Release") unless defined $dist;
return $self->schema->resultset("Release")->search({ dist => $dist });
}
sub release {
my($self, $dist, $version) = @_;
return $self->releases($dist)->search(
-or => [
version => $version,
normal_version => $version,
],
)->single;
}
sub dists {
my $self = shift;
return $self->schema->resultset("Dist");
}
=head1 NAME
BackPAN::Index - An interface to the BackPAN index
=head1 SYNOPSIS
use BackPAN::Index;
my $backpan = BackPAN::Index->new;
( run in 0.574 second using v1.01-cache-2.11-cpan-39bf76dae61 )