Sha256: a345053986571f3221ab94b54cc85992955ac4217c0fc4513b2d96e8b874c1df

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

require 'active_record_views/version'
require 'active_record_views/railtie' if defined? Rails
require 'active_record_views/registered_view'
require 'active_record_views/checksum_cache'
require 'active_support/core_ext/module/attribute_accessors'
require 'digest/sha1'

module ActiveRecordViews
  mattr_accessor :sql_load_path
  self.sql_load_path = []

  mattr_accessor :registered_views
  self.registered_views = []

  def self.init!
    require 'active_record_views/extension'
    ::ActiveRecord::Base.send :include, ActiveRecordViews::Extension
  end

  def self.find_sql_file(name)
    self.sql_load_path.each do |dir|
      path = "#{dir}/#{name}.sql"
      return path if File.exists?(path)
    end
    raise "could not find #{name}.sql"
  end

  def self.create_view(connection, name, sql)
    cache = ActiveRecordViews::ChecksumCache.new(connection)
    checksum = Digest::SHA1.hexdigest(sql)
    return if cache.get(name) == checksum

    begin
      connection.execute "CREATE OR REPLACE VIEW #{connection.quote_table_name name} AS #{sql}"
    rescue ActiveRecord::StatementInvalid => original_exception
      begin
        connection.transaction :requires_new => true do
          connection.execute "DROP VIEW #{connection.quote_table_name name}"
          connection.execute "CREATE VIEW #{connection.quote_table_name name} AS #{sql}"
        end
      rescue
        raise original_exception
      end
    end

    cache.set name, checksum
  end

  def self.drop_view(connection, name)
    cache = ActiveRecordViews::ChecksumCache.new(connection)
    connection.execute "DROP VIEW IF EXISTS #{connection.quote_table_name name}"
    cache.set name, nil
  end

  def self.register_for_reload(sql_path, model_path)
    self.registered_views << RegisteredView.new(sql_path, model_path)
  end

  def self.reload_stale_views!
    self.registered_views.each do |registered_view|
      if registered_view.stale?
        registered_view.reload!
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
activerecord_views-0.0.1 lib/active_record_views.rb