CPAN-Testers-Data-Uploads
view release on metacpan or search on metacpan
lib/CPAN/Testers/Data/Uploads.pm view on Meta::CPAN
my $self = {};
bless $self, $class;
$self->_init_options(@_);
return $self;
}
sub DESTROY {
my $self = shift;
}
__PACKAGE__->mk_accessors(
qw( uploads backpan cpan logfile logclean lastfile journal
mgenerate mupdate mbackup mreindex ));
sub process {
my $self = shift;
$self->generate() if($self->mgenerate);
$self->reindex() if($self->mreindex);
$self->update() if($self->mupdate);
$self->backup() if($self->mbackup);
}
sub generate {
my $self = shift;
my $db = $self->uploads;
$self->_log("Restarting uploads database");
$db->do_query($phrasebook{'DeleteAll'});
$self->_log("Creating BACKPAN entries");
my @files = File::Find::Rule->file()->name($extn)->in($self->backpan);
$self->_parse_archive('backpan',$_) for(@files);
$self->_log("Creating CPAN entries");
@files = File::Find::Rule->file()->name($extn)->in($self->cpan);
$self->_parse_archive('cpan',$_) for(@files);
}
sub reindex {
my $self = shift;
my $db = $self->uploads;
$self->_log("Reindexing by author");
my $next = $db->iterator('hash',$phrasebook{'GetAllAuthors'});
while(my $author = $next->()) {
$self->_log(".. author = $author->{author}");
my @rows = $db->get_query('hash',$phrasebook{'BuildAuthorIndex'},$author->{author});
for my $row (@rows) {
$self->_log(".... dist = $row->{dist}, latest = $row->{version}");
$db->do_query($phrasebook{'DeleteIndex'},$row->{dist},$row->{author});
$db->do_query($phrasebook{'InsertIndex'},$oncpan{$row->{type}},$row->{author},$row->{version},$row->{released},$row->{dist});
}
}
$self->_log("Reindexing authors done");
}
sub update {
my $self = shift;
my $db = $self->uploads;
$self->_open_journal();
# get list of db known CPAN distributions
my @rows = $db->get_query('hash',$phrasebook{'FindDistTypes'},'cpan');
my %cpan = map {$_->{filename} => $_} @rows;
# get currently mirrored CPAN entries
$self->_log("Updating CPAN entries");
my @files = File::Find::Rule->file()->name($extn)->in($self->cpan);
for(@files) {
if(my $file = $self->_parse_archive('cpan',$_,1)) {
delete $cpan{$file};
} else {
#$self->_log(".. cannot parse: $_");
}
}
# demote any distributions no longer on CPAN
$self->_log("Updating BACKPAN entries");
for my $file (keys %cpan) {
#$self->_log("backpan => $cpan{$file}->{dist} => $cpan{$file}->{version} => $cpan{$file}->{author} => $cpan{$file}->{released}");
$self->_write_journal('UpdateDistVersion','backpan',$cpan{$file}->{author},$cpan{$file}->{dist},$cpan{$file}->{version});
$db->do_query($phrasebook{'AmendIndex'},2,$cpan{$file}->{author},$cpan{$file}->{version},$cpan{$file}->{dist});
}
# read NNTP
$self->_log("Updating NNTP entries");
my ($nntp,$num,$first,$last) = $self->_nntp_connect();
my $lastid = $self->_lastid();
return if($last <= $lastid);
$self->_log(".. from $lastid to $last");
for(my $id = $lastid+1; $id <= $last; $id++) {
#$self->_log("NNTP ID = $id");
my $article = join "", @{$nntp->article($id) || []};
next unless($article);
my $object = CPAN::Testers::Common::Article->new($article);
next unless($object);
$self->_log("... [$id] subject=".($object->subject()));
my ($name,$version,$cpanid,$date,$filename);
if($object->parse_upload()) {
$name = $object->distribution;
$version = $object->version;
$cpanid = $object->author;
$date = $object->epoch;
$filename = $object->filename;
}
#$self->_log("... name=$name");
#$self->_log("... version=$version");
#$self->_log("... cpanid=$cpanid");
#$self->_log("... date=$date");
next unless($name && $version && $cpanid && $date);
#$self->_log("upload => $name => $version => $cpanid => $date");
( run in 1.226 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )