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)}/
|
/\A(?:[(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
|
||||||
end
|
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:
|
def self.find_cmd_and_exec(commands, *args) # :doc:
|
||||||
commands = Array(commands)
|
commands = Array(commands)
|
||||||
|
|
||||||
|
@ -6,6 +6,9 @@ module ActiveRecord
|
|||||||
module ConnectionAdapters
|
module ConnectionAdapters
|
||||||
module MySQL
|
module MySQL
|
||||||
module Quoting # :nodoc:
|
module Quoting # :nodoc:
|
||||||
|
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
|
||||||
def cast_bound_value(value)
|
def cast_bound_value(value)
|
||||||
case value
|
case value
|
||||||
when Rational
|
when Rational
|
||||||
@ -27,11 +30,11 @@ def cast_bound_value(value)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def quote_column_name(name)
|
def quote_column_name(name)
|
||||||
self.class.quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
|
QUOTED_COLUMN_NAMES[name] ||= "`#{super.gsub('`', '``')}`"
|
||||||
end
|
end
|
||||||
|
|
||||||
def quote_table_name(name)
|
def quote_table_name(name)
|
||||||
self.class.quoted_table_names[name] ||= super.gsub(".", "`.`").freeze
|
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "`.`").freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def unquoted_true
|
def unquoted_true
|
||||||
|
@ -4,6 +4,9 @@ module ActiveRecord
|
|||||||
module ConnectionAdapters
|
module ConnectionAdapters
|
||||||
module PostgreSQL
|
module PostgreSQL
|
||||||
module Quoting
|
module Quoting
|
||||||
|
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
|
||||||
class IntegerOutOf64BitRange < StandardError
|
class IntegerOutOf64BitRange < StandardError
|
||||||
def initialize(msg)
|
def initialize(msg)
|
||||||
super(msg)
|
super(msg)
|
||||||
@ -83,7 +86,7 @@ def quote_string(s) # :nodoc:
|
|||||||
# - "schema.name".table_name
|
# - "schema.name".table_name
|
||||||
# - "schema.name"."table.name"
|
# - "schema.name"."table.name"
|
||||||
def quote_table_name(name) # :nodoc:
|
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
|
end
|
||||||
|
|
||||||
# Quotes schema names for use in SQL queries.
|
# 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.
|
# Quotes column names for use in SQL queries.
|
||||||
def quote_column_name(name) # :nodoc:
|
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
|
end
|
||||||
|
|
||||||
# Quote date/time values for use in SQL input.
|
# Quote date/time values for use in SQL input.
|
||||||
|
@ -4,6 +4,9 @@ module ActiveRecord
|
|||||||
module ConnectionAdapters
|
module ConnectionAdapters
|
||||||
module SQLite3
|
module SQLite3
|
||||||
module Quoting # :nodoc:
|
module Quoting # :nodoc:
|
||||||
|
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
||||||
|
|
||||||
def quote_string(s)
|
def quote_string(s)
|
||||||
::SQLite3::Database.quote(s)
|
::SQLite3::Database.quote(s)
|
||||||
end
|
end
|
||||||
@ -13,11 +16,11 @@ def quote_table_name_for_assignment(table, attr)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def quote_table_name(name)
|
def quote_table_name(name)
|
||||||
self.class.quoted_table_names[name] ||= super.gsub(".", "\".\"").freeze
|
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "\".\"").freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def quote_column_name(name)
|
def quote_column_name(name)
|
||||||
self.class.quoted_column_names[name] ||= %Q("#{super.gsub('"', '""')}")
|
QUOTED_COLUMN_NAMES[name] ||= %Q("#{super.gsub('"', '""')}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def quoted_time(value)
|
def quoted_time(value)
|
||||||
|
Loading…
Reference in New Issue
Block a user