Don't treat begin and rollback transactions as write queries
Otherwise `save` method would raise the `ReadOnlyError` against `BEGIN` and `ROLLBACK` queries.
This commit is contained in:
parent
cf71f31e2e
commit
07f0f1a8c7
@ -19,7 +19,7 @@ def query(sql, name = nil) # :nodoc:
|
||||
execute(sql, name).to_a
|
||||
end
|
||||
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :select, :set, :show, :release, :savepoint) # :nodoc:
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :select, :set, :show, :release, :savepoint, :rollback) # :nodoc:
|
||||
private_constant :READ_QUERY
|
||||
|
||||
def write_query?(sql) # :nodoc:
|
||||
|
@ -67,7 +67,7 @@ def query(sql, name = nil) #:nodoc:
|
||||
end
|
||||
end
|
||||
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:select, :show, :set) # :nodoc:
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :select, :set, :show, :savepoint, :rollback) # :nodoc:
|
||||
private_constant :READ_QUERY
|
||||
|
||||
def write_query?(sql) # :nodoc:
|
||||
|
@ -209,7 +209,7 @@ def disable_referential_integrity # :nodoc:
|
||||
# DATABASE STATEMENTS ======================================
|
||||
#++
|
||||
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:select, :pragma) # :nodoc:
|
||||
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :select, :pragma, :savepoint, :rollback) # :nodoc:
|
||||
private_constant :READ_QUERY
|
||||
|
||||
def write_query?(sql) # :nodoc:
|
||||
|
@ -1490,31 +1490,37 @@ def test_protected_environments_are_stored_as_an_array_of_string
|
||||
end
|
||||
|
||||
test "creating a record raises if preventing writes" do
|
||||
assert_raises ActiveRecord::ReadOnlyError do
|
||||
error = assert_raises ActiveRecord::ReadOnlyError do
|
||||
ActiveRecord::Base.connection.while_preventing_writes do
|
||||
Bird.create! name: "Bluejay"
|
||||
end
|
||||
end
|
||||
|
||||
assert_match %r/\AWrite query attempted while in readonly mode: INSERT /, error.message
|
||||
end
|
||||
|
||||
test "updating a record raises if preventing writes" do
|
||||
bird = Bird.create! name: "Bluejay"
|
||||
|
||||
assert_raises ActiveRecord::ReadOnlyError do
|
||||
error = assert_raises ActiveRecord::ReadOnlyError do
|
||||
ActiveRecord::Base.connection.while_preventing_writes do
|
||||
bird.update! name: "Robin"
|
||||
end
|
||||
end
|
||||
|
||||
assert_match %r/\AWrite query attempted while in readonly mode: UPDATE /, error.message
|
||||
end
|
||||
|
||||
test "deleting a record raises if preventing writes" do
|
||||
bird = Bird.create! name: "Bluejay"
|
||||
|
||||
assert_raises ActiveRecord::ReadOnlyError do
|
||||
error = assert_raises ActiveRecord::ReadOnlyError do
|
||||
ActiveRecord::Base.connection.while_preventing_writes do
|
||||
bird.destroy!
|
||||
end
|
||||
end
|
||||
|
||||
assert_match %r/\AWrite query attempted while in readonly mode: DELETE /, error.message
|
||||
end
|
||||
|
||||
test "selecting a record does not raise if preventing writes" do
|
||||
|
@ -6,6 +6,11 @@ class Bird < ActiveRecord::Base
|
||||
|
||||
accepts_nested_attributes_for :pirate
|
||||
|
||||
before_save do
|
||||
# force materialize_transactions
|
||||
self.class.connection.materialize_transactions
|
||||
end
|
||||
|
||||
attr_accessor :cancel_save_from_callback
|
||||
before_save :cancel_save_callback_method, if: :cancel_save_from_callback
|
||||
def cancel_save_callback_method
|
||||
|
Loading…
Reference in New Issue
Block a user