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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.idea/.gitignore +8 -0
  4. data/.idea/activerecord-mysql-reconnect.iml +22 -0
  5. data/.idea/misc.xml +4 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/.rspec +3 -0
  9. data/.travis.yml +45 -0
  10. data/Appraisals +28 -0
  11. data/ChangeLog +35 -0
  12. data/Gemfile +4 -0
  13. data/LICENSE.txt +22 -0
  14. data/README.md +124 -0
  15. data/Rakefile +5 -0
  16. data/activerecord-mysql-reconnect-new.gemspec +28 -0
  17. data/docker-compose.yml +6 -0
  18. data/gemfiles/activerecord_4.2.gemfile +8 -0
  19. data/gemfiles/activerecord_5.0.gemfile +7 -0
  20. data/gemfiles/activerecord_5.1.gemfile +7 -0
  21. data/gemfiles/activerecord_5.2.gemfile +7 -0
  22. data/gemfiles/activerecord_6.0.gemfile +7 -0
  23. data/gemfiles/activerecord_6.1.gemfile +7 -0
  24. data/gemfiles/activerecord_master.gemfile +7 -0
  25. data/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb +46 -0
  26. data/lib/activerecord/mysql/reconnect/base_ext.rb +32 -0
  27. data/lib/activerecord/mysql/reconnect/connection_pool_ext.rb +18 -0
  28. data/lib/activerecord/mysql/reconnect/mysql2_adapter_ext.rb +13 -0
  29. data/lib/activerecord/mysql/reconnect/null_transaction_ext.rb +9 -0
  30. data/lib/activerecord/mysql/reconnect/version.rb +7 -0
  31. data/lib/activerecord/mysql/reconnect.rb +268 -0
  32. data/lib/activerecord-mysql-reconnect.rb +5 -0
  33. data/spec/activerecord-mysql-reconnect_spec.rb +545 -0
  34. data/spec/data.sql +1001 -0
  35. data/spec/employee_model.rb +1 -0
  36. data/spec/mysql2_ext.rb +5 -0
  37. data/spec/mysql_helper.rb +84 -0
  38. data/spec/spec_helper.rb +54 -0
  39. metadata +174 -0
@@ -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,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