active_record_host_pool 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
- require 'active_record/connection_adapters/mysql_adapter'
2
- begin
3
- require 'active_record/connection_adapters/mysql2_adapter'
4
- rescue LoadError
1
+ ['mysql_adapter', 'mysql2_adapter'].each do |adapter|
2
+ begin
3
+ require "active_record/connection_adapters/#{adapter}"
4
+ rescue LoadError
5
+ end
5
6
  end
6
7
 
7
8
  module ActiveRecordHostPool
@@ -27,10 +27,20 @@ module ActiveRecordHostPool
27
27
  @config = spec.config.with_indifferent_access
28
28
  end
29
29
 
30
+ def spec
31
+ @spec
32
+ end
30
33
 
31
34
  def connection(*args)
32
- cx = _connection_pool.connection(*args)
33
- _connection_proxy_for(cx, @config[:database])
35
+ begin
36
+ real_connection = _connection_pool.connection(*args)
37
+ _connection_proxy_for(real_connection, @config[:database])
38
+ rescue Exception => e
39
+ if rescuable_errors.any? { |r| e.is_a?(r) }
40
+ _connection_pools.delete(_pool_key)
41
+ end
42
+ raise(e)
43
+ end
34
44
  end
35
45
 
36
46
  # by the time we are patched into ActiveRecord, the current thread has already established
@@ -53,6 +63,8 @@ module ActiveRecordHostPool
53
63
  end
54
64
 
55
65
  def disconnect!
66
+ p = _connection_pool(false)
67
+ return unless p
56
68
  _connection_pool.disconnect!
57
69
  _connection_pool.automatic_reconnect = true if _connection_pool.respond_to?(:automatic_reconnect=)
58
70
  _clear_connection_proxy_cache
@@ -64,17 +76,30 @@ module ActiveRecordHostPool
64
76
  end
65
77
 
66
78
  private
79
+ def rescuable_errors
80
+ @rescuable_errors ||= begin
81
+ e = []
82
+ if Object.const_defined?("Mysql")
83
+ e << Mysql::Error
84
+ end
85
+ if Object.const_defined?("Mysql2")
86
+ e << Mysql2::Error
87
+ end
88
+ e
89
+ end
90
+ end
91
+
67
92
  def _connection_pools
68
- @@connection_pools ||= {}
93
+ @@_connection_pools ||= {}
69
94
  end
70
95
 
71
96
  def _pool_key
72
- [@config[:host], @config[:port], @config[:socket], @config[:username]]
97
+ [@config[:host], @config[:port], @config[:socket], @config[:username]].map(&:to_s).join("/")
73
98
  end
74
99
 
75
- def _connection_pool
100
+ def _connection_pool(auto_create=true)
76
101
  pool = _connection_pools[_pool_key]
77
- if pool.nil?
102
+ if pool.nil? && auto_create
78
103
  pool = _connection_pools[_pool_key] = ActiveRecord::ConnectionAdapters::ConnectionPool.new(@spec)
79
104
  end
80
105
  pool
@@ -84,7 +109,11 @@ module ActiveRecordHostPool
84
109
  @connection_proxy_cache ||= {}
85
110
  key = [connection, database]
86
111
 
87
- @connection_proxy_cache[key] ||= ActiveRecordHostPool::ConnectionProxy.new(connection, database)
112
+ @connection_proxy_cache[key] ||= begin
113
+ cx = ActiveRecordHostPool::ConnectionProxy.new(connection, database)
114
+ cx.execute('select 1')
115
+ cx
116
+ end
88
117
  end
89
118
 
90
119
  def _clear_connection_proxy_cache
data/test/database.yml CHANGED
@@ -45,3 +45,13 @@ test_host_2_db_5:
45
45
  host: 127.0.0.1
46
46
  port: 3306
47
47
  reconnect: true
48
+
49
+ test_host_1_db_not_there:
50
+ adapter: mysql
51
+ encoding: utf8
52
+ database: arhp_test_no_create
53
+ username: root
54
+ password:
55
+ host: localhost
56
+ reconnect: true
57
+
data/test/helper.rb CHANGED
@@ -34,6 +34,7 @@ class ActiveSupport::TestCase
34
34
  private
35
35
  def arhp_create_databases
36
36
  ActiveRecord::Base.configurations.each do |name, conf|
37
+ next if name =~ /not_there/
37
38
  `echo "drop DATABASE IF EXISTS #{conf['database']}" | mysql --user=#{conf['username']}`
