123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::SchemaReflection

Relationships & Source Files
Inherits: Object
Defined in: activerecord/lib/active_record/connection_adapters/schema_cache.rb

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(cache_path, cache = nil) ⇒ SchemaReflection

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 16

def initialize(cache_path, cache = nil)
  @cache = cache
  @cache_path = cache_path
end

Class Attribute Details

.check_schema_cache_dump_version (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 10

attr_accessor :check_schema_cache_dump_version

.use_schema_cache_dump (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 9

attr_accessor :use_schema_cache_dump

Instance Attribute Details

#possible_cache_available?Boolean (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 118

def possible_cache_available?
  self.class.use_schema_cache_dump &&
    @cache_path &&
    File.file?(@cache_path)
end

Instance Method Details

#add(connection, name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 45

def add(connection, name)
  cache(connection).add(connection, name)
end

#cache(connection) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 114

def cache(connection)
  @cache ||= load_cache(connection) || empty_cache
end

#cached?(table_name) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 87

def cached?(table_name)
  if @cache.nil?
    # If `check_schema_cache_dump_version` is enabled we can't load
    # the schema cache dump without connecting to the database.
    unless self.class.check_schema_cache_dump_version
      @cache = load_cache(nil)
    end
  end

  @cache&.cached?(table_name)
end

#clear!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 25

def clear!
  @cache = empty_cache

  nil
end

#clear_data_source_cache!(connection, name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 81

def clear_data_source_cache!(connection, name)
  return if @cache.nil? && !possible_cache_available?

  cache(connection).clear_data_source_cache!(connection, name)
end

#columns(connection, table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 53

def columns(connection, table_name)
  cache(connection).columns(connection, table_name)
end

#columns_hash(connection, table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 57

def columns_hash(connection, table_name)
  cache(connection).columns_hash(connection, table_name)
end

#columns_hash?(connection, table_name) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 61

def columns_hash?(connection, table_name)
  cache(connection).columns_hash?(connection, table_name)
end

#data_source_exists?(connection, name) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 41

def data_source_exists?(connection, name)
  cache(connection).data_source_exists?(connection, name)
end

#data_sources(connection, name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 49

def data_sources(connection, name)
  cache(connection).data_sources(connection, name)
end

#database_version(connection)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 69

def database_version(connection) # :nodoc:
  cache(connection).database_version(connection)
end

#dump_to(connection, filename)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 99

def dump_to(connection, filename)
  fresh_cache = empty_cache
  fresh_cache.add_all(connection)
  fresh_cache.dump_to(filename)

  @cache = fresh_cache
end

#empty_cache (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 108

def empty_cache
  new_cache = SchemaCache.allocate
  new_cache.send(:initialize)
  new_cache
end

#indexes(connection, table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 65

def indexes(connection, table_name)
  cache(connection).indexes(connection, table_name)
end

#load!(connection)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 31

def load!(connection)
  cache(connection)

  self
end

#load_cache(connection) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 124

def load_cache(connection)
  # Can't load if schema dumps are disabled
  return unless possible_cache_available?

  # Check we can find one
  return unless new_cache = SchemaCache._load_from(@cache_path)

  if self.class.check_schema_cache_dump_version
    begin
      current_version = connection.schema_version

      if new_cache.version(connection) != current_version
        warn "Ignoring #{@cache_path} because it has expired. The current schema version is #{current_version}, but the one in the schema cache file is #{new_cache.schema_version}."
        return
      end
    rescue ActiveRecordError => error
      warn "Failed to validate the schema cache because of #{error.class}: #{error.message}"
      return
    end
  end

  new_cache
end

#primary_keys(connection, table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 37

def primary_keys(connection, table_name)
  cache(connection).primary_keys(connection, table_name)
end

#set_schema_cache(cache)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 21

def set_schema_cache(cache)
  @cache = cache
end

#size(connection)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 77

def size(connection)
  cache(connection).size
end

#version(connection)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/schema_cache.rb', line 73

def version(connection)
  cache(connection).version(connection)
end