Implement exact filename searches properly, implement random-substring
authorJeroen van Wolffelaar <jeroen@wolffelaar.nl>
Tue, 14 Feb 2006 01:37:27 +0000 (01:37 +0000)
committerJeroen van Wolffelaar <jeroen@wolffelaar.nl>
Tue, 14 Feb 2006 01:37:27 +0000 (01:37 +0000)
filename searches (but takes 4s worstcase on merkel...)

cgi-bin/search_contents.pl

index 839ffc00f0ad830ab43125f6ff738cefaa942c0c..5272a058292e1ed3502c208eb032673dc4dece8f 100755 (executable)
 # 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:<br><pre>";
 # 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 (<FILENAMES>) {
+           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 "</pre>$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 "</pre>$nres results displayed";
+    return $$nres<100;
 }
 
 1;