activerecord-mysql-reconnect-new 0.6.0
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.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.idea/.gitignore +8 -0
- data/.idea/activerecord-mysql-reconnect.iml +22 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rspec +3 -0
- data/.travis.yml +45 -0
- data/Appraisals +28 -0
- data/ChangeLog +35 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +124 -0
- data/Rakefile +5 -0
- data/activerecord-mysql-reconnect-new.gemspec +28 -0
- data/docker-compose.yml +6 -0
- data/gemfiles/activerecord_4.2.gemfile +8 -0
- data/gemfiles/activerecord_5.0.gemfile +7 -0
- data/gemfiles/activerecord_5.1.gemfile +7 -0
- data/gemfiles/activerecord_5.2.gemfile +7 -0
- data/gemfiles/activerecord_6.0.gemfile +7 -0
- data/gemfiles/activerecord_6.1.gemfile +7 -0
- data/gemfiles/activerecord_master.gemfile +7 -0
- data/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb +46 -0
- data/lib/activerecord/mysql/reconnect/base_ext.rb +32 -0
- data/lib/activerecord/mysql/reconnect/connection_pool_ext.rb +18 -0
- data/lib/activerecord/mysql/reconnect/mysql2_adapter_ext.rb +13 -0
- data/lib/activerecord/mysql/reconnect/null_transaction_ext.rb +9 -0
- data/lib/activerecord/mysql/reconnect/version.rb +7 -0
- data/lib/activerecord/mysql/reconnect.rb +268 -0
- data/lib/activerecord-mysql-reconnect.rb +5 -0
- data/spec/activerecord-mysql-reconnect_spec.rb +545 -0
- data/spec/data.sql +1001 -0
- data/spec/employee_model.rb +1 -0
- data/spec/mysql2_ext.rb +5 -0
- data/spec/mysql_helper.rb +84 -0
- data/spec/spec_helper.rb +54 -0
- metadata +174 -0
@@ -0,0 +1 @@
|
|
1
|
+
class Employee < ActiveRecord::Base; end
|
data/spec/mysql2_ext.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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,174 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activerecord-mysql-reconnect-new
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sundeep Yama
|
8
|
+
- Lee Hester
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2022-07-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: mysql2
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 3.0.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 3.0.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: appraisal
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
description: It is the library to reconnect automatically when ActiveRecord is disconnected
|
99
|
+
from MySQL.
|
100
|
+
email:
|
101
|
+
- sundeepyama@gmail.com
|
102
|
+
- lhester@simplenexus.com
|
103
|
+
executables: []
|
104
|
+
extensions: []
|
105
|
+
extra_rdoc_files: []
|
106
|
+
files:
|
107
|
+
- ".gitignore"
|
108
|
+
- ".idea/.gitignore"
|
109
|
+
- ".idea/activerecord-mysql-reconnect.iml"
|
110
|
+
- ".idea/misc.xml"
|
111
|
+
- ".idea/modules.xml"
|
112
|
+
- ".idea/vcs.xml"
|
113
|
+
- ".rspec"
|
114
|
+
- ".travis.yml"
|
115
|
+
- Appraisals
|
116
|
+
- ChangeLog
|
117
|
+
- Gemfile
|
118
|
+
- LICENSE.txt
|
119
|
+
- README.md
|
120
|
+
- Rakefile
|
121
|
+
- activerecord-mysql-reconnect-new.gemspec
|
122
|
+
- docker-compose.yml
|
123
|
+
- gemfiles/activerecord_4.2.gemfile
|
124
|
+
- gemfiles/activerecord_5.0.gemfile
|
125
|
+
- gemfiles/activerecord_5.1.gemfile
|
126
|
+
- gemfiles/activerecord_5.2.gemfile
|
127
|
+
- gemfiles/activerecord_6.0.gemfile
|
128
|
+
- gemfiles/activerecord_6.1.gemfile
|
129
|
+
- gemfiles/activerecord_master.gemfile
|
130
|
+
- lib/activerecord-mysql-reconnect.rb
|
131
|
+
- lib/activerecord/mysql/reconnect.rb
|
132
|
+
- lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb
|
133
|
+
- lib/activerecord/mysql/reconnect/base_ext.rb
|
134
|
+
- lib/activerecord/mysql/reconnect/connection_pool_ext.rb
|
135
|
+
- lib/activerecord/mysql/reconnect/mysql2_adapter_ext.rb
|
136
|
+
- lib/activerecord/mysql/reconnect/null_transaction_ext.rb
|
137
|
+
- lib/activerecord/mysql/reconnect/version.rb
|
138
|
+
- spec/activerecord-mysql-reconnect_spec.rb
|
139
|
+
- spec/data.sql
|
140
|
+
- spec/employee_model.rb
|
141
|
+
- spec/mysql2_ext.rb
|
142
|
+
- spec/mysql_helper.rb
|
143
|
+
- spec/spec_helper.rb
|
144
|
+
homepage: https://github.com/SimpleNexus/activerecord-mysql-reconnect
|
145
|
+
licenses:
|
146
|
+
- MIT
|
147
|
+
metadata: {}
|
148
|
+
post_install_message:
|
149
|
+
rdoc_options: []
|
150
|
+
require_paths:
|
151
|
+
- lib
|
152
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
requirements: []
|
163
|
+
rubygems_version: 3.3.8
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: It is the library to reconnect automatically when ActiveRecord is disconnected
|
167
|
+
from MySQL.
|
168
|
+
test_files:
|
169
|
+
- spec/activerecord-mysql-reconnect_spec.rb
|
170
|
+
- spec/data.sql
|
171
|
+
- spec/employee_model.rb
|
172
|
+
- spec/mysql2_ext.rb
|
173
|
+
- spec/mysql_helper.rb
|
174
|
+
- spec/spec_helper.rb
|