Sha256: 3f634f04a3fad575509e0cc3324b8f87d1383efdeece019a6b774b79816b83dd

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

module ActiveRecord::Turntable
  class Shard
    module Connections; end
    def self.connection_classes
      Connections.constants.map { |name| Connections.const_get(name) }
    end

    attr_accessor :cluster, :name, :slaves

    def initialize(cluster, name = defined?(Rails) ? Rails.env : "development", slaves = [])
      @cluster = cluster
      @name = name
      @slaves = slaves.map { |s| SlaveShard.new(cluster, s) }
      ActiveRecord::Base.turntable_connections[name] = connection_pool
    end

    def connection_pool
      connection_klass.connection_pool
    end

    def connection
      if use_slave?
        current_slave_shard.connection
      else
        connection_pool.connection.tap do |conn|
          conn.turntable_shard_name ||= name
        end
      end
    end

    def support_slave?
      @slaves.size > 0
    end

    def use_slave?
      support_slave? && cluster.slave_enabled?
    end

    def current_slave_shard
      SlaveRegistry.slave_for(self) || SlaveRegistry.set_slave_for(self, any_slave)
    end

    private

      def connection_klass
        @connection_klass ||= create_connection_class
      end

      def create_connection_class
        klass = connection_class_instance
        klass.remove_connection
        klass.establish_connection ActiveRecord::Base.connection_pool.spec.config[:shards][name].with_indifferent_access
        klass
      end

      def connection_class_instance
        if Connections.const_defined?(name.classify)
          klass = Connections.const_get(name.classify)
        else
          klass = Class.new(ActiveRecord::Base)
          Connections.const_set(name.classify, klass)
          klass.abstract_class = true
        end
        klass
      end

      def set_current_slave_shard(slave)
        SlaveRegistry.set_slave_for(self, slave)
      end

      def any_slave
        slaves.sample
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
activerecord-turntable-4.0.0 lib/active_record/turntable/shard.rb