X-Git-Url: https://git.deb.at/?a=blobdiff_plain;ds=sidebyside;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 ($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;) { + 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 "