activerecord-mysql-reconnect 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa9520e56f0c5726a4abb72bd8bdc719e94d709f
4
- data.tar.gz: fb4302265396c109b2be9f328be48aa4f4351b35
3
+ metadata.gz: edc9b88122246d91bb12caad426b895a663b3ac3
4
+ data.tar.gz: 4d33d7b9b4aca402c5548ecd972cc7fe944dab06
5
5
  SHA512:
6
- metadata.gz: 7ab2e9a0f7aed38b65408fa5f9c7077047617c5c9275c753c9f6fd195cf4ef37708622bf8165be4a77d347694085e3cecc925e2db95aa6a986b2ff1ab181f6d3
7
- data.tar.gz: bce551e66baf1dd0a6e6717d15d2a53206d05c1698602ab6921375ab6b18082d3c85fcf4f540099a53508d1444ab643ba617dba4175dd1d495c66b3e58813dd7
6
+ metadata.gz: c12fbc120985b3f3d8f6b9b4fdcf0fa34ae431ca149ae152f8951f3f372b65f322398b5d8e33c261a66156654cc9645ab42714d5a5d866065badb234015b18c1
7
+ data.tar.gz: 08adf77b43b394d8e96a896ff0c17506743e0688cc2eae2feaf518276c96ac14e1d1bd3256e7edac1701bf9831b0a971210fa6e063fbec859f27b725c90db4f0
data/README.md CHANGED
@@ -90,7 +90,11 @@ gem 'activerecord-mysql-reconnect'
90
90
  MyApp::Application.configure do
91
91
  ...
92
92
  config.active_record.enable_retry = true
93
- #config.active_record.retry_databases = :employees # or [:employees], ['employees']
93
+ #config.active_record.retry_databases = :employees
94
+ # e.g. [:employees]
95
+ # ['employees', 'localhost:test', '192.168.1.1:users']
96
+ # ['192.168.%:emp\_all']
97
+ # ['emp%']
94
98
  # retry_databases -> nil: retry all databases (default)
95
99
  config.active_record.execution_tries = 10 # times
96
100
  # execution_tries -> 0: retry indefinitely
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'mysql2'
24
24
  spec.add_development_dependency 'bundler', '~> 1.3'
25
25
  spec.add_development_dependency 'rake'
26
- spec.add_development_dependency 'rspec', '>= 2.14.1', '< 3.0.0'
26
+ spec.add_development_dependency 'rspec', '>= 3.0.0'
27
27
  spec.add_development_dependency 'rspec-instafail'
28
28
  end
@@ -1,6 +1,7 @@
1
1
  require 'mysql2'
2
2
  require 'logger'
3
3
  require 'bigdecimal'
4
+ require 'strscan'
4
5
 
5
6
  require 'active_record'
6
7
  require 'active_record/connection_adapters/abstract_adapter'
@@ -85,7 +86,21 @@ module Activerecord::Mysql::Reconnect
85
86
  v = [v]
86
87
  end
87
88
 
