Sha256: e89b055acb674930fc1e48f027d272f51a43b2e34d19902e9a0cb85d7f4fa07b

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

require 'switch_point/writable_connection_hook'

module SwitchPoint
  class Proxy
    def initialize(name)
      @models = {}
      [:readonly, :writable].each do |mode|
        model = define_model(SwitchPoint.config.model_name(name, mode))
        @models[mode] = model
        model.establish_connection(SwitchPoint.config.database_name(name, mode))
        memorize_switch_point_name(name, model.connection)
      end
      @models[:writable].connection.extend(WritableConnectionHook)
      @mode = :readonly
    end

    def define_model(model_name)
      model = Class.new(ActiveRecord::Base)
      Proxy.const_set(model_name, model)
      model
    end

    def memorize_switch_point_name(name, connection)
      connection.instance_variable_set(:@switch_point_name, name)
    end

    def readonly!
      @mode = :readonly
    end

    def writable!
      @mode = :writable
    end

    def with_readonly(&block)
      with_connection(:readonly, &block)
    end

    def with_writable(&block)
      with_connection(:writable, &block)
    end

    def with_connection(mode, &block)
      saved_mode = @mode
      @mode = mode
      block.call
    ensure
      @mode = saved_mode
    end

    def connection
      @models[@mode].connection
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
switch_point-0.1.0 lib/switch_point/proxy.rb