Skip to content

Commit

Permalink
Changed update_record to use prepared statements.
Browse files Browse the repository at this point in the history
  • Loading branch information
olliwer committed Feb 11, 2013
1 parent 5f30b54 commit a53935d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
15 changes: 12 additions & 3 deletions activerecord/lib/active_record/persistence.rb
Expand Up @@ -418,13 +418,22 @@ def create_or_update
# Returns the number of affected rows.
def update_record(attribute_names = @attributes.keys)
attributes_with_values = arel_attributes_with_values_for_update(attribute_names)

if attributes_with_values.empty?
0
else
klass = self.class
stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id)).arel.compile_update(attributes_with_values)
klass.connection.update stmt
column_hash = klass.connection.schema_cache.columns_hash klass.table_name
db_columns_with_values = attributes_with_values.map { |attr,value|
real_column = column_hash[attr.name]
[real_column, value]
}
bind_attrs = attributes_with_values.dup
bind_attrs.keys.each_with_index do |column, i|
real_column = db_columns_with_values[i].first
bind_attrs[column] = klass.connection.substitute_at(real_column, i)
end
stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id)).arel.compile_update(bind_attrs)
klass.connection.update stmt, 'SQL', db_columns_with_values
end
end

Expand Down
14 changes: 14 additions & 0 deletions activerecord/test/cases/adapter_test.rb
@@ -1,11 +1,25 @@
require "cases/helper"
require "models/book"

module ActiveRecord
class AdapterTest < ActiveRecord::TestCase
def setup
@connection = ActiveRecord::Base.connection
end

##
# PostgreSQL does not support null bytes in strings
unless current_adapter?(:PostgreSQLAdapter)
def test_update_prepared_statement
b = Book.create(name: "my \x00 book")
b.reload
assert_equal "my \x00 book", b.name
b.update_attributes(name: "my other \x00 book")
b.reload
assert_equal "my other \x00 book", b.name
end
end

def test_tables
tables = @connection.tables
assert tables.include?("accounts")
Expand Down

0 comments on commit a53935d

Please sign in to comment.