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 +4 -4
- data/.travis.yml +12 -0
- data/CHANGELOG.md +3 -0
- data/README.md +14 -5
- data/Rakefile +44 -0
- data/lib/replidog/model.rb +13 -6
- data/lib/replidog/proxy.rb +12 -4
- data/lib/replidog/version.rb +1 -1
- data/replidog.gemspec +2 -2
- data/spec/dummy/config/database.yml +17 -17
- data/spec/dummy/db/schema.rb +2 -2
- data/spec/replidog/model_spec.rb +22 -24
- data/spec/replidog/proxy_spec.rb +44 -0
- data/spec/spec_helper.rb +0 -23
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ec8e3d8618bb810ace3ee9be783e4166d82c992
|
4
|
+
data.tar.gz: 0f017082c512b0f7dd2c47d4ed977ff13397cc58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3eaa6a06b93046965dff10ad76fda903da270e5f51a825de7a6336d0a4fc13183e32367f1fb5ef2b8a3b2463beb9255e862fdba2160f6d7f941b3b9486578b0
|
7
|
+
data.tar.gz: 5243365c8633fbdab2bf922bade51136d7623f956a913c1cbe4bb684bbc2f78a2ab8f1b9a1f73066bdb0a26cc53ce1967464b887297656fe9415df8c205f3a06
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -181,8 +181,17 @@ List of overridden methods
|
|
181
181
|
|
182
182
|
## Contributing
|
183
183
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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
|
data/lib/replidog/model.rb
CHANGED
@@ -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
|
-
|
12
|
-
alias_method :connection_without_replidog, :connection
|
13
|
-
|
14
|
-
prepend BaseWithReplidogSupport
|
11
|
+
prepend ClassMethodsWithReplidogSupport
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
18
|
-
module
|
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
|
data/lib/replidog/proxy.rb
CHANGED
@@ -34,15 +34,23 @@ module Replidog
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def transaction(options = {}, &block)
|
37
|
-
|
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 =
|
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.
|
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.
|
132
|
+
current_model.retrieve_connection
|
125
133
|
end
|
126
134
|
|
127
135
|
def slave_connection
|
data/lib/replidog/version.rb
CHANGED
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"
|
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
|
-
|
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
|
-
|
15
|
-
database:
|
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:
|
26
|
+
database: replidog_test_slave1
|
27
27
|
|
28
28
|
test_slave2: &test_slave2
|
29
29
|
<<: *test_default
|
30
|
-
database:
|
30
|
+
database: replidog_test_slave2
|
31
31
|
|
32
32
|
test_slave3: &test_slave3
|
33
33
|
<<: *test_default
|
34
|
-
database:
|
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:
|
48
|
+
database: replidog_test_user_slave
|
49
49
|
|
50
50
|
test_user:
|
51
51
|
<<: *test_default
|
52
|
-
database:
|
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
|
-
|
62
|
-
database:
|
63
|
-
username: root
|
64
|
-
pool: 5
|
65
|
-
timeout: 5000
|
64
|
+
<<: *default
|
65
|
+
database: replidog_production
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -31,14 +31,14 @@ ActiveRecord::Schema.define(version: 0) do
|
|
31
31
|
t.datetime "updated_at"
|
32
32
|
end
|
33
33
|
|
34
|
-
create_table "
|
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 "
|
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"
|
data/spec/replidog/model_spec.rb
CHANGED
@@ -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 "
|
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 "
|
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
|
data/spec/replidog/proxy_spec.rb
CHANGED
@@ -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.
|
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-
|
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:
|
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:
|
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: '
|
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: '
|
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
|