Module: ThinkingSphinx::Connection

Defined in:
lib/thinking_sphinx/connection.rb

Defined Under Namespace

Classes: Client, JRuby, MRI

Constant Summary

MAXIMUM_RETRIES =
3

Class Method Summary collapse

Class Method Details

.connection_classObject



20
21
22
23
24
# File 'lib/thinking_sphinx/connection.rb', line 20

def self.connection_class
  return ThinkingSphinx::Connection::JRuby if RUBY_PLATFORM == 'java'

  ThinkingSphinx::Connection::MRI
end

.newObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/thinking_sphinx/connection.rb', line 4

def self.new
  configuration = ThinkingSphinx::Configuration.instance
  # If you use localhost, MySQL insists on a socket connection, but Sphinx
  # requires a TCP connection. Using 127.0.0.1 fixes that.
  address = configuration.searchd.address || '127.0.0.1'
  address = '127.0.0.1' if address == 'localhost'

  options = {
    :host      => address,
    :port      => configuration.searchd.mysql41,
    :reconnect => true
  }.merge(configuration.settings['connection_options'] || {})

  connection_class.new options
end

.persistent=(persist) ⇒ Object



61
62
63
# File 'lib/thinking_sphinx/connection.rb', line 61

def self.persistent=(persist)
  @persistent = persist
end

.persistent?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/thinking_sphinx/connection.rb', line 57

def self.persistent?
  @persistent
end

.poolObject



26
27
28
29
30
31
# File 'lib/thinking_sphinx/connection.rb', line 26

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

.takeObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/thinking_sphinx/connection.rb', line 33

def self.take
  retries  = 0
  original = nil
  begin
    pool.take do |connection|
      begin
        yield connection
      rescue ThinkingSphinx::QueryExecutionError, connection.base_error => error
        original = ThinkingSphinx::SphinxError.new_from_mysql error
        retries += MAXIMUM_RETRIES if original.is_a?(ThinkingSphinx::QueryError)
        raise Innertube::Pool::BadResource
      end
    end
  rescue Innertube::Pool::BadResource
    retries += 1
    raise original unless retries < MAXIMUM_RETRIES

    ActiveSupport::Notifications.instrument(
      "message.thinking_sphinx", :message => "Retrying query \"#{original.statement}\" after error: #{original.message}"
    )
    retry
  end
end