X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=cgi-bin%2Fsearch_contents.pl;h=66e216d4371ca7283ca57e8b31a1149d86f9b385;hb=fcd2a8e03040589f3048e91737d4b2863c8521fd;hp=839ffc00f0ad830ab43125f6ff738cefaa942c0c;hpb=fbb483f75d3a0cd3ffc214eea6fa724d20952b3a;p=deb%2Fpackages.git diff --git a/cgi-bin/search_contents.pl b/cgi-bin/search_contents.pl index 839ffc0..66e216d 100755 --- a/cgi-bin/search_contents.pl +++ b/cgi-bin/search_contents.pl @@ -1,38 +1,63 @@ #!/usr/bin/perl -wT # $Id$ -# search_packages.pl -- CGI interface to the Packages files on packages.debian.org +# search_contents.pl -- CGI interface to the Contents files on packages.debian.org # -# Copyright (C) 1998 James Treacy -# Copyright (C) 2000, 2001 Josip Rodin -# Copyright (C) 2001 Adam Heath -# Copyright (C) 2004 Martin Schulze -# Copyright (C) 2004-2006 Frank Lichtenheld +# Copyright (C) 2006 Jeroen van Wolffelaar # # use is allowed under the terms of the GNU Public License (GPL) # see http://www.fsf.org/copyleft/gpl.html for a copy of the license sub contents() { + my $nres = 0; my ($cgi) = @_; print "Extremely blunt ends-with search results:
";
 # only thing implemented yet: ends-with search
     my $kw = lc $cgi->param("keywords");
-    $kw = reverse $kw;
-    
-    # exact filename searching follows trivially:
-    my $exact = $cgi->param("exact");
-    $kw = "/$kw" if $exact;
+    # full filename search is tricky
+    my $ffn = $cgi->param("fullfilename");
+    $ffn = $ffn ? 1 : 0;
+
 
-# FIXME: ensure $suite is sanitized
-    my $suite = 'stable';
+my $suite = 'stable'; #fixme
 
     my $reverses = tie my %reverses, 'DB_File', "$DBDIR/contents/reverse_$suite.db",
 	O_RDONLY, 0666, $DB_BTREE
 	or die "Failed opening reverse DB: $!";
-    
+
+    if ($ffn) {
+	open FILENAMES, "$DBDIR/contents/filenames_$suite.txt"
+	    or die "Failed opening filename table";
+	while () {
+	    next if index($_, $kw)<0;
+	    chomp;
+	    last unless &dosearch(reverse($_)."/", \$nres, $reverses);
+	}
+	close FILENAMES;
+    } else {
+
+	$kw = reverse $kw;
+	
+	# exact filename searching follows trivially:
+	my $exact = $cgi->param("exact");
+	$kw = "$kw/" if $exact;
+
+	print "ERROR: Exact and fullfilenamesearch don't go along" if $ffn and $exact;
+
+	&dosearch($kw, \$nres, $reverses);
+    }
+    print "
$nres results displayed"; + $reverses = undef; + untie %reverses; + +} + +sub dosearch +{ + my ($kw, $nres, $reverses) = @_; + my ($key, $rest) = ($kw, ""); - my $nres = 0; for (my $status = $reverses->seq($key, $value, R_CURSOR); $status == 0; $status = $reverses->seq( $key, $value, R_NEXT)) { @@ -43,12 +68,10 @@ sub contents() { @hits = split /\0/o, $value; print reverse($key)." is found in @hits\n"; - last if $nres++ > 100; + last if ($$nres)++ > 100; } - $reverses = undef; - untie %reverses; - print "$nres results displayed"; + return $$nres<100; } 1;