Sha256: 0e034522d3ecd96e33f2044def49b936b0f9820877e36086cb9d8c361c6d409f

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

class ThinkingSphinx::Connection
  def self.pool
    @pool ||= Innertube::Pool.new(
      Proc.new { ThinkingSphinx::Connection.new },
      Proc.new { |connection| connection.close }
    )
  end

  def self.take
    retries  = 0
    original = nil
    begin
      pool.take do |connection|
        connection.reset
        begin
          yield connection
        rescue Riddle::ConnectionError, Riddle::ResponseError, SystemCallError => error
          original = error
          raise Innertube::Pool::BadResource
        end
      end
    rescue Innertube::Pool::BadResource
      retries += 1
      retry if retries < 3
      raise original
    end
  end

  def initialize
    client.open
  end

  def client
    @client ||= Riddle::Client.new shuffled_addresses, configuration.port, client_key
  end

  def reset
    client.reset
    client.max_matches = _max_matches
    client.timeout     = configuration.timeout || 0
  end

  private

  def client_key
    configuration.configuration.searchd.client_key
  end

  def configuration
    ThinkingSphinx::Configuration.instance
  end

  def _max_matches
    configuration.configuration.searchd.max_matches || 1000
  end

  def method_missing(method, *arguments, &block)
    client.send method, *arguments, &block
  end

  def shuffled_addresses
    return configuration.address unless configuration.shuffle

    addresses = Array(configuration.address)
    if addresses.respond_to?(:shuffle)
      addresses.shuffle
    else
      address.sort_by { rand }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
friendlyfashion-thinking-sphinx-2.0.14.3 lib/thinking_sphinx/connection.rb