From a2ea3cdb194f43906f68faba2ac24add41dc5df2 Mon Sep 17 00:00:00 2001 From: Jeroen van Wolffelaar Date: Tue, 14 Feb 2006 01:37:27 +0000 Subject: [PATCH 1/1] Implement exact filename searches properly, implement random-substring filename searches (but takes 4s worstcase on merkel...) --- cgi-bin/search_contents.pl | 54 +++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/cgi-bin/search_contents.pl b/cgi-bin/search_contents.pl index 839ffc0..5272a05 100755 --- a/cgi-bin/search_contents.pl +++ b/cgi-bin/search_contents.pl @@ -12,27 +12,57 @@ # 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
 
+    # fixme: I should open $reverses only once per search
     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 +73,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; -- 2.39.2