]> source.dussan.org Git - redmine.git/commitdiff
Rescue invalid query statement error with an error message.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 28 Nov 2009 10:29:48 +0000 (10:29 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 28 Nov 2009 10:29:48 +0000 (10:29 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3104 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/models/query.rb
test/unit/query_test.rb

index 63b174f89aea3896ae9abba241938563d5bf7e5f..bbd0f801cf370886d3a0a562a8efa7dbadf9157e 100644 (file)
@@ -26,6 +26,8 @@ class IssuesController < ApplicationController
   before_filter :find_optional_project, :only => [:index, :changes, :gantt, :calendar]
   accept_key_auth :index, :show, :changes
 
+  rescue_from Query::StatementInvalid, :with => :query_statement_invalid
+  
   helper :journals
   helper :projects
   include ProjectsHelper   
@@ -507,4 +509,12 @@ private
       end
     end
   end
+  
+  # Rescues an invalid query statement. Just in case...
+  def query_statement_invalid(exception)
+    logger.error "Query::StatementInvalid: #{exception.message}" if logger
+    session.delete(:query)
+    sort_clear
+    render_error "An error occurred while executing the query and has been logged. Please report this error to your Redmine administrator."
+  end
 end
index d15f7c3c7c0f2a34f0744e0b5878e33fd2a85f0f..2e0ddc48996d66611acd320df89f3acb9698b4ac 100644 (file)
@@ -61,6 +61,9 @@ class QueryCustomFieldColumn < QueryColumn
 end
 
 class Query < ActiveRecord::Base
+  class StatementInvalid < ::ActiveRecord::StatementInvalid
+  end
+  
   belongs_to :project
   belongs_to :user
   serialize :filters
@@ -392,6 +395,8 @@ class Query < ActiveRecord::Base
   # Returns the issue count
   def issue_count
     Issue.count(:include => [:status, :project], :conditions => statement)
+  rescue ::ActiveRecord::StatementInvalid => e
+    raise StatementInvalid.new(e.message)
   end
   
   # Returns the issue count by group or nil if query is not grouped
@@ -406,6 +411,8 @@ class Query < ActiveRecord::Base
     else
       nil
     end
+  rescue ::ActiveRecord::StatementInvalid => e
+    raise StatementInvalid.new(e.message)
   end
   
   # Returns the issues
@@ -419,6 +426,8 @@ class Query < ActiveRecord::Base
                      :order => order_option,
                      :limit  => options[:limit],
                      :offset => options[:offset]
+  rescue ::ActiveRecord::StatementInvalid => e
+    raise StatementInvalid.new(e.message)
   end
 
   # Returns the journals
@@ -429,6 +438,8 @@ class Query < ActiveRecord::Base
                        :order => options[:order],
                        :limit => options[:limit],
                        :offset => options[:offset]
+  rescue ::ActiveRecord::StatementInvalid => e
+    raise StatementInvalid.new(e.message)
   end
   
   # Returns the versions
@@ -436,6 +447,8 @@ class Query < ActiveRecord::Base
   def versions(options={})
     Version.find :all, :include => :project,
                        :conditions => Query.merge_conditions(project_statement, options[:conditions])
+  rescue ::ActiveRecord::StatementInvalid => e
+    raise StatementInvalid.new(e.message)
   end
   
   private
index 27aed0ce884d36059b5550175882a16a4135d9e5..f405833d45a93ca1b1e077f35b1fa0dac51597fc 100644 (file)
@@ -269,6 +269,13 @@ class QueryTest < ActiveSupport::TestCase
     assert_equal values.sort, values
   end
   
+  def test_invalid_query_should_raise_query_statement_invalid_error
+    q = Query.new
+    assert_raise Query::StatementInvalid do
+      q.issues(:conditions => "foo = 1")
+    end
+  end
+  
   def test_label_for
     q = Query.new
     assert_equal 'assigned_to', q.label_for('assigned_to_id')