-
Notifications
You must be signed in to change notification settings - Fork 468
/
connection.rb
73 lines (59 loc) · 1.79 KB
/
connection.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# frozen_string_literal: true
module ThinkingSphinx::Connection
MAXIMUM_RETRIES = 3
def self.new
configuration = ThinkingSphinx::Configuration.instance
options = {
:host => configuration.searchd.address,
:port => configuration.searchd.mysql41,
:socket => configuration.searchd.socket,
:reconnect => true
}.merge(configuration.settings['connection_options'] || {})
connection_class.new options
end
def self.clear
@pool = nil
end
def self.connection_class
return ThinkingSphinx::Connection::JRuby if RUBY_PLATFORM == 'java'
ThinkingSphinx::Connection::MRI
end
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|
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
def self.persistent?
@persistent
end
def self.persistent=(persist)
@persistent = persist
end
@persistent = true
end
require 'thinking_sphinx/connection/client'
require 'thinking_sphinx/connection/jruby'
require 'thinking_sphinx/connection/mri'