]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 535571: Allow Search.pm to accept "limit" and "offset" as parameters.
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Sat, 12 Feb 2011 02:03:50 +0000 (18:03 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Sat, 12 Feb 2011 02:03:50 +0000 (18:03 -0800)
r=mkanat, a=mkanat (module owner)

Bugzilla/Search.pm
buglist.cgi

index 2220abf1e7c54f266d72758e5a1bf3748b15fb78..224193fbc052a0da30b5a0c93ca6455f4406b66f 100644 (file)
@@ -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 = <<END;
 SELECT $select
   FROM $from
  WHERE $where
-$group_by$having$order_by
+$group_by$having$order_by$limit
 END
     $self->{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 #
 ############################
index 3fe2ce39e86c4bb525a23bfba3d531ed785a005d..4b7fe8f5ad801e64ae954ddfe79e768d16acc78c 100755 (executable)
@@ -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