38
39
  `echo "create DATABASE #{conf['database']}" | mysql --user=#{conf['username']}`
39
40
  ActiveRecord::Base.establish_connection(name)
data/test/test_arhp.rb CHANGED
@@ -95,6 +95,31 @@ class ActiveRecordHostPoolTest < ActiveSupport::TestCase
95
95
  assert_equal expected_database, current_database(switch_to_klass)
96
96
  end
97
97
 
98
+ # rake db:create uses a pattern where it tries to connect to a non-existant database.
99
+ # but then we had this left in the connection pool cache.
100
+ # It's also almost impossible to test at this level, so I'm stubbing out the test
101
+ def _test_connecting_to_wrong_db_first
102
+ pools = ActiveRecord::Base.connection_handler.connection_pools
103
+ if !pools.empty?
104
+ ActiveRecord::Base.connection_handler.connection_pools.values.first.send(:_connection_pools).clear
105
+ ActiveRecord::Base.connection_handler.connection_pools.clear
106
+ end
107
+
108
+ begin
109
+ eval <<-EOC
110
+ class TestNotThere < ActiveRecord::Base
111
+ establish_connection("test_host_1_db_not_there")
112
+ end
113
+ EOC
114
+ rescue Exception => e
115
+ assert e.message =~ /Unknown database/
116
+ end
117
+
118
+ Test1.establish_connection("test_host_1_db_1")
119
+ # assert it doesn't raise.
120
+ assert Test1.connection
121
+ end
122
+
98
123
  def teardown
99
124
  arhp_drop_databases
100
125
  end
metadata CHANGED
@@ -1,117 +1,137 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: active_record_host_pool
3
- version: !ruby/object:Gem::Version
4
- hash: 5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.2
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 1
10
- version: 0.6.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Ben Osheroff
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-10-28 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: activerecord
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
35
31
  name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
36
39
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
38
41
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: shoulda
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
46
54
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: mysql
50
55
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: mysql
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
60
70
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: shoulda
64
71
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: mysql2
80
+ requirement: !ruby/object:Gem::Requirement
66
81
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
74
86
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: mocha
78
87
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
80
89
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: mocha
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
88
102
  type: :development
89
- version_requirements: *id005
90
- - !ruby/object:Gem::Dependency
91
- name: ruby-debug
92
103
  prerelease: false
93
- requirement: &id006 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: debugger
112
+ requirement: !ruby/object:Gem::Requirement
94
113
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
- version: "0"
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
102
118
  type: :development
103
- version_requirements: *id006
104
- description: ""
105
- email:
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: ''
127
+ email:
106
128
  - ben@gimbo.net
107
129
  executables: []
108
-
109
130
  extensions: []
110
-
111
- extra_rdoc_files:
131
+ extra_rdoc_files:
112
132
  - LICENSE
113
133
  - README.md
114
- files:
134
+ files:
115
135
  - README.md
116
136
  - lib/active_record_host_pool.rb
117
137
  - lib/active_record_host_pool/connection_adapter_mixin.rb
@@ -124,38 +144,36 @@ files:
124
144
  - test/test_arhp.rb
125
145
  homepage: http://github.com/zendesk/active_record_host_pool
126
146
  licenses: []
127
-
128
147
  post_install_message:
129
148
  rdoc_options: []
130
-
131
- require_paths:
149
+ require_paths:
132
150
  - lib
133
- required_ruby_version: !ruby/object:Gem::Requirement
151
+ required_ruby_version: !ruby/object:Gem::Requirement
134
152
  none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- hash: 3
139
- segments:
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ segments:
140
158
  - 0
141
- version: "0"
142
- required_rubygems_version: !ruby/object:Gem::Requirement
159
+ hash: 4283844498504978406
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
161
  none: false
144
- requirements:
145
- - - ">="
146
- - !ruby/object:Gem::Version
147
- hash: 3
148
- segments:
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ segments:
149
167
  - 0
150
- version: "0"
168
+ hash: 4283844498504978406
151
169
  requirements: []
152
-
153
170
  rubyforge_project:
154
- rubygems_version: 1.8.10
171
+ rubygems_version: 1.8.21
155
172
  signing_key:
156
173
  specification_version: 3
157
- summary: Allow ActiveRecord to share a connection to multiple databases on the same host
158
- test_files:
174
+ summary: Allow ActiveRecord to share a connection to multiple databases on the same
175
+ host
176
+ test_files:
159
177
  - test/database.yml
160
178
  - test/helper.rb
161
179
  - test/schema.rb