88
- @activerecord_mysql_reconnect_retry_databases = v.map {|i| i.to_s }
89
+ @activerecord_mysql_reconnect_retry_databases = v.map do |database|
90
+ if database.instance_of?(Symbol)
91
+ database = Regexp.escape(database.to_s)
92
+ [/.*/, /\A#{database}\z/]
93
+ else
94
+ host = '%'
95
+ database = database.to_s
96
+
97
+ if database =~ /:/
98
+ host, database = database.split(':', 2)
99
+ end
100
+
101
+ [create_pattern_match_regex(host), create_pattern_match_regex(database)]
102
+ end
103
+ end
89
104
  end
90
105
 
91
106
  def retry_databases
@@ -185,7 +200,12 @@ module Activerecord::Mysql::Reconnect
185
200
 
186
201
  if conn and not retry_databases.empty?
187
202
  conn_info = connection_info(conn)
188
- return false unless retry_databases.include?(conn_info[:database])
203
+
204
+ included = retry_databases.any? do |host, database|
205
+ host =~ conn_info[:host] and database =~ conn_info[:database]
206
+ end
207
+
208
+ return false unless included
189
209
  end
190
210
 
191
211
  unless HANDLE_ERROR.any? {|i| e.kind_of?(i) }
@@ -220,5 +240,28 @@ module Activerecord::Mysql::Reconnect
220
240
 
221
241
  return conn_info
222
242
  end
243
+
244
+ private
245
+
246
+ def create_pattern_match_regex(str)
247
+ ss = StringScanner.new(str)
248
+ buf = []
249
+
250
+ until ss.eos?
251
+ if (tok = ss.scan(/[^\\%_]+/))
252
+ buf << Regexp.escape(tok)
253
+ elsif (tok = ss.scan(/\\/))
254
+ buf << Regexp.escape(ss.getch)
255
+ elsif (tok = ss.scan(/%/))
256
+ buf << '.*'
257
+ elsif (tok = ss.scan(/_/))
258
+ buf << '.'
259
+ else
260
+ raise 'must not happen'
261
+ end
262
+ end
263
+
264
+ /\A#{buf.join}\z/
265
+ end
223
266
  end # end of class methods
224
267
  end
@@ -1,7 +1,7 @@
1
1
  module Activerecord
2
2
  module Mysql
3
3
  module Reconnect
4
- VERSION = '0.3.6'
4
+ VERSION = '0.3.7'
5
5
  end
6
6
  end
7
7
  end
@@ -369,19 +369,41 @@ describe 'activerecord-mysql-reconnect' do
369
369
  end
370
370
  end
371
371
 
372
- it 'retry specific database' do
373
- retry_databases(:employees2) do
372
+ [
373
+ :employees2,
374
+ '127.0.0.2:employees',
375
+ '127.0.0.\_:employees',
376
+ ].each do |db|
377
+ it "retry specific database: #{db}" do
378
+ retry_databases(db) do
379
+ expect {
380
+ expect(Employee.all.length).to eq(300024)
381
+ mysql_restart
382
+ expect(Employee.all.length).to eq(300024)
383
+ }.to raise_error(ActiveRecord::StatementInvalid)
384
+ end
385
+
374
386
  expect {
375
387
  expect(Employee.all.length).to eq(300024)
376
388
  mysql_restart
377
389
  expect(Employee.all.length).to eq(300024)
378
- }.to raise_error(ActiveRecord::StatementInvalid)
390
+ }.to_not raise_error
379
391
  end
392
+ end
380
393
 
381
- expect {
382
- expect(Employee.all.length).to eq(300024)
383
- mysql_restart
384
- expect(Employee.all.length).to eq(300024)
385
- }.to_not raise_error
394
+ [
395
+ :employees,
396
+ '127.0.0.1:employees',
397
+ '127.0.0._:e%',
398
+ ].each do |db|
399
+ it "retry specific database: #{db}" do
400
+ retry_databases(db) do
401
+ expect {
402
+ expect(Employee.all.length).to eq(300024)
403
+ mysql_restart
404
+ expect(Employee.all.length).to eq(300024)
405
+ }.to_not raise_error
406
+ end
407
+ end
386
408
  end
387
409
  end
data/spec/spec_helper.rb CHANGED
@@ -119,8 +119,8 @@ RSpec.configure do |config|
119
119
  system("git checkout #{employees_sql}")
120
120
  end
121
121
 
122
- config.before(:each) do
123
- desc = RSpec.current_example.metadata[:full_description]
122
+ config.before(:each) do |context|
123
+ desc = context.metadata[:full_description]
124
124
  puts <<-EOS
125
125
 
126
126
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-mysql-reconnect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-23 00:00:00.000000000 Z
11
+ date: 2014-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -71,9 +71,6 @@ dependencies:
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '>='
74
- - !ruby/object:Gem::Version
75
- version: 2.14.1
76
- - - <
77
74
  - !ruby/object:Gem::Version
78
75
  version: 3.0.0
79
76
  type: :development
@@ -81,9 +78,6 @@ dependencies:
81
78
  version_requirements: !ruby/object:Gem::Requirement
82
79
  requirements:
83
80
  - - '>='
84
- - !ruby/object:Gem::Version
85
- version: 2.14.1
86
- - - <
87
81
  - !ruby/object:Gem::Version
88
82
  version: 3.0.0
89
83
  - !ruby/object:Gem::Dependency