about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-09-05 07:23:43 +0000
committerEric Wong <e@80x24.org>2015-09-05 07:42:40 +0000
commitd25c98939f599ec71371ad7c0555f0db7fcaf89c (patch)
treeaf6e6f5c0cb2fea351a2a02f261ede4eaf766fac /lib
parent2b0965c35b2eebcfec790deba3232f8103813d09 (diff)
downloadpublic-inbox-d25c98939f599ec71371ad7c0555f0db7fcaf89c.tar.gz
Xapian may raise exceptions on some queries.  Pass the error
along to the user so they can read Xapian documentation.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/SearchView.pm22
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index 960049f8..96b691df 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -12,13 +12,18 @@ our $LIM = 25;
 sub sres_top_html {
         my ($ctx, $q) = @_;
         my $cgi = $ctx->{cgi};
+        my $code = 200;
         # $q ||= $cgi->param('q');
         my $o = int($cgi->param('o') || 0);
         my $r = $cgi->param('r');
         $r = (defined $r && $r ne '0');
         my $opts = { limit => $LIM, offset => $o, mset => 1, relevance => $r };
-        my $mset = $ctx->{srch}->query($q, $opts);
-        my $total = $mset->get_matches_estimated;
+        my ($mset, $total);
+        eval {
+                $mset = $ctx->{srch}->query($q, $opts);
+                $total = $mset->get_matches_estimated;
+        };
+        my $err = $@;
         my $query = PublicInbox::Hval->new_oneline($q);
         my $qh = $query->as_html;
         my $res = "<html><head><title>$qh - search results</title></head>" .
@@ -32,7 +37,16 @@ sub sres_top_html {
 
         my $foot = $ctx->{footer} || '';
         $foot = qq{Back to <a\nhref=".">index</a>.};
-        if ($total == 0) {
+        if ($err) {
+                my $u = 'http://xapian.org/docs/queryparser.html';
+                $code = 400;
+                $err =~ s/^\s*Exception:\s*//; # bad word to show users :P
+                $err = PublicInbox::Hval->new_oneline($err)->as_html;
+                $res .= "\n\nBad query: <b>$err</b>\n";
+                $res .= qq{See <a\nhref="$u">$u</a> for Xapian query syntax};
+                $res .= "</pre><hr /><pre>$foot";
+        } elsif ($total == 0) {
+                $code = 404;
                 $res .= "\n\n[No results found]</pre><hr /><pre>$foot";
         } else {
                 $q = $query->as_href;
@@ -74,7 +88,7 @@ sub sres_top_html {
         }
 
         $res .= "</pre></body></html>";
-        [200, ['Content-Type'=>'text/html; charset=UTF-8'], [$res]];
+        [$code, ['Content-Type'=>'text/html; charset=UTF-8'], [$res]];
 }
 
 sub dump_mset {