Make ActiveRecord's quoted name caches thread-safe.
This commit is contained in:
parent
0ccde297a1
commit
68d572a5d1
@ -92,14 +92,6 @@ def self.build_read_query_regexp(*parts) # :nodoc:
|
||||
/\A(?:[(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
|
||||
end
|
||||
|
||||
def self.quoted_column_names # :nodoc:
|
||||
@quoted_column_names ||= {}
|
||||
end
|
||||
|
||||
def self.quoted_table_names # :nodoc:
|
||||
@quoted_table_names ||= {}
|
||||
end
|
||||
|
||||
def self.find_cmd_and_exec(commands, *args) # :doc:
|
||||
commands = Array(commands)
|
||||
|
||||
|
@ -6,6 +6,9 @@ module ActiveRecord
|
||||
module ConnectionAdapters
|
||||
module MySQL
|
||||
module Quoting # :nodoc:
|
||||
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||
|
||||
def cast_bound_value(value)
|
||||
case value
|
||||
when Rational
|
||||
@ -27,11 +30,11 @@ def cast_bound_value(value)
|
||||
end
|
||||
|
||||
def quote_column_name(name)
|
||||
self.class.quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
|
||||
QUOTED_COLUMN_NAMES[name] ||= "`#{super.gsub('`', '``')}`"
|
||||
end
|
||||
|
||||
def quote_table_name(name)
|
||||
self.class.quoted_table_names[name] ||= super.gsub(".", "`.`").freeze
|
||||
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "`.`").freeze
|
||||
end
|
||||
|
||||
def unquoted_true
|
||||
|
@ -4,6 +4,9 @@ module ActiveRecord
|
||||
module ConnectionAdapters
|
||||
module PostgreSQL
|
||||
module Quoting
|
||||
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||
|
||||
class IntegerOutOf64BitRange < StandardError
|
||||
def initialize(msg)
|
||||
super(msg)
|
||||
@ -83,7 +86,7 @@ def quote_string(s) # :nodoc:
|
||||
# - "schema.name".table_name
|
||||
# - "schema.name"."table.name"
|
||||
def quote_table_name(name) # :nodoc:
|
||||
self.class.quoted_table_names[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted.freeze
|
||||
QUOTED_TABLE_NAMES[name] ||= Utils.extract_schema_qualified_name(name.to_s).quoted.freeze
|
||||
end
|
||||
|
||||
# Quotes schema names for use in SQL queries.
|
||||
@ -97,7 +100,7 @@ def quote_table_name_for_assignment(table, attr)
|
||||
|
||||
# Quotes column names for use in SQL queries.
|
||||
def quote_column_name(name) # :nodoc:
|
||||
self.class.quoted_column_names[name] ||= PG::Connection.quote_ident(super).freeze
|
||||
QUOTED_COLUMN_NAMES[name] ||= PG::Connection.quote_ident(super).freeze
|
||||
end
|
||||
|
||||
# Quote date/time values for use in SQL input.
|
||||
|
@ -4,6 +4,9 @@ module ActiveRecord
|
||||
module ConnectionAdapters
|
||||
module SQLite3
|
||||
module Quoting # :nodoc:
|
||||
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||
|
||||
def quote_string(s)
|
||||
::SQLite3::Database.quote(s)
|
||||
end
|
||||
@ -13,11 +16,11 @@ def quote_table_name_for_assignment(table, attr)
|
||||
end
|
||||
|
||||
def quote_table_name(name)
|
||||
self.class.quoted_table_names[name] ||= super.gsub(".", "\".\"").freeze
|
||||
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "\".\"").freeze
|
||||
end
|
||||
|
||||
def quote_column_name(name)
|
||||
self.class.quoted_column_names[name] ||= %Q("#{super.gsub('"', '""')}")
|
||||
QUOTED_COLUMN_NAMES[name] ||= %Q("#{super.gsub('"', '""')}")
|
||||
end
|
||||
|
||||
def quoted_time(value)
|
||||
|
Loading…
Reference in New Issue
Block a user