Sha256: ab09115adc805d62a17d225c404ce2ebfa85ae9a6830056ef0691fa98ab0a59f

Contents?: true

Size: 1.69 KB

Versions: 12

Compression:

Stored size: 1.69 KB

Contents

module DbCharmer
  module MultiDbProxy
    class OnDbProxy < BlankSlate
      def initialize(proxy_target, slave)
        @proxy_target = proxy_target
        @slave = slave
      end

    private

      def method_missing(meth, *args, &block)
        # Switch connection and proxy the method call
        @proxy_target.on_db(@slave) do |m|
          res = m.__send__(meth, *args, &block)

          # If result is a scope/association, return a new proxy for it, otherwise return the result itself
          (res.proxy?) ? OnDbProxy.new(res, @slave) : res
        end
      end
    end

    module ClassMethods
      def on_db(con, proxy_target = nil)
        proxy_target ||= self

        # Chain call
        return OnDbProxy.new(proxy_target, con) unless block_given?

        # Block call
        begin
          self.db_charmer_connection_level += 1
          old_proxy = db_charmer_connection_proxy
          switch_connection_to(con, DbCharmer.migration_connections_should_exist?)
          yield(proxy_target)
        ensure
          switch_connection_to(old_proxy)
          self.db_charmer_connection_level -= 1
        end
      end
    end

    module InstanceMethods
      def on_db(con, proxy_target = nil, &block)
        proxy_target ||= self
        self.class.on_db(con, proxy_target, &block)
      end
    end

    module MasterSlaveClassMethods
      def on_slave(con = nil, proxy_target = nil, &block)
        con ||= db_charmer_random_slave
        raise ArgumentError, "No slaves found in the class and no slave connection given" unless con
        on_db(con, proxy_target, &block)
      end

      def on_master(proxy_target = nil, &block)
        on_db(nil, proxy_target, &block)
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
db-charmer-1.5.5 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.5.4 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.5.3 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.5.2 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.5.1 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.5.0 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.6 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.5 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.4 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.3 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.1 lib/db_charmer/multi_db_proxy.rb
db-charmer-1.4.0 lib/db_charmer/multi_db_proxy.rb