From 99b870afefa80a2fb4b4ac9252d7fdd5f977260d Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Fri, 11 Feb 2011 18:03:50 -0800 Subject: Bug 535571: Allow Search.pm to accept "limit" and "offset" as parameters. r=mkanat, a=mkanat (module owner) --- Bugzilla/Search.pm | 32 +++++++++++++++++++++++++++++++- buglist.cgi | 16 ++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 2220abf1e..224193fbc 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -56,6 +56,7 @@ use Data::Dumper; use Date::Format; use Date::Parse; use List::MoreUtils qw(all part uniq); +use POSIX qw(INT_MAX); use Storable qw(dclone); # Description Of Boolean Charts @@ -718,12 +719,14 @@ sub sql { ? "\nHAVING " . join(' AND ', @$having_terms) : ''; my $order_by = $self->_sql_order_by ? "\nORDER BY " . join(', ', $self->_sql_order_by) : ''; + my $limit = $self->_sql_limit; + $limit = "\n$limit" if $limit; my $query = <{sql} = $query; return $self->{sql}; @@ -918,6 +921,33 @@ sub _translate_order_by_column { return @items; } +############################# +# Internal Accessors: LIMIT # +############################# + +sub _sql_limit { + my ($self) = @_; + my $limit = $self->_params->{limit}; + my $offset = $self->_params->{offset}; + if (defined $offset and not defined $limit) { + $limit = INT_MAX; + } + if (defined $limit) { + detaint_natural($limit) + || ThrowCodeError('param_must_be_numeric', + { function => 'Bugzilla::Search::new', + param => 'limit' }); + if (defined $offset) { + detaint_natural($offset) + || ThrowCodeError('param_must_be_numeric', + { function => 'Bugzilla::Search::new', + param => 'offset' }); + } + return Bugzilla->dbh->sql_limit($limit, $offset); + } + return ''; +} + ############################ # Internal Accessors: FROM # ############################ diff --git a/buglist.cgi b/buglist.cgi index 3fe2ce39e..4b7fe8f5a 100755 --- a/buglist.cgi +++ b/buglist.cgi @@ -772,6 +772,10 @@ if (!$order) { my @orderstrings = split(/,\s*/, $order); +if ($fulltext and grep { /^relevance/ } @orderstrings) { + $vars->{'message'} = 'buglist_sorted_by_relevance' +} + # Generate the basic SQL query that will be used to generate the bug list. my $search = new Bugzilla::Search('fields' => \@selectcolumns, 'params' => scalar $params->Vars, @@ -779,18 +783,6 @@ my $search = new Bugzilla::Search('fields' => \@selectcolumns, my $query = $search->sql; $vars->{'search_description'} = $search->search_description; -if (defined $cgi->param('limit')) { - my $limit = $cgi->param('limit'); - if (detaint_natural($limit)) { - $query .= " " . $dbh->sql_limit($limit); - } -} -elsif ($fulltext) { - if ($cgi->param('order') && $cgi->param('order') =~ /^relevance/) { - $vars->{'message'} = 'buglist_sorted_by_relevance'; - } -} - ################################################################################ # Query Execution -- cgit v1.2.3-24-g4f1b