replidog 1.1.0 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb2c9700cd4d59f081d362c08eac02be9943b8cc
4
- data.tar.gz: 33f1819e45ec2d9ebd7bcdf7a76186b552fe72a5
3
+ metadata.gz: 8ec8e3d8618bb810ace3ee9be783e4166d82c992
4
+ data.tar.gz: 0f017082c512b0f7dd2c47d4ed977ff13397cc58
5
5
  SHA512:
6
- metadata.gz: 2b0ea44389e81fb76b256d77658bf1557f7198308f23a7735b012ff3405d99496f8d52ad7a166c4f235fe9338cd338cc4c2ed07c5f1b1a79faafca5c6259ce7c
7
- data.tar.gz: af3bf2d9607c49327c52878fae02bde825db827124d702f96934dd1561866aabaf7bb20bbec95146383e7151cf7b239a15080f802175043bab53275f8531a715
6
+ metadata.gz: c3eaa6a06b93046965dff10ad76fda903da270e5f51a825de7a6336d0a4fc13183e32367f1fb5ef2b8a3b2463beb9255e862fdba2160f6d7f941b3b9486578b0
7
+ data.tar.gz: 5243365c8633fbdab2bf922bade51136d7623f956a913c1cbe4bb684bbc2f78a2ab8f1b9a1f73066bdb0a26cc53ce1967464b887297656fe9415df8c205f3a06
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ before_script:
3
+ - "rake db:prepare"
4
+ rvm:
5
+ - 2.2.2
6
+ - 2.3.1
7
+ gemfile:
8
+ - gemfiles/rails32.gemfile
9
+ - gemfiles/rails4.gemfile
10
+ - gemfiles/rails41.gemfile
11
+ - gemfiles/rails42.gemfile
12
+ - gemfiles/rails5.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 1.1.1
2
+ - Support locking
3
+
1
4
  ## 1.1.0
2
5
  - Support multithread
3
6
 
data/README.md CHANGED
@@ -181,8 +181,17 @@ List of overridden methods
181
181
 
182
182
  ## Contributing
183
183
 
