package Packages::DoDownload; use strict; use warnings; use POSIX; use CGI (); use DB_File; use Benchmark ':hireswallclock'; use Exporter; use Deb::Versions; use Packages::Search qw( :all ); use Packages::Config qw( $DBDIR @SUITES @ARCHIVES @SECTIONS @ARCHITECTURES ); use Packages::CGI; use Packages::DB; our @ISA = qw( Exporter ); our @EXPORT = qw( do_download ); sub do_download { my ($params, $opts, $page_content) = @_; my $cat = $opts->{cat}; if ($params->{errors}{package}) { fatal_error( $cat->g( "package not valid or not specified" ) ); } if ($params->{errors}{suite}) { fatal_error( $cat->g( "suite not valid or not specified" ) ); } if ($params->{errors}{arch}) { fatal_error( $cat->g( "architecture not valid or not specified" ) ); } if (@{$opts->{suite}} > 1) { fatal_error( $cat->g( "more than one suite specified for download (%s)", "@{$opts->{suite}}" ) ); } if (@{$opts->{arch}} > 1) { fatal_error( $cat->g( "more than one architecture specified for download (%s)", "@{$opts->{arch}}" ) ); } $opts->{h_sections} = { map { $_ => 1 } @SECTIONS }; my $pkg = $opts->{package}; my $suite = $opts->{suite}[0]; my $arch = $opts->{arch}[0] ||''; our (%packages_all); my (@results); my ($final_result, $filename, $directory, @file_components, $archive) = ("")x5; my $st0 = new Benchmark; unless (@Packages::CGI::fatal_errors) { tie %packages_all, 'DB_File', "$DBDIR/packages_all_$suite.db", O_RDONLY, 0666, $DB_BTREE or die "couldn't tie DB $DBDIR/packages_all_$suite.db: $!"; read_entry( \%packages, $pkg, \@results, $opts ); @results = grep { $_->[7] ne 'v' } @results; unless (@results) { # fatal_error( _g( "No such package." )."
". # sprintf( _g( 'Search for the package' ), "$SEARCH_URL/$pkg" ) ); } else { my $final_result = shift @results; foreach (@results) { if (version_cmp( $_->[7], $final_result->[7] ) > 0) { $final_result = $_; } } debug( "final_result=@$final_result", 1 ); $archive = $final_result->[1]; my %data = split /\000/, $packages_all{"$pkg $arch $final_result->[7]"}; if (!%data && $arch ne 'all' && $final_result->[3] eq 'all') { %data = split /\000/, $packages_all{"$pkg all $final_result->[7]"}; $arch = 'all'; debug( "choosing arch 'all' instead of requested arch $arch", 1 ); # fatal_error( _g( "No such package." )."
". # sprintf( _g( 'Search for the package' ), "$SEARCH_URL/$pkg" ) ) unless %data; } @file_components = split('/', $data{filename}); $filename = pop(@file_components); $directory = join( '/', @file_components).'/'; $page_content->{archive} = $archive; $page_content->{suite} = $suite; $page_content->{pkg} = $pkg; my $pkgsize = floor(($data{size}/102.4)+0.5)/10; if ($pkgsize < 1024) { $page_content->{pkgsize} = sprintf( '%.1f', $pkgsize ); $page_content->{pkgsize_unit} = $cat->g( 'kByte' ); } else { $page_content->{pkgsize} = sprintf( '%.1f', floor(($data{size}/(102.4*102.4))+0.5)/100 ); $page_content->{pkgsize_unit} = $cat->g( 'MByte' ); } $page_content->{architecture} = $arch; foreach (keys %data) { $page_content->{$_} = $data{$_}; } $page_content->{filename} = { file => $filename, directory => $directory, full => $data{filename}, }; } } } 1;