From 681ddac0a62a5f92545d204c9d816a0b381096b9 Mon Sep 17 00:00:00 2001 From: Marius Nuennerich Date: Sun, 2 May 2010 13:09:22 +0200 Subject: [PATCH 1/2] cache connection when quoting --- activerecord/lib/active_record/base.rb | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 9ed53cc..5d3c86c 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1462,7 +1462,8 @@ module ActiveRecord #:nodoc: def replace_bind_variables(statement, values) #:nodoc: raise_if_bind_arity_mismatch(statement, statement.count('?'), values.size) bound = values.dup - statement.gsub('?') { quote_bound_value(bound.shift) } + c = connection + statement.gsub('?') { quote_bound_value(bound.shift, c) } end def replace_named_bind_variables(statement, bind_vars) #:nodoc: @@ -1494,15 +1495,15 @@ module ActiveRecord #:nodoc: expanded end - def quote_bound_value(value) #:nodoc: + def quote_bound_value(value, c = connection) #:nodoc: if value.respond_to?(:map) && !value.acts_like?(:string) if value.respond_to?(:empty?) && value.empty? - connection.quote(nil) + c.quote(nil) else - value.map { |v| connection.quote(v) }.join(',') + value.map { |v| c.quote(v) }.join(',') end else - connection.quote(value) + c.quote(value) end end -- 1.7.0.4 From f4fab6dec781bb86f15046618bd1cbb686882686 Mon Sep 17 00:00:00 2001 From: Marius Nuennerich Date: Sun, 2 May 2010 15:03:00 +0200 Subject: [PATCH 2/2] move connection call out of loops --- activerecord/lib/active_record/base.rb | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 5d3c86c..23cfdc0 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -495,11 +495,12 @@ module ActiveRecord #:nodoc: # Post.reset_counters(1, :comments) def reset_counters(id, *counters) object = find(id) + c = connection counters.each do |association| child_class = reflect_on_association(association).klass counter_name = child_class.reflect_on_association(self.name.downcase.to_sym).counter_cache_column - connection.update("UPDATE #{quoted_table_name} SET #{connection.quote_column_name(counter_name)} = #{object.send(association).count} WHERE #{connection.quote_column_name(primary_key)} = #{quote_value(object.id)}", "#{name} UPDATE") + c.update("UPDATE #{quoted_table_name} SET #{c.quote_column_name(counter_name)} = #{object.send(association).count} WHERE #{c.quote_column_name(primary_key)} = #{quote_value(object.id, nil, c)}", "#{name} UPDATE") end end @@ -533,19 +534,20 @@ module ActiveRecord #:nodoc: # # SET comment_count = comment_count + 1, # # WHERE id IN (10, 15) def update_counters(id, counters) + c = connection updates = counters.inject([]) { |list, (counter_name, increment)| sign = increment < 0 ? "-" : "+" - list << "#{connection.quote_column_name(counter_name)} = COALESCE(#{connection.quote_column_name(counter_name)}, 0) #{sign} #{increment.abs}" + list << "#{c.quote_column_name(counter_name)} = COALESCE(#{c.quote_column_name(counter_name)}, 0) #{sign} #{increment.abs}" }.join(", ") if id.is_a?(Array) - ids_list = id.map {|i| quote_value(i)}.join(', ') + ids_list = id.map {|i| quote_value(i, nil, c)}.join(', ') condition = "IN (#{ids_list})" else - condition = "= #{quote_value(id)}" + condition = "= #{quote_value(id, nil, c)}" end - update_all(updates, "#{connection.quote_column_name(primary_key)} #{condition}") + update_all(updates, "#{c.quote_column_name(primary_key)} #{condition}") end # Increment a number field by one, usually representing a count. @@ -983,8 +985,8 @@ module ActiveRecord #:nodoc: end end - def quote_value(value, column = nil) #:nodoc: - connection.quote(value,column) + def quote_value(value, column = nil, c = connection) #:nodoc: + c.quote(value, column) end # Used to sanitize objects before they're used in an SQL SELECT statement. Delegates to connection.quote. @@ -1438,8 +1440,9 @@ module ActiveRecord #:nodoc: # { :status => nil, :group_id => 1 } # # => "status = NULL , group_id = 1" def sanitize_sql_hash_for_assignment(attrs) + c = connection attrs.map do |attr, value| - "#{connection.quote_column_name(attr)} = #{quote_bound_value(value)}" + "#{c.quote_column_name(attr)} = #{quote_bound_value(value, c)}" end.join(', ') end @@ -1453,7 +1456,8 @@ module ActiveRecord #:nodoc: elsif statement.include?('?') replace_bind_variables(statement, values) else - statement % values.collect { |value| connection.quote_string(value.to_s) } + c = connection + statement % values.collect { |value| c.quote_string(value.to_s) } end end @@ -2090,8 +2094,8 @@ module ActiveRecord #:nodoc: end # Quote strings appropriately for SQL statements. - def quote_value(value, column = nil) - self.class.connection.quote(value, column) + def quote_value(value, column = nil, c = self.class.connection) + c.quote(value, column) end # Interpolate custom SQL string in instance context. -- 1.7.0.4