184
- 1. Fork it ( https://github.com/[my-github-username]/replidog/fork )
185
- 2. Create your feature branch (`git checkout -b my-new-feature`)
186
- 3. Commit your changes (`git commit -am 'Add some feature'`)
187
- 4. Push to the branch (`git push origin my-new-feature`)
188
- 5. Create a new Pull Request
184
+ ```
185
+ # setup gems
186
+ bundle install
187
+ appraisal install
188
+
189
+ # setup databases
190
+ rake db:prepare
191
+
192
+ # run tests for current gemfile
193
+ rake
194
+
195
+ # run tests for all appraisals
196
+ appraisal rake
197
+ ```
data/Rakefile CHANGED
@@ -1,2 +1,46 @@
1
+ require "bundler/setup"
1
2
  require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
2
4
 
5
+ RSpec::Core::RakeTask.new
6
+ task :default => [:spec]
7
+
8
+ namespace :db do
9
+ task :prepare do
10
+ require File.expand_path("spec/dummy/config/application", File.dirname(__FILE__))
11
+ Dummy::Application.load_tasks
12
+
13
+ orig_env = ENV["RAILS_ENV"]
14
+ begin
15
+ Rails.env = "test_db_migration"
16
+ Rake::Task["db:create"].invoke
17
+ Rake::Task["db:schema:load"].invoke
18
+ ensure
19
+ ENV["RAILS_ENV"] = orig_env
20
+ end
21
+
22
+ file = File.expand_path('spec/dummy/config/database.yml', File.dirname(__FILE__))
23
+ config = YAML.load_file(file)
24
+
25
+ case config["test"]["adapter"]
26
+ when "mysql2"
27
+ 3.times do |i|
28
+ system("mysql -u root -e 'drop database replidog_test_slave#{i + 1}' > /dev/null 2> /dev/null")
29
+ system("mysql -u root -e 'create database replidog_test_slave#{i + 1}'")
30
+ system("mysqldump -u root replidog_test | mysql -u root replidog_test_slave#{i + 1}")
31
+ end
32
+ system("mysql -u root -e 'drop database replidog_test_user' > /dev/null 2> /dev/null")
33
+ system("mysql -u root -e 'drop database replidog_test_user_slave' > /dev/null 2> /dev/null")
34
+ system("mysql -u root -e 'create database replidog_test_user'")
35
+ system("mysql -u root -e 'create database replidog_test_user_slave'")
36
+ system("mysqldump -u root replidog_test | mysql -u root replidog_test_user")
37
+ system("mysqldump -u root replidog_test | mysql -u root replidog_test_user_slave")
38
+ when "sqlite"
39
+ 3.times do |i|
40
+ FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_slave#{i + 1}.sqlite3")
41
+ end
42
+ FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_user.sqlite3")
43
+ FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_user_slave.sqlite3")
44
+ end
45
+ end
46
+ end
@@ -1,4 +1,3 @@
1
- require "active_support/core_ext/module/aliasing"
2
1
  require "active_support/core_ext/class/attribute"
3
2
 
4
3
  module Replidog
@@ -6,16 +5,14 @@ module Replidog
6
5
  def self.extended(base)
7
6
  base.class_attribute :proxy_handler, instance_writer: false
8
7
  base.proxy_handler = Replidog::ProxyHandler.new
8
+ base.prepend InstanceMethodsWithReplidogSupport
9
9
 
10
10
  class << base
11
- alias_method :connected_without_replidog?, :connected?
12
- alias_method :connection_without_replidog, :connection
13
-
14
- prepend BaseWithReplidogSupport
11
+ prepend ClassMethodsWithReplidogSupport
15
12
  end
16
13
  end
17
14
 
18
- module BaseWithReplidogSupport
15
+ module ClassMethodsWithReplidogSupport
19
16
  def establish_connection(spec = ENV["DATABASE_URL"])
20
17
  super
21
18
  proxy_handler.remove_connection(self)
@@ -56,6 +53,16 @@ module Replidog
56
53
  end
57
54
  end
58
55
 
56
+ module InstanceMethodsWithReplidogSupport
57
+ def lock!
58
+ old_connection_name = self.class.connection.current_connection_name
59
+ self.class.connection.current_connection_name ||= :master
60
+ super
61
+ ensure
62
+ self.class.connection.current_connection_name = old_connection_name
63
+ end
64
+ end
65
+
59
66
  def replicated?
60
67
  connection_config[:replications].present?
61
68
  end
@@ -34,15 +34,23 @@ module Replidog
34
34
  end
35
35
 
36
36
  def transaction(options = {}, &block)
37
- old = current_connection_name
37
+ old_connection_name = current_connection_name
38
38
  self.current_connection_name ||= :master
39
39
  current_connection.transaction(options, &block)
40
40
  ensure
41
- self.current_connection_name = old
41
+ self.current_connection_name = old_connection_name
42
+ end
43
+
44
+ def lock(locks = true)
45
+ old_connection_name = current_connection_name
46
+ self.current_connection_name ||= :master
47
+ current_connection.lock(locks)
48
+ ensure
49
+ self.current_connection_name = old_connection_name
42
50
  end
43
51
 
44
52
  def connected?
45
- current_model.connected_without_replidog? && slave_connection_pool_table.values.any?(&:connected?)
53
+ current_model.connection_handler.connected?(current_model) && slave_connection_pool_table.values.any?(&:connected?)
46
54
  end
47
55
 
48
56
  def clear_active_slave_connections!
@@ -121,7 +129,7 @@ module Replidog
121
129
  end
122
130
 
123
131
  def master_connection
124
- current_model.connection_without_replidog
132
+ current_model.retrieve_connection
125
133
  end
126
134
 
127
135
  def slave_connection
@@ -1,3 +1,3 @@
1
1
  module Replidog
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
data/replidog.gemspec CHANGED
@@ -23,11 +23,11 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'appraisal'
24
24
  spec.add_development_dependency "bundler", "~> 1.7"
25
25
  spec.add_development_dependency "coffee-rails", ">= 3.2.0"
26
- spec.add_development_dependency "database_rewinder"
26
+ spec.add_development_dependency "database_rewinder", "~> 0.6.0"
27
27
  spec.add_development_dependency "jquery-rails"
28
28
  spec.add_development_dependency "pry"
29
29
  spec.add_development_dependency "pry-rails"
30
- spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rake"
31
31
  spec.add_development_dependency "rails", ">= 3.2.0"
32
32
  spec.add_development_dependency "rspec", ">= 3"
33
33
  spec.add_development_dependency "rspec-rails", ">= 3"
@@ -3,19 +3,19 @@
3
3
  #
4
4
  # Ensure the SQLite 3 gem is defined in your Gemfile
5
5
  # gem 'sqlite3'
6
- development:
6
+ default: &default
7
7
  adapter: mysql2
8
- database: dummy_development
9
8
  username: root
10
9
  pool: 5
11
10
  timeout: 5000
12
11
 
12
+ development:
13
+ <<: *default
14
+ database: replidog_development
15
+
13
16
  test_default: &test_default
14
- adapter: mysql2
15
- database: dummy_test
16
- username: root
17
- pool: 5
18
- timeout: 5000
17
+ <<: *default
18
+ database: replidog_test
19
19
 
20
20
  # Warning: The database defined as "test" will be erased and
21
21
  # re-generated from your development database when you run "rake".
@@ -23,15 +23,15 @@ test_default: &test_default
23
23
 
24
24
  test_slave1: &test_slave1
25
25
  <<: *test_default
26
- database: dummy_test_slave1
26
+ database: replidog_test_slave1
27
27
 
28
28
  test_slave2: &test_slave2
29
29
  <<: *test_default
30
- database: dummy_test_slave2
30
+ database: replidog_test_slave2
31
31
 
32
32
  test_slave3: &test_slave3
33
33
  <<: *test_default
34
- database: dummy_test_slave3
34
+ database: replidog_test_slave3
35
35
 
36
36
  test:
37
37
  <<: *test_default
@@ -45,11 +45,11 @@ test:
45
45
 
46
46
  test_user_slave: &test_user_slave
47
47
  <<: *test_default
48
- database: dummy_test_user_slave
48
+ database: replidog_test_user_slave
49
49
 
50
50
  test_user:
51
51
  <<: *test_default
52
- database: dummy_test_user
52
+ database: replidog_test_user
53
53
  replications:
54
54
  slave:
55
55
  <<: *test_user_slave
@@ -57,9 +57,9 @@ test_user:
57
57
  test_admin:
58
58
  <<: *test_default
59
59
 
60
+ test_db_migration:
61
+ <<: *test_default
62
+
60
63
  production:
61
- adapter: mysql2
62
- database: dummy_test
63
- username: root
64
- pool: 5
65
- timeout: 5000
64
+ <<: *default
65
+ database: replidog_production
@@ -31,14 +31,14 @@ ActiveRecord::Schema.define(version: 0) do
31
31
  t.datetime "updated_at"
32
32
  end
33
33
 
34
- create_table "profile", force: true do |t|
34
+ create_table "profiles", force: true do |t|
35
35
  t.integer "user_id", null: false
36
36
  t.string "nickname", null: false
37
37
  t.datetime "created_at"
38
38
  t.datetime "updated_at"
39
39
  end
40
40
 
41
- create_table "admin", force: true do |t|
41
+ create_table "admins", force: true do |t|
42
42
  t.string "name", null: false
43
43
  t.datetime "created_at"
44
44
  t.datetime "updated_at"
@@ -24,13 +24,13 @@ describe Replidog::Model do
24
24
  describe ".establish_connection" do
25
25
  context "with no args" do
26
26
  it 'establishes connection' do
27
- expect(Recipe.connection.current_database).to eq "dummy_test"
27
+ expect(Recipe.connection.current_database).to eq "replidog_test"
28
28
  end
29
29
  end
30
30
 
31
31
  context "with args" do
32
32
  it 'establishes connection' do
33
- expect(User.connection.current_database).to eq "dummy_test_user"
33
+ expect(User.connection.current_database).to eq "replidog_test_user"
34
34
  end
35
35
  end
36
36
  end
@@ -223,28 +223,6 @@ describe Replidog::Model do
223
223
  end
224
224
  end
225
225
 
226
- describe "#transaction" do
227
- context "without using" do
228
- it "executes SQL query on master connection" do
229
- Recipe.using(:slave1).create(title: "test")
230
- Recipe.using(:slave2).create(title: "test")
231
- Recipe.using(:slave3).create(title: "test")
232
- Recipe.transaction do
233
- expect(Recipe.first).to be_nil
234
- end
235
- end
236
- end
237
-
238
- context "with using slave name" do
239
- it "executes SQL query on slave connection" do
240
- Recipe.using(:slave1).create(title: "test")
241
- Recipe.using(:slave1).transaction do
242
- expect(Recipe.first).not_to be_nil
243
- end
244
- end
245
- end
246
- end
247
-
248
226
  describe ".clear_active_connections!" do
249
227
  before do
250
228
  activate_connection_pools
@@ -306,4 +284,24 @@ describe Replidog::Model do
306
284
  end
307
285
  end
308
286
  end
287
+
288
+ describe "#lock!" do
289
+ context "without using" do
290
+ it "executes SQL query on master connection" do
291
+ Recipe.using(:slave1).create(title: "test")
292
+ Recipe.using(:slave2).create(title: "test")
293
+ Recipe.using(:slave3).create(title: "test")
294
+ expect{ Recipe.first.lock! }.to raise_error(ActiveRecord::RecordNotFound)
295
+ end
296
+ end
297
+
298
+ context "with using slave name" do
299
+ it "executes SQL query on slave connection" do
300
+ Recipe.using(:slave1).create(title: "test")
301
+ Recipe.using(:slave1) do
302
+ expect(Recipe.first.lock!).to eq Recipe.first
303
+ end
304
+ end
305
+ end
306
+ end
309
307
  end
@@ -6,6 +6,50 @@ describe Replidog::Proxy do
6
6
  UserTable.establish_connection :test_user
7
7
  end
8
8
 
9
+ describe "#transaction" do
10
+ context "without using" do
11
+ it "executes SQL query on master connection" do
12
+ Recipe.using(:slave1).create(title: "test")
13
+ Recipe.using(:slave2).create(title: "test")
14
+ Recipe.using(:slave3).create(title: "test")
15
+ Recipe.transaction do
16
+ expect(Recipe.first).to be_nil
17
+ end
18
+ end
19
+ end
20
+
21
+ context "with using slave name" do
22
+ it "executes SQL query on slave connection" do
23
+ Recipe.using(:slave1).create(title: "test")
24
+ Recipe.using(:slave1).transaction do
25
+ expect(Recipe.first).not_to be_nil
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#lock" do
32
+ context "without using" do
33
+ it "executes SQL query on master connection" do
34
+ Recipe.using(:slave1).create(title: "test")
35
+ Recipe.using(:slave2).create(title: "test")
36
+ Recipe.using(:slave3).create(title: "test")
37
+ Recipe.lock do
38
+ expect(Recipe.first).to be_nil
39
+ end
40
+ end
41
+ end
42
+
43
+ context "with using slave name" do
44
+ it "executes SQL query on slave connection" do
45
+ Recipe.using(:slave1).create(title: "test")
46
+ Recipe.using(:slave1).lock do
47
+ expect(Recipe.first).not_to be_nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+
9
53
  describe "#enable_query_cache!" do
10
54
  it "enables query cache of all connections" do
11
55
  expect{ Recipe.connection.enable_query_cache! }
data/spec/spec_helper.rb CHANGED
@@ -8,28 +8,6 @@ require File.expand_path("../dummy/config/environment", __FILE__)
8
8
  require "rspec/rails"
9
9
 
10
10
  RSpec.configure do |config|
11
- copy_master_to_slave = proc do |adapter|
12
- case adapter
13
- when :mysql2
14
- 3.times do |i|
15
- system("mysql -u root -e 'drop database dummy_test_slave#{i + 1}' > /dev/null 2> /dev/null")
16
- system("mysql -u root -e 'create database dummy_test_slave#{i + 1}'")
17
- system("mysqldump -u root dummy_test | mysql -u root dummy_test_slave#{i + 1}")
18
- end
19
- system("mysql -u root -e 'drop database dummy_test_user' > /dev/null 2> /dev/null")
20
- system("mysql -u root -e 'drop database dummy_test_user_slave' > /dev/null 2> /dev/null")
21
- system("mysql -u root -e 'create database dummy_test_user'")
22
- system("mysql -u root -e 'create database dummy_test_user_slave'")
23
- system("mysqldump -u root dummy_test | mysql -u root dummy_test_user")
24
- system("mysqldump -u root dummy_test | mysql -u root dummy_test_user_slave")
25
- when :sqlite3
26
- 3.times do |i|
27
- FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_slave#{i + 1}.sqlite3")
28
- end
29
- FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_user.sqlite3")
30
- FileUtils.copy("#{Rails.root}/db/test.sqlite3", "#{Rails.root}/db/test_user_slave.sqlite3")
31
- end
32
- end
33
11
 
34
12
  config.run_all_when_everything_filtered = true
35
13
  config.filter_run :focus
@@ -42,7 +20,6 @@ RSpec.configure do |config|
42
20
  DatabaseRewinder["test_user"]
43
21
  DatabaseRewinder["test_user_slave"]
44
22
  DatabaseRewinder.clean_all
45
- copy_master_to_slave.call(:mysql2)
46
23
  end
47
24
 
48
25
  config.after(:each) do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: replidog
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Ejima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-16 00:00:00.000000000 Z
11
+ date: 2016-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -104,16 +104,16 @@ dependencies:
104
104
  name: database_rewinder
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - ">="
107
+ - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '0'
109
+ version: 0.6.0
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ">="
114
+ - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '0'
116
+ version: 0.6.0
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: jquery-rails
119
119
  requirement: !ruby/object:Gem::Requirement
@@ -160,16 +160,16 @@ dependencies:
160
160
  name: rake
161
161
  requirement: !ruby/object:Gem::Requirement
162
162
  requirements:
163
- - - "~>"
163
+ - - ">="
164
164
  - !ruby/object:Gem::Version
165
- version: '10.0'
165
+ version: '0'
166
166
  type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
- - - "~>"
170
+ - - ">="
171
171
  - !ruby/object:Gem::Version
172
- version: '10.0'
172
+ version: '0'
173
173
  - !ruby/object:Gem::Dependency
174
174
  name: rails
175
175
  requirement: !ruby/object:Gem::Requirement
@@ -290,6 +290,7 @@ extensions: []
290
290
  extra_rdoc_files: []
291
291
  files:
292
292
  - ".gitignore"
293
+ - ".travis.yml"
293
294
  - Appraisals
294
295
  - CHANGELOG.md
295
296
  - Gemfile