activerecord-mysql-reconnect-before-retry 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ class Employee < ActiveRecord::Base; end
@@ -0,0 +1,5 @@
1
+ require 'mysql2'
2
+
3
+ class Mysql2::Client
4
+ def escape(str); str; end
5
+ end
@@ -0,0 +1,84 @@
1
+ require 'mysql2'
2
+
3
+ class MysqlServer
4
+ CLI_ARGS = '-u root -P 14407 -h 127.0.0.1'
5
+ REDIRECT_TO_DEV_NULL = ENV['DEBUG'] == '1' ? '' : '> /dev/null 2> /dev/null'
6
+
7
+ class << self
8
+ def start
9
+ system("docker-compose up -d #{REDIRECT_TO_DEV_NULL}")
10
+ wait_mysql_start
11
+ end
12
+
13
+ def stop
14
+ system("docker-compose stop #{REDIRECT_TO_DEV_NULL}")
15
+ end
16
+
17
+ def restart
18
+ stop
19
+ start
20
+ end
21
+
22
+ def wait_mysql_start
23
+ started = false
24
+
25
+ 60.times do
26
+ break if (started = ping.success?)
27
+ sleep 1
28
+ end
29
+
30
+ unless started
31
+ raise 'cannot start mysql server'
32
+ end
33
+ end
34
+
35
+ def ping
36
+ system("mysqladmin ping #{CLI_ARGS} #{REDIRECT_TO_DEV_NULL}")
37
+ $?
38
+ end
39
+
40
+ def clean
41
+ stop
42
+ end
43
+
44
+ def reset
45
+ reset_database
46
+ reset_table
47
+ reset_data
48
+ end
49
+
50
+ def reset_database
51
+ system("mysql #{CLI_ARGS} -e 'DROP DATABASE IF EXISTS employees' #{REDIRECT_TO_DEV_NULL}")
52
+ system("mysql #{CLI_ARGS} -e 'CREATE DATABASE employees' #{REDIRECT_TO_DEV_NULL}")
53
+ end
54
+
55
+ def reset_table
56
+ engine = ENV['ACTIVERECORD_MYSQL_RECONNECT_ENGINE'] || 'InnoDB'
57
+ system("mysql #{CLI_ARGS} employees -e 'DROP TABLE IF EXISTS employees' #{REDIRECT_TO_DEV_NULL}")
58
+
59
+ create_table_sql = <<-SQL.gsub(/\n/, '')
60
+ CREATE TABLE `employees` (
61
+ `id` int(11) NOT NULL AUTO_INCREMENT,
62
+ `emp_no` int(11) NOT NULL,
63
+ `birth_date` date NOT NULL,
64
+ `first_name` varchar(14) NOT NULL,
65
+ `last_name` varchar(16) NOT NULL,
66
+ `hire_date` date NOT NULL,
67
+ PRIMARY KEY (`id`)
68
+ ) ENGINE=#{engine}
69
+ SQL
70
+
71
+ system("mysql #{CLI_ARGS} employees -e '#{create_table_sql}' #{REDIRECT_TO_DEV_NULL}")
72
+ end
73
+
74
+ def reset_data
75
+ data_file = File.expand_path('../data.sql', __FILE__)
76
+ system("mysql #{CLI_ARGS} employees < #{data_file} #{REDIRECT_TO_DEV_NULL}")
77
+ end
78
+
79
+ def lock_tables
80
+ data_file = File.expand_path('../data.sql', __FILE__)
81
+ system("mysql #{CLI_ARGS} employees -e 'LOCK TABLES employees WRITE; SELECT SLEEP(60)' #{REDIRECT_TO_DEV_NULL}")
82
+ end
83
+ end # of class methods
84
+ end
@@ -0,0 +1,54 @@
1
+ require 'mysql2_ext'
2
+ require 'mysql_helper'
3
+ require 'activerecord/mysql/reconnect'
4
+ require 'employee_model'
5
+
6
+ module SpecHelper
7
+ def thread_start
8
+ thread_running = false
9
+
10
+ th = Thread.start {
11
+ thread_running = true
12
+ yield
13
+ thread_running = false
14
+ }
15
+
16
+ 60.times do
17
+ Thread.pass
18
+ break if thread_running
19
+ sleep 1
20
+ end
21
+
22
+ unless thread_running
23
+ raise 'thread is not running'
24
+ end
25
+
26
+ th
27
+ end
28
+
29
+ def myisam?
30
+ ENV['ACTIVERECORD_MYSQL_RECONNECT_ENGINE'] =~ /MyISAM/i
31
+ end
32
+ end
33
+
34
+ include SpecHelper
35
+
36
+ RSpec.configure do |config|
37
+ config.before(:all) do
38
+ MysqlServer.stop
39
+ end
40
+
41
+ config.after(:all) do
42
+ MysqlServer.stop
43
+ end
44
+
45
+ config.before(:each) do |context|
46
+ MysqlServer.start
47
+ MysqlServer.reset
48
+ ActiveRecord::Base.clear_all_connections!
49
+ end
50
+
51
+ config.expect_with :rspec do |c|
52
+ c.max_formatted_output_length = 999999
53
+ end
54
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-mysql-reconnect-before-retry
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Genki Sugawara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mysql2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: It is the library to reconnect automatically when ActiveRecord is disconnected
98
+ from MySQL.
99
+ email:
100
+ - sugawara@cookpad.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".travis.yml"
108
+ - Appraisals
109
+ - ChangeLog
110
+ - Gemfile
111
+ - LICENSE.txt
112
+ - README.md
113
+ - Rakefile
114
+ - activerecord-mysql-reconnect.gemspec
115
+ - docker-compose.yml
116
+ - gemfiles/activerecord_4.2.gemfile
117
+ - gemfiles/activerecord_5.0.gemfile
118
+ - gemfiles/activerecord_5.1.gemfile
119
+ - gemfiles/activerecord_5.2.gemfile
120
+ - gemfiles/activerecord_6.0.gemfile
121
+ - gemfiles/activerecord_master.gemfile
122
+ - lib/activerecord-mysql-reconnect.rb
123
+ - lib/activerecord/mysql/reconnect.rb
124
+ - lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb
125
+ - lib/activerecord/mysql/reconnect/base_ext.rb
126
+ - lib/activerecord/mysql/reconnect/connection_pool_ext.rb
127
+ - lib/activerecord/mysql/reconnect/mysql2_adapter_ext.rb
128
+ - lib/activerecord/mysql/reconnect/null_transaction_ext.rb
129
+ - lib/activerecord/mysql/reconnect/version.rb
130
+ - spec/activerecord-mysql-reconnect_spec.rb
131
+ - spec/data.sql
132
+ - spec/employee_model.rb
133
+ - spec/mysql2_ext.rb
134
+ - spec/mysql_helper.rb
135
+ - spec/spec_helper.rb
136
+ homepage: https://github.com/winebarrel/activerecord-mysql-reconnect
137
+ licenses:
138
+ - MIT
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubygems_version: 3.0.6
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: It is the library to reconnect automatically when ActiveRecord is disconnected
159
+ from MySQL.
160
+ test_files:
161
+ - spec/activerecord-mysql-reconnect_spec.rb
162
+ - spec/data.sql
163
+ - spec/employee_model.rb
164
+ - spec/mysql2_ext.rb
165
+ - spec/mysql_helper.rb
166
+ - spec/spec_helper.rb