diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 63b174f89..bbd0f801c 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -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 diff --git a/app/models/query.rb b/app/models/query.rb index d15f7c3c7..2e0ddc489 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -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 diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 27aed0ce8..f405833d4 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -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')