replidog 1.1.0 → 1.1.1

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: 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