Class: ActiveRecord::ConnectionAdapters::SchemaCache
Class Method Summary
Instance Method Summary
-
#add(connection, table_name)
Add internal cache for table with table_name
.
-
#cached?(table_name) ⇒ Boolean
-
#clear_data_source_cache!(_connection, name)
Clear out internal caches for the data source name
.
-
#columns(connection, table_name)
Get the columns for a table.
-
#columns_hash(connection, table_name)
Get the columns for a table as a hash, key is the column name value is the column object.
-
#columns_hash?(connection, table_name) ⇒ Boolean
Checks whether the columns hash is already cached for a table.
-
#data_source_exists?(connection, name) ⇒ Boolean
A cached lookup for table existence.
-
#dump_to(filename)
-
#indexes(connection, table_name)
-
#init_with(coder)
-
#initialize ⇒ SchemaCache
constructor
-
#primary_keys(connection, table_name)
-
#schema_version
-
#size
-
#version(connection)
-
#deep_deduplicate(value)
private
-
#derive_columns_hash_and_deduplicate_values
private
-
#ignored_table?(table_name) ⇒ Boolean
private
-
#open(filename)
private
-
#prepare_data_sources(connection)
private
-
#tables_to_cache(connection)
private
-
#add_all(connection)
Internal use only
-
#data_sources(_connection, name)
deprecated
Internal use only
Deprecated.
use data_source_exists? instead
-
#database_version(connection)
Internal use only
-
#encode_with(coder)
Internal use only
-
#initialize_dup(other)
Internal use only
-
#marshal_dump
Internal use only
-
#marshal_load(array)
Internal use only
Constructor Details
.new(connection) ⇒ SchemaCache
Deprecated.
use ActiveRecord::ConnectionAdapters::SchemaReflection instead
[ GitHub ]
#initialize ⇒ SchemaCache
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 261
def initialize
@columns = {}
@columns_hash = {}
@primary_keys = {}
@data_sources = {}
@indexes = {}
@database_version = nil
@version = nil
end
Class Method Details
._load_from(filename)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 234
def self._load_from(filename) return unless File.file?(filename)
read(filename) do |file|
if filename.include?(".dump")
Marshal.load(file)
else
if YAML.respond_to?(:unsafe_load)
YAML.unsafe_load(file)
else
YAML.load(file)
end
end
end
end
.load_from(filename)
This method is for internal use only.
Deprecated.
use ActiveRecord::ConnectionAdapters::SchemaReflection instead
[ GitHub ]
.read(filename, &block)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 250
def self.read(filename, &block)
if File.extname(filename) == ".gz"
Zlib::GzipReader.open(filename) { |gz|
yield gz.read
}
else
yield File.read(filename)
end
end
Instance Method Details
#add(connection, table_name)
Add internal cache for table with table_name
.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 325
def add(connection, table_name)
if data_source_exists?(connection, table_name)
primary_keys(connection, table_name)
columns(connection, table_name)
columns_hash(connection, table_name)
indexes(connection, table_name)
end
end
#add_all(connection)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 398
def add_all(connection) tables_to_cache(connection).each do |table|
add(connection, table)
end
version(connection)
database_version(connection)
end
#cached?(table_name) ⇒ Boolean
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 303
def cached?(table_name)
@columns.key?(table_name)
end
#clear_data_source_cache!(_connection, name)
Clear out internal caches for the data source name
.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 390
def clear_data_source_cache!(_connection, name)
@columns.delete name
@columns_hash.delete name
@primary_keys.delete name
@data_sources.delete name
@indexes.delete name
end
#columns(connection, table_name)
Get the columns for a table
[ GitHub ]
#columns_hash(connection, table_name)
Get the columns for a table as a hash, key is the column name value is the column object.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 352
def columns_hash(connection, table_name)
@columns_hash.fetch(table_name) do
@columns_hash[deep_deduplicate(table_name)] = columns(connection, table_name).index_by(&:name).freeze
end
end
#columns_hash?(connection, table_name) ⇒ Boolean
Checks whether the columns hash is already cached for a table.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 359
def columns_hash?(connection, table_name)
@columns_hash.key?(table_name)
end
#data_source_exists?(connection, name) ⇒ Boolean
A cached lookup for table existence.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 316
def data_source_exists?(connection, name)
return if ignored_table?(name)
prepare_data_sources(connection) if @data_sources.empty?
return @data_sources[name] if @data_sources.key? name
@data_sources[deep_deduplicate(name)] = connection.data_source_exists?(name)
end
#data_sources(_connection, name)
This method is for internal use only.
Deprecated.
use data_source_exists? instead
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 334
def data_sources(_connection, name) @data_sources[name]
end
#database_version(connection)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 373
def database_version(connection) @database_version ||= connection.get_database_version
end
#deep_deduplicate(value)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 449
def deep_deduplicate(value)
case value
when Hash
value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
when Array
value.map { |i| deep_deduplicate(i) }
when String, Deduplicable
-value
else
value
end
end
#derive_columns_hash_and_deduplicate_values
[ GitHub ]
#dump_to(filename)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 407
def dump_to(filename)
open(filename) { |f|
if filename.include?(".dump")
f.write(Marshal.dump(self))
else
f.write(YAML.dump(self))
end
}
end
#encode_with(coder)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 280
def encode_with(coder) coder["columns"] = @columns.sort.to_h
coder["primary_keys"] = @primary_keys.sort.to_h
coder["data_sources"] = @data_sources.sort.to_h
coder["indexes"] = @indexes.sort.to_h
coder["version"] = @version
coder["database_version"] = @database_version
end
#ignored_table?(table_name) ⇒ Boolean
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 435
def ignored_table?(table_name)
ActiveRecord.schema_cache_ignored_tables.any? do |ignored|
ignored === table_name
end
end
#indexes(connection, table_name)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 363
def indexes(connection, table_name)
@indexes.fetch(table_name) do
if data_source_exists?(connection, table_name)
@indexes[deep_deduplicate(table_name)] = deep_deduplicate(connection.indexes(table_name))
else
[]
end
end
end
#init_with(coder)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 289
def init_with(coder)
@columns = coder["columns"]
@columns_hash = coder["columns_hash"]
@primary_keys = coder["primary_keys"]
@data_sources = coder["data_sources"]
@indexes = coder["indexes"] || {}
@version = coder["version"]
@database_version = coder["database_version"]
unless coder["deduplicated"]
derive_columns_hash_and_deduplicate_values
end
end
#initialize_dup(other)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 271
def initialize_dup(other) super
@columns = @columns.dup
@columns_hash = @columns_hash.dup
@primary_keys = @primary_keys.dup
@data_sources = @data_sources.dup
@indexes = @indexes.dup
end
#marshal_dump
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 417
def marshal_dump [@version, @columns, {}, @primary_keys, @data_sources, @indexes, @database_version]
end
#marshal_load(array)
This method is for internal use only.
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 421
def marshal_load(array) @version, @columns, _columns_hash, @primary_keys, @data_sources, @indexes, @database_version = array
@indexes ||= {}
derive_columns_hash_and_deduplicate_values
end
#open(filename)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 468
def open(filename)
FileUtils.mkdir_p(File.dirname(filename))
File.atomic_write(filename) do |file|
if File.extname(filename) == ".gz"
zipper = Zlib::GzipWriter.new file
zipper.mtime = 0
yield zipper
zipper.flush
zipper.close
else
yield file
end
end
end
#prepare_data_sources(connection)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 462
def prepare_data_sources(connection)
tables_to_cache(connection).each do |source|
@data_sources[source] = true
end
end
#primary_keys(connection, table_name)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 307
def primary_keys(connection, table_name)
@primary_keys.fetch(table_name) do
if data_source_exists?(connection, table_name)
@primary_keys[deep_deduplicate(table_name)] = deep_deduplicate(connection.primary_key(table_name))
end
end
end
#schema_version
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 381
def schema_version
@version
end
#size
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 385
def size
[@columns, @columns_hash, @primary_keys, @data_sources].sum(&:size)
end
#tables_to_cache(connection)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 429
def tables_to_cache(connection)
connection.data_sources.reject do |table|
ignored_table?(table)
end
end
#version(connection)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 377
def version(connection)
@version ||= connection.schema_version
end