my $common_arch;
my $debug = 0;
+my $use_bug_idx = 0;
+my %bugidx;
sub array_option($) {
my ($val) = @_;
sub set_option {
my ($opt, $val) = @_;
+ if ($opt eq "use-bug-idx") {
+ $use_bug_idx = $val;
+ if ( $val ) {
+ $common_headers{pending}{open} = $common_headers{pending}{pending};
+ my $bugidx = tie %bugidx, MLDBM => "$debbugs::gSpoolDir/realtime/bug.idx", O_RDONLY
+ or quitcgi( "$0: can't open $debbugs::gSpoolDir/realtime/bug.idx ($!)\n" );
+ $bugidx->RemoveTaint(1);
+ } else {
+ untie %bugidx;
+ }
+ }
if ($opt =~ m/^show_list_(foot|head)er$/) { $common{$opt} = $val; }
if ($opt eq "archive") { $common_archive = $val; }
if ($opt eq "repeatmerged") { $common_repeatmerged = $val; }
my @result = ();
- if (!$common_archive && defined $opt &&
- -e "$debbugs::gSpoolDir/by-$opt.idx")
- {
+ my $fastidx;
+ if (!defined $opt) {
+ # leave $fastidx undefined;
+ } elsif (!$common_archive) {
+ $fastidx = "$debbugs::gSpoolDir/by-$opt.idx";
+ } else {
+ $fastidx = "$debbugs::gSpoolDir/by-$opt-arc.idx";
+ }
+
+ if (defined $fastidx && -e $fastidx) {
my %lookup;
print STDERR "optimized\n" if ($debug);
- tie %lookup, DB_File => "$debbugs::gSpoolDir/by-$opt.idx", O_RDONLY
- or die "$0: can't open $debbugs::gSpoolDir/by-$opt.idx ($!)\n";
+ tie %lookup, DB_File => $fastidx, O_RDONLY
+ or die "$0: can't open $fastidx ($!)\n";
while ($key = shift) {
my $bugs = $lookup{$key};
if (defined $bugs) {
push @result, (unpack 'N*', $bugs);
- }
+ } elsif (defined $lookup{"count $key"}) {
+ my $which = 0;
+ while (1) {
+ $bugs = $lookup{"$which $key"};
+ last unless defined $bugs;
+ push @result, (unpack 'N*', $bugs);
+ $which += 100;
+ }
+ }
}
untie %lookup;
print STDERR "done optimized\n" if ($debug);
my %status;
+ if ( $use_bug_idx eq 1 && exists( $bugidx{ $bugnum } ) ) {
+ %status = %{ $bugidx{ $bugnum } };
+ $status{ pending } = $status{ status };
+ $status{ id } = $bugnum;
+ return \%status;
+ }
+
my $location = getbuglocation( $bugnum, 'summary' );
return {} if ( !$location );
%status = %{ readbug( $bugnum, $location ) };
set_option("version", $version);
set_option("dist", $dist);
set_option("arch", $arch);
+set_option("use-bug-idx", defined($param{'use-bug-idx'}) ? $param{'use-bug-idx'} : 0);
set_option("show_list_header", $show_list_header);
set_option("show_list_footer", $show_list_footer);
push @references, sprintf "to the source package <a href=\"%s\">%s</a>'s bug page", srcurl($srcforpkg), htmlsanit($srcforpkg);
}
}
+ if ($pkg) {
+ set_option("archive", !$archive);
+ push @references, sprintf "to the <a href=\"%s\">%s reports for %s</a>", pkgurl($pkg), ($archive ? "active" : "archived"), htmlsanit($pkg);
+ set_option("archive", $archive);
+ }
if (@references) {
$references[$#references] = "or $references[$#references]" if @references > 1;
print "<p>You might like to refer ", join(", ", @references), ".</p>\n";