activerecord-turntable 2.5.0 → 3.0.0.alpha1
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/.rubocop.yml +7 -0
- data/.travis.yml +3 -7
- data/CHANGELOG.md +4 -14
- data/Gemfile +3 -0
- data/Guardfile +12 -7
- data/README.md +11 -19
- data/Rakefile +14 -15
- data/activerecord-turntable.gemspec +24 -27
- data/gemfiles/rails5_0.gemfile +6 -0
- data/lib/active_record/turntable/active_record_ext/abstract_adapter.rb +24 -20
- data/lib/active_record/turntable/active_record_ext/activerecord_import_ext.rb +6 -16
- data/lib/active_record/turntable/active_record_ext/acts_as_archive_extension.rb +25 -16
- data/lib/active_record/turntable/active_record_ext/association.rb +33 -14
- data/lib/active_record/turntable/active_record_ext/association_preloader.rb +4 -24
- data/lib/active_record/turntable/active_record_ext/clever_load.rb +2 -2
- data/lib/active_record/turntable/active_record_ext/connection_handler_extension.rb +11 -15
- data/lib/active_record/turntable/active_record_ext/database_tasks.rb +9 -9
- data/lib/active_record/turntable/active_record_ext/fixtures.rb +11 -41
- data/lib/active_record/turntable/active_record_ext/locking_optimistic.rb +40 -147
- data/lib/active_record/turntable/active_record_ext/log_subscriber.rb +6 -37
- data/lib/active_record/turntable/active_record_ext/migration_proxy.rb +1 -1
- data/lib/active_record/turntable/active_record_ext/persistence.rb +54 -148
- data/lib/active_record/turntable/active_record_ext/relation.rb +17 -45
- data/lib/active_record/turntable/active_record_ext/schema_dumper.rb +80 -78
- data/lib/active_record/turntable/active_record_ext/sequencer.rb +6 -15
- data/lib/active_record/turntable/active_record_ext/transactions.rb +14 -9
- data/lib/active_record/turntable/active_record_ext.rb +15 -16
- data/lib/active_record/turntable/algorithm/modulo_algorithm.rb +1 -1
- data/lib/active_record/turntable/algorithm/range_algorithm.rb +9 -9
- data/lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb +12 -12
- data/lib/active_record/turntable/base.rb +27 -14
- data/lib/active_record/turntable/cluster.rb +10 -13
- data/lib/active_record/turntable/cluster_helper_methods.rb +6 -6
- data/lib/active_record/turntable/config.rb +3 -3
- data/lib/active_record/turntable/connection_proxy/mixable.rb +1 -1
- data/lib/active_record/turntable/connection_proxy.rb +23 -22
- data/lib/active_record/turntable/helpers/test_helper.rb +4 -4
- data/lib/active_record/turntable/master_shard.rb +12 -7
- data/lib/active_record/turntable/migration.rb +41 -47
- data/lib/active_record/turntable/mixer/fader/calculate_shards_sum_result.rb +7 -7
- data/lib/active_record/turntable/mixer/fader/select_shards_merge_result.rb +12 -12
- data/lib/active_record/turntable/mixer.rb +121 -121
- data/lib/active_record/turntable/plugin.rb +1 -1
- data/lib/active_record/turntable/pool_proxy.rb +7 -19
- data/lib/active_record/turntable/query_cache.rb +41 -0
- data/lib/active_record/turntable/railtie.rb +7 -5
- data/lib/active_record/turntable/railties/databases.rake +19 -20
- data/lib/active_record/turntable/seq_shard.rb +15 -15
- data/lib/active_record/turntable/sequencer/api.rb +7 -7
- data/lib/active_record/turntable/sequencer/barrage.rb +6 -7
- data/lib/active_record/turntable/sequencer/mysql.rb +2 -2
- data/lib/active_record/turntable/sequencer.rb +15 -15
- data/lib/active_record/turntable/shard.rb +23 -20
- data/lib/active_record/turntable/sql_tree_patch.rb +59 -57
- data/lib/active_record/turntable/util.rb +1 -21
- data/lib/active_record/turntable/version.rb +1 -1
- data/lib/active_record/turntable.rb +14 -19
- data/lib/activerecord-turntable.rb +2 -2
- data/script/performance/algorithm +8 -9
- data/spec/active_record/turntable/active_record_ext/association_preloader_spec.rb +4 -4
- data/spec/active_record/turntable/active_record_ext/association_spec.rb +5 -14
- data/spec/active_record/turntable/active_record_ext/clever_load_spec.rb +6 -6
- data/spec/active_record/turntable/active_record_ext/fixture_set_spec.rb +4 -4
- data/spec/active_record/turntable/active_record_ext/locking_optimistic_spec.rb +2 -15
- data/spec/active_record/turntable/active_record_ext/migration_spec.rb +4 -4
- data/spec/active_record/turntable/active_record_ext/persistence_spec.rb +17 -15
- data/spec/active_record/turntable/active_record_ext/sequencer_spec.rb +1 -1
- data/spec/active_record/turntable/active_record_ext/test_fixtures_spec.rb +3 -3
- data/spec/active_record/turntable/algorithm/modulo_algorithm_spec.rb +2 -3
- data/spec/active_record/turntable/algorithm/range_algorithm_spec.rb +2 -3
- data/spec/active_record/turntable/algorithm/range_bsearch_algorithm_spec.rb +2 -3
- data/spec/active_record/turntable/algorithm_spec.rb +5 -5
- data/spec/active_record/turntable/base_spec.rb +1 -1
- data/spec/active_record/turntable/cluster_spec.rb +1 -1
- data/spec/active_record/turntable/config_spec.rb +1 -1
- data/spec/active_record/turntable/connection_proxy_spec.rb +16 -17
- data/spec/active_record/turntable/finder_spec.rb +1 -1
- data/spec/active_record/turntable/mixer/fader_spec.rb +1 -1
- data/spec/active_record/turntable/mixer_spec.rb +2 -4
- data/spec/active_record/turntable/query_cache_spec.rb +28 -0
- data/spec/active_record/turntable/sequencer/api_spec.rb +4 -4
- data/spec/active_record/turntable/sequencer/barrage_spec.rb +2 -2
- data/spec/active_record/turntable/sequencer/mysql_spec.rb +1 -1
- data/spec/active_record/turntable/shard_spec.rb +1 -1
- data/spec/active_record/turntable/sql_tree_patch_spec.rb +2 -2
- data/spec/active_record/turntable/transaction_spec.rb +2 -2
- data/spec/active_record/turntable_spec.rb +3 -3
- data/spec/migrations/002_create_user_statuses.rb +4 -4
- data/spec/migrations/003_create_cards.rb +3 -3
- data/spec/migrations/004_create_cards_users.rb +2 -2
- data/spec/models/user_status.rb +0 -1
- data/spec/spec_helper.rb +15 -14
- data/spec/support/turntable_helper.rb +4 -4
- metadata +98 -59
- data/gemfiles/rails4_0.gemfile +0 -7
- data/gemfiles/rails4_1.gemfile +0 -7
- data/gemfiles/rails4_2.gemfile +0 -7
- data/lib/active_record/turntable/rack/connection_management.rb +0 -18
- data/lib/active_record/turntable/rack/query_cache.rb +0 -40
- data/lib/active_record/turntable/rack.rb +0 -8
- data/spec/active_record/turntable/rack/query_cache_spec.rb +0 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: af3117e04f949c697cf878879a85c2205f7e19b6
|
|
4
|
+
data.tar.gz: 5437cc1aec6b98bb507639d81e9687eac526d8d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 039ffd448816f9792c8fb29fb7844e08ab0c1ea7227367158810dc718d580ee047922d1e23117875611e3d606d6a1b3a3494d732e962dc84e774a0755240a8bd
|
|
7
|
+
data.tar.gz: 939620c1056efc1b1f843dc348c5420ea811c87987a5149565b8049ed488689f4b224c28c962316b201c58cd33ebdba0cdf85ee42fb7623225561091ce1275a9
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
rvm:
|
|
3
|
-
- 2.
|
|
4
|
-
- 2.1
|
|
5
|
-
- 2.2
|
|
6
|
-
- 2.3.3
|
|
3
|
+
- 2.2.5
|
|
4
|
+
- 2.3.1
|
|
7
5
|
- ruby-head
|
|
8
6
|
gemfile:
|
|
9
|
-
- gemfiles/
|
|
10
|
-
- gemfiles/rails4_1.gemfile
|
|
11
|
-
- gemfiles/rails4_2.gemfile
|
|
7
|
+
- gemfiles/rails5_0.gemfile
|
|
12
8
|
before_script:
|
|
13
9
|
- bundle exec rake turntable:db:reset
|
|
14
10
|
script: bundle exec rake spec
|
data/CHANGELOG.md
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
## activerecord-turntable
|
|
1
|
+
## activerecord-turntable 3.0.0.alpha (unreleased) ##
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
## activerecord-turntable 2.4.0 ##
|
|
8
|
-
|
|
9
|
-
### Incompatible Change
|
|
10
|
-
|
|
11
|
-
* Drop support for ruby 1.9.3
|
|
12
|
-
|
|
13
|
-
### Bugfix
|
|
3
|
+
* Rails5 compatibility
|
|
4
|
+
* Minimum ruby requirement version is `2.2.2`
|
|
5
|
+
* Rails 4.x support has been dropped.
|
|
14
6
|
|
|
15
|
-
* Update activerecord 4.2 patches
|
|
16
|
-
* Fixes optimistic locking with a serialized column causes JSON::Error.
|
|
17
7
|
|
|
18
8
|
## activerecord-turntable 2.3.3 ##
|
|
19
9
|
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# A sample Guardfile
|
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
|
3
3
|
|
|
4
|
-
guard
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
guard "rspec",
|
|
5
|
+
cmd: "bundle exec rspec",
|
|
6
|
+
all_after_pass: true,
|
|
7
|
+
all_on_start: true do
|
|
8
|
+
watch(%r{^spec/.+_spec\.rb$})
|
|
9
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
10
|
+
watch("spec/spec_helper.rb") { "spec" }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
guard :rubocop do
|
|
14
|
+
watch(%r{.+\.rb$})
|
|
15
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
|
11
16
|
end
|
data/README.md
CHANGED
|
@@ -9,9 +9,12 @@ ActiveRecord::Turntable is a database sharding extension for ActiveRecord.
|
|
|
9
9
|
|
|
10
10
|
## Dependencies
|
|
11
11
|
|
|
12
|
-
activerecord(>=
|
|
12
|
+
activerecord(>=5.0.0, <6.0)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
If you are using with older activerecord versions, use following versions.
|
|
15
|
+
|
|
16
|
+
* activerecord 3.x - use activerecord-turntable version 1.x.
|
|
17
|
+
* activerecord 4.x - use activerecord-turntable version 2.x.
|
|
15
18
|
|
|
16
19
|
## Supported Database
|
|
17
20
|
|
|
@@ -22,7 +25,7 @@ Currently supports mysql only.
|
|
|
22
25
|
Add to Gemfile:
|
|
23
26
|
|
|
24
27
|
```ruby
|
|
25
|
-
gem 'activerecord-turntable', '~>
|
|
28
|
+
gem 'activerecord-turntable', '~> 3.0.0.alpha1'
|
|
26
29
|
```
|
|
27
30
|
|
|
28
31
|
Run a bundle install:
|
|
@@ -136,7 +139,7 @@ Edit turntable.yml and database.yml. See below example config.
|
|
|
136
139
|
database: sample_app_user3_development
|
|
137
140
|
```
|
|
138
141
|
|
|
139
|
-
### Example Migration
|
|
142
|
+
### Example Migration
|
|
140
143
|
|
|
141
144
|
Generate a model:
|
|
142
145
|
|
|
@@ -282,7 +285,7 @@ First, add configuration to turntable.yml and database.yml
|
|
|
282
285
|
seq:
|
|
283
286
|
user_seq: # <-- sequencer name
|
|
284
287
|
seq_type: mysql # <-- sequencer type
|
|
285
|
-
connection: user_seq_1 # <-- sequencer database connection
|
|
288
|
+
connection: user_seq_1 # <-- sequencer database connection
|
|
286
289
|
```
|
|
287
290
|
|
|
288
291
|
Add below to the migration:
|
|
@@ -369,8 +372,8 @@ end
|
|
|
369
372
|
transaction helper to execute transaction to all shards in the cluster:
|
|
370
373
|
|
|
371
374
|
```ruby
|
|
372
|
-
User.user_cluster_transaction do
|
|
373
|
-
# Transaction is opened all shards in "user_cluster"
|
|
375
|
+
User.user_cluster_transaction do
|
|
376
|
+
# Transaction is opened all shards in "user_cluster"
|
|
374
377
|
end
|
|
375
378
|
```
|
|
376
379
|
|
|
@@ -432,23 +435,12 @@ Use with_all method:
|
|
|
432
435
|
end
|
|
433
436
|
```
|
|
434
437
|
|
|
435
|
-
### Connection Management
|
|
436
|
-
|
|
437
|
-
Rails's ConnectionManagement middleware keeps ActiveRecord's connection during the process is alive, but Turntable keeps more connections.
|
|
438
|
-
This may cause flooding max connections on your database. So, we made a middleware that disconnects on each request.
|
|
439
|
-
|
|
440
|
-
if you use turntable's ConnectionManagement middleware, add below line to your initializer.
|
|
441
|
-
|
|
442
|
-
```ruby
|
|
443
|
-
app.middleware.swap ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::Turntable::Rack::ConnectionManagement
|
|
444
|
-
```
|
|
445
|
-
|
|
446
438
|
### Performance Exception
|
|
447
439
|
|
|
448
440
|
To notice queries causing performance problem, Turntable has follow options.
|
|
449
441
|
|
|
450
442
|
* raise\_on\_not\_specified\_shard\_query - raises on queries execute on all shards
|
|
451
|
-
* raise\_on\_not\_specified\_shard\_update - raises on updates executed on all shards
|
|
443
|
+
* raise\_on\_not\_specified\_shard\_update - raises on updates executed on all shards
|
|
452
444
|
|
|
453
445
|
|
|
454
446
|
Add to turntable.yml:
|
data/Rakefile
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
require "bundler/gem_tasks"
|
|
2
|
-
require
|
|
2
|
+
require "rubygems"
|
|
3
3
|
|
|
4
|
-
require
|
|
5
|
-
require
|
|
4
|
+
require "rspec/core"
|
|
5
|
+
require "rspec/core/rake_task"
|
|
6
6
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
7
|
-
spec.pattern = FileList[
|
|
7
|
+
spec.pattern = FileList["spec/**/*_spec.rb"]
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
require
|
|
10
|
+
require "active_record"
|
|
11
11
|
require "active_record/turntable/active_record_ext/database_tasks"
|
|
12
12
|
|
|
13
13
|
namespace :turntable do
|
|
14
14
|
namespace :db do
|
|
15
15
|
task :rails_env do
|
|
16
16
|
unless defined? RAILS_ENV
|
|
17
|
-
RAILS_ENV = ENV[
|
|
17
|
+
RAILS_ENV = ENV["RAILS_ENV"] ||= "test"
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
task :load_config => :rails_env do
|
|
22
|
-
yaml_file = File.join(File.dirname(__FILE__),
|
|
22
|
+
yaml_file = File.join(File.dirname(__FILE__), "spec/config/database.yml")
|
|
23
23
|
ActiveRecord::Base.configurations = YAML.load ERB.new(IO.read(yaml_file)).result
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -38,12 +38,12 @@ namespace :turntable do
|
|
|
38
38
|
desc "migrate turntable test tables"
|
|
39
39
|
task :migrate => :load_config do
|
|
40
40
|
ActiveRecord::Base.establish_connection RAILS_ENV.to_sym
|
|
41
|
-
require
|
|
42
|
-
ActiveRecord::Base.
|
|
43
|
-
ActiveRecord::ConnectionAdapters::SchemaStatements.
|
|
41
|
+
require "active_record/turntable"
|
|
42
|
+
ActiveRecord::Base.include(ActiveRecord::Turntable)
|
|
43
|
+
ActiveRecord::ConnectionAdapters::SchemaStatements.include(ActiveRecord::Turntable::Migration::SchemaStatementsExt)
|
|
44
44
|
|
|
45
45
|
configurations = [ActiveRecord::Base.configurations[RAILS_ENV]]
|
|
46
|
-
configurations += ActiveRecord::Tasks::DatabaseTasks.current_turntable_cluster_configurations(RAILS_ENV).map {|v| v[1]}.flatten.uniq
|
|
46
|
+
configurations += ActiveRecord::Tasks::DatabaseTasks.current_turntable_cluster_configurations(RAILS_ENV).map { |v| v[1] }.flatten.uniq
|
|
47
47
|
|
|
48
48
|
configurations.each do |configuration|
|
|
49
49
|
ActiveRecord::Base.establish_connection configuration
|
|
@@ -62,7 +62,6 @@ namespace :turntable do
|
|
|
62
62
|
t.belongs_to :user, :null => false
|
|
63
63
|
t.integer :hp, :null => false, :default => 0
|
|
64
64
|
t.integer :mp, :null => false, :default => 0
|
|
65
|
-
t.text :data
|
|
66
65
|
t.integer :lock_version, :null => false, :default => 0
|
|
67
66
|
t.datetime :deleted_at, :default => nil
|
|
68
67
|
t.timestamps
|
|
@@ -101,15 +100,15 @@ namespace :turntable do
|
|
|
101
100
|
|
|
102
101
|
ActiveRecord::Base.connection.create_table :cards_users_histories do |t|
|
|
103
102
|
t.belongs_to :cards_user, :null => false
|
|
104
|
-
t.belongs_to :user,
|
|
103
|
+
t.belongs_to :user, :null => false
|
|
105
104
|
t.timestamps
|
|
106
105
|
end
|
|
107
106
|
ActiveRecord::Base.connection.create_sequence_for :cards_users_histories
|
|
108
107
|
|
|
109
108
|
ActiveRecord::Base.connection.create_table :events_users_histories do |t|
|
|
110
|
-
t.belongs_to :events_user,
|
|
109
|
+
t.belongs_to :events_user, :null => false
|
|
111
110
|
t.belongs_to :cards_user, :null => false
|
|
112
|
-
t.belongs_to :user,
|
|
111
|
+
t.belongs_to :user, :null => false
|
|
113
112
|
t.timestamps
|
|
114
113
|
end
|
|
115
114
|
ActiveRecord::Base.connection.create_sequence_for :events_users_histories
|
|
@@ -1,56 +1,53 @@
|
|
|
1
|
-
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
require "active_record/turntable/version"
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |spec|
|
|
5
5
|
spec.name = "activerecord-turntable"
|
|
6
6
|
spec.version = ActiveRecord::Turntable::VERSION
|
|
7
|
-
spec.authors =
|
|
7
|
+
spec.authors = %w(gussan sue445)
|
|
8
8
|
spec.homepage = "https://github.com/drecom/activerecord-turntable"
|
|
9
|
-
spec.summary =
|
|
10
|
-
spec.description =
|
|
9
|
+
spec.summary = "ActiveRecord sharding extension"
|
|
10
|
+
spec.description = "ActiveRecord sharding extension"
|
|
11
11
|
spec.license = "MIT"
|
|
12
12
|
|
|
13
13
|
spec.rubyforge_project = "activerecord-turntable"
|
|
14
14
|
spec.extra_rdoc_files = [
|
|
15
15
|
"LICENSE.txt",
|
|
16
16
|
"README.md",
|
|
17
|
-
"CHANGELOG.md"
|
|
17
|
+
"CHANGELOG.md",
|
|
18
18
|
]
|
|
19
19
|
|
|
20
|
-
spec.files = `git ls-files`.split(
|
|
20
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
|
21
21
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
22
22
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
23
23
|
spec.require_paths = ["lib"]
|
|
24
|
-
spec.required_ruby_version =
|
|
24
|
+
spec.required_ruby_version = ">= 2.2.2"
|
|
25
25
|
|
|
26
|
-
spec.add_runtime_dependency "activerecord", ">=
|
|
27
|
-
spec.add_runtime_dependency "activesupport", ">=
|
|
28
|
-
spec.add_runtime_dependency "sql_tree", "= 0.2.0"
|
|
26
|
+
spec.add_runtime_dependency "activerecord", ">= 5.0", "< 6.0"
|
|
27
|
+
spec.add_runtime_dependency "activesupport", ">= 5.0", "< 6.0"
|
|
29
28
|
spec.add_runtime_dependency "bsearch", "~> 1.5"
|
|
30
29
|
spec.add_runtime_dependency "httpclient", ">= 0"
|
|
30
|
+
spec.add_runtime_dependency "sql_tree", "= 0.2.0"
|
|
31
31
|
|
|
32
32
|
# optional dependencies
|
|
33
33
|
spec.add_development_dependency "activerecord-import"
|
|
34
34
|
spec.add_development_dependency "barrage"
|
|
35
|
+
spec.add_development_dependency "coveralls"
|
|
36
|
+
spec.add_development_dependency "fabrication"
|
|
37
|
+
spec.add_development_dependency "faker"
|
|
38
|
+
spec.add_development_dependency "guard-rspec"
|
|
39
|
+
spec.add_development_dependency "guard-rubocop"
|
|
35
40
|
spec.add_development_dependency "mysql2"
|
|
36
|
-
|
|
41
|
+
spec.add_development_dependency "onkcop"
|
|
42
|
+
spec.add_development_dependency "pry"
|
|
43
|
+
spec.add_development_dependency "pry-byebug"
|
|
44
|
+
spec.add_development_dependency "rack"
|
|
37
45
|
spec.add_development_dependency "rake"
|
|
38
|
-
spec.add_development_dependency "
|
|
39
|
-
spec.add_development_dependency "rspec", "~> 3.5.0"
|
|
40
|
-
spec.add_development_dependency "rspec-its"
|
|
46
|
+
spec.add_development_dependency "rspec", "~> 3.1.0"
|
|
41
47
|
spec.add_development_dependency "rspec-collection_matchers"
|
|
42
|
-
spec.add_development_dependency "
|
|
43
|
-
spec.add_development_dependency "
|
|
48
|
+
spec.add_development_dependency "rspec-its"
|
|
49
|
+
spec.add_development_dependency "rubocop"
|
|
50
|
+
spec.add_development_dependency "rubocop-rspec"
|
|
51
|
+
spec.add_development_dependency "timecop"
|
|
44
52
|
spec.add_development_dependency "webmock"
|
|
45
|
-
spec.add_development_dependency "pry"
|
|
46
|
-
if RUBY_VERSION > "2.0"
|
|
47
|
-
spec.add_development_dependency "pry-byebug"
|
|
48
|
-
end
|
|
49
|
-
spec.add_development_dependency "guard-rspec"
|
|
50
|
-
spec.add_development_dependency "listen", "= 3.0.6"
|
|
51
|
-
spec.add_development_dependency "coveralls"
|
|
52
|
-
|
|
53
|
-
if RUBY_PLATFORM =~ /darwin/
|
|
54
|
-
spec.add_development_dependency "growl"
|
|
55
|
-
end
|
|
56
53
|
end
|
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
module ActiveRecord::Turntable
|
|
2
2
|
module ActiveRecordExt
|
|
3
3
|
module AbstractAdapter
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
protected
|
|
8
|
-
|
|
9
|
-
# @note override for logging current shard name
|
|
10
|
-
def log(sql, name = "SQL", binds = [], statement_name = nil)
|
|
11
|
-
@instrumenter.instrument(
|
|
12
|
-
"sql.active_record",
|
|
13
|
-
:sql => sql,
|
|
14
|
-
:name => name,
|
|
15
|
-
:connection_id => object_id,
|
|
16
|
-
:statement_name => statement_name,
|
|
17
|
-
:binds => binds,
|
|
18
|
-
:turntable_shard_name => turntable_shard_name) { yield }
|
|
19
|
-
rescue Exception => e
|
|
4
|
+
def translate_exception_class(e, sql)
|
|
5
|
+
begin
|
|
20
6
|
message = "#{e.class.name}: #{e.message}: #{sql} : #{turntable_shard_name}"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
exception.set_backtrace e.backtrace
|
|
24
|
-
raise exception
|
|
7
|
+
rescue Encoding::CompatibilityError
|
|
8
|
+
message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql} : #{turntable_shard_name}"
|
|
25
9
|
end
|
|
10
|
+
|
|
11
|
+
exception = translate_exception(e, message)
|
|
12
|
+
exception.set_backtrace e.backtrace
|
|
13
|
+
exception
|
|
26
14
|
end
|
|
27
15
|
|
|
16
|
+
# @note override for append current shard name
|
|
17
|
+
def log(sql, name = "SQL", binds = [], statement_name = nil)
|
|
18
|
+
@instrumenter.instrument(
|
|
19
|
+
"sql.active_record",
|
|
20
|
+
:sql => sql,
|
|
21
|
+
:name => name,
|
|
22
|
+
:connection_id => object_id,
|
|
23
|
+
:statement_name => statement_name,
|
|
24
|
+
:binds => binds,
|
|
25
|
+
:turntable_shard_name => turntable_shard_name) { yield }
|
|
26
|
+
rescue => e
|
|
27
|
+
raise translate_exception_class(e, sql)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected :translate_exception_class, :log
|
|
31
|
+
|
|
28
32
|
def turntable_shard_name=(name)
|
|
29
33
|
@turntable_shard_name = name.to_s
|
|
30
34
|
end
|
|
@@ -2,20 +2,12 @@ module ActiveRecord::Turntable
|
|
|
2
2
|
module ActiveRecordExt
|
|
3
3
|
# activerecord-import extension
|
|
4
4
|
module ActiverecordImportExt
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
|
|
7
|
-
included do
|
|
8
|
-
alias_method_chain :values_sql_for_columns_and_attributes, :turntable
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
5
|
# @note override for sequencer injection
|
|
14
6
|
# @see https://github.com/zdennis/activerecord-import/blob/ba909fed5a4785fe9c7cce89e48e1242bb6804ea/lib/activerecord-import/import.rb#L558-L581
|
|
15
|
-
def
|
|
7
|
+
private def values_sql_for_columns_and_attributes(columns, array_of_attributes)
|
|
16
8
|
connection_memo = connection
|
|
17
9
|
array_of_attributes.map do |arr|
|
|
18
|
-
my_values = arr.each_with_index.map do |val,j|
|
|
10
|
+
my_values = arr.each_with_index.map do |val, j|
|
|
19
11
|
column = columns[j]
|
|
20
12
|
|
|
21
13
|
# be sure to query sequence_name *last*, only if cheaper tests fail, because it's costly
|
|
@@ -28,10 +20,8 @@ module ActiveRecord::Turntable
|
|
|
28
20
|
elsif column
|
|
29
21
|
if respond_to?(:type_caster) && type_caster.respond_to?(:type_cast_for_database) # Rails 5.0 and higher
|
|
30
22
|
connection_memo.quote(type_caster.type_cast_for_database(column.name, val))
|
|
31
|
-
|
|
23
|
+
else # Rails 4.2 and higher
|
|
32
24
|
connection_memo.quote(column.type_cast_from_user(val), column)
|
|
33
|
-
else # Rails 3.1, 3.2, and 4.1
|
|
34
|
-
connection_memo.quote(column.type_cast(val), column)
|
|
35
25
|
end
|
|
36
26
|
end
|
|
37
27
|
end
|
|
@@ -41,9 +31,9 @@ module ActiveRecord::Turntable
|
|
|
41
31
|
end
|
|
42
32
|
|
|
43
33
|
begin
|
|
44
|
-
require
|
|
45
|
-
require
|
|
46
|
-
(class << ActiveRecord::Base; self; end).
|
|
34
|
+
require "activerecord-import"
|
|
35
|
+
require "activerecord-import/base"
|
|
36
|
+
(class << ActiveRecord::Base; self; end).prepend(ActiverecordImportExt)
|
|
47
37
|
rescue LoadError
|
|
48
38
|
end
|
|
49
39
|
end
|
|
@@ -1,22 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def move_with_turntable(config, where, merge_options={})
|
|
8
|
-
if [config[:to], config[:from]].all? { |k| k.try(:turntable_enabled?) }
|
|
9
|
-
current_shard = config[:from].connection.current_shard.name.to_sym
|
|
10
|
-
config[:to].connection.with_shard(current_shard) {
|
|
11
|
-
move_without_turntable(config, where, merge_options)
|
|
12
|
-
}
|
|
13
|
-
else
|
|
14
|
-
move_without_turntable(config, where, merge_options)
|
|
1
|
+
module ActiveRecord::Turntable
|
|
2
|
+
module ActiveRecordExt
|
|
3
|
+
module ActsAsArchiveExt
|
|
4
|
+
def self.prepended(base)
|
|
5
|
+
class << base
|
|
6
|
+
prepend ClassMethods
|
|
15
7
|
end
|
|
16
8
|
end
|
|
17
9
|
|
|
18
|
-
|
|
10
|
+
module ClassMethods
|
|
11
|
+
# @note use the same shard which `from` shard using
|
|
12
|
+
def move(config, where, merge_options = {})
|
|
13
|
+
if [config[:to], config[:from]].all? { |k| k.try(:turntable_enabled?) }
|
|
14
|
+
current_shard = config[:from].connection.current_shard.name.to_sym
|
|
15
|
+
config[:to].connection.with_shard(current_shard) {
|
|
16
|
+
super
|
|
17
|
+
}
|
|
18
|
+
else
|
|
19
|
+
super
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
require 'acts_as_archive'
|
|
27
|
+
ActsAsArchive.prepend ActsAsArchiveExt
|
|
28
|
+
rescue LoadError
|
|
19
29
|
end
|
|
20
30
|
end
|
|
21
|
-
rescue LoadError
|
|
22
31
|
end
|
|
@@ -3,29 +3,48 @@ require "active_record/associations"
|
|
|
3
3
|
module ActiveRecord::Turntable
|
|
4
4
|
module ActiveRecordExt
|
|
5
5
|
module Association
|
|
6
|
+
extend ActiveSupport::Concern
|
|
6
7
|
include ShardingCondition
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
ActiveRecord::Associations::
|
|
9
|
+
included do
|
|
10
|
+
ActiveRecord::Associations::SingularAssociation.prepend(SingularAssociationExt)
|
|
11
|
+
ActiveRecord::Associations::CollectionAssociation.prepend(CollectionAssociationExt)
|
|
12
|
+
ActiveRecord::Associations::Builder::Association::VALID_OPTIONS << :foreign_shard_key
|
|
10
13
|
end
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
# @note Inject to add sharding condition for singular association
|
|
16
|
+
module SingularAssociationExt
|
|
17
|
+
private
|
|
18
|
+
def get_records
|
|
19
|
+
# OPTIMIZE: statement caching
|
|
20
|
+
if should_use_shard_key?
|
|
21
|
+
return turntable_scope(scope).limit(1).records
|
|
22
|
+
end
|
|
13
23
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
end
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
# @note Inject to add sharding condition for collection association
|
|
29
|
+
module CollectionAssociationExt
|
|
30
|
+
private
|
|
31
|
+
def get_records
|
|
32
|
+
# OPTIMIZE: statement caching
|
|
33
|
+
if should_use_shard_key?
|
|
34
|
+
return turntable_scope(scope).to_a
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
super
|
|
38
|
+
end
|
|
39
|
+
end
|
|
24
40
|
|
|
25
41
|
private
|
|
26
42
|
|
|
27
|
-
def
|
|
28
|
-
|
|
43
|
+
def turntable_scope(scope, bind = nil)
|
|
44
|
+
if should_use_shard_key?
|
|
45
|
+
scope = scope.where(klass.turntable_shard_key => owner.send(foreign_shard_key))
|
|
46
|
+
end
|
|
47
|
+
scope
|
|
29
48
|
end
|
|
30
49
|
end
|
|
31
50
|
end
|
|
@@ -1,38 +1,18 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "active_record/associations/preloader/association"
|
|
2
2
|
|
|
3
3
|
module ActiveRecord::Turntable
|
|
4
4
|
module ActiveRecordExt
|
|
5
5
|
module AssociationPreloader
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
included do
|
|
9
|
-
alias_method_chain :records_for, :turntable
|
|
10
|
-
end
|
|
6
|
+
include ShardingCondition
|
|
11
7
|
|
|
12
8
|
# @note Override to add sharding condition on preload
|
|
13
|
-
def
|
|
14
|
-
returning_scope =
|
|
9
|
+
def records_for(ids)
|
|
10
|
+
returning_scope = super
|
|
15
11
|
if should_use_shard_key?
|
|
16
12
|
returning_scope = returning_scope.where(klass.turntable_shard_key => owners.map(&foreign_shard_key.to_sym).uniq)
|
|
17
13
|
end
|
|
18
14
|
returning_scope
|
|
19
15
|
end
|
|
20
|
-
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
def foreign_shard_key
|
|
24
|
-
options[:foreign_shard_key] || model.turntable_shard_key
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def should_use_shard_key?
|
|
28
|
-
sharded_by_same_key? || !!options[:foreign_shard_key]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def sharded_by_same_key?
|
|
32
|
-
model.turntable_enabled? &&
|
|
33
|
-
klass.turntable_enabled? &&
|
|
34
|
-
model.turntable_shard_key == klass.turntable_shard_key
|
|
35
|
-
end
|
|
36
16
|
end
|
|
37
17
|
end
|
|
38
18
|
end
|
|
@@ -5,7 +5,7 @@ module ActiveRecord::Turntable
|
|
|
5
5
|
|
|
6
6
|
included do
|
|
7
7
|
class << ActiveRecord::Base
|
|
8
|
-
delegate :clever_load!, :
|
|
8
|
+
delegate :clever_load!, to: :all
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ module ActiveRecord::Turntable
|
|
|
13
13
|
# load records
|
|
14
14
|
records = self.to_a
|
|
15
15
|
klass = records.first.class
|
|
16
|
-
association_key =
|
|
16
|
+
association_key = association_name.to_s
|
|
17
17
|
reflection = klass.reflections[association_key]
|
|
18
18
|
|
|
19
19
|
if reflection
|
|
@@ -1,31 +1,27 @@
|
|
|
1
1
|
module ActiveRecord::Turntable
|
|
2
2
|
module ActiveRecordExt
|
|
3
3
|
module ConnectionHandlerExtension
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
alias_method_chain :pool_for, :turntable
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
private
|
|
11
|
-
|
|
12
4
|
# @note Override not to establish_connection destroy existing connection pool proxy object
|
|
13
|
-
def
|
|
14
|
-
owner_to_pool.fetch(
|
|
15
|
-
if
|
|
5
|
+
def retrieve_connection_pool(spec_name)
|
|
6
|
+
owner_to_pool.fetch(spec_name) do
|
|
7
|
+
# Check if a connection was previously established in an ancestor process,
|
|
8
|
+
# which may have been forked.
|
|
9
|
+
if ancestor_pool = pool_from_any_process_for(spec_name)
|
|
16
10
|
if ancestor_pool.is_a?(ActiveRecord::ConnectionAdapters::ConnectionPool)
|
|
17
11
|
# A connection was established in an ancestor process that must have
|
|
18
12
|
# subsequently forked. We can't reuse the connection, but we can copy
|
|
19
13
|
# the specification and establish a new connection with it.
|
|
20
|
-
establish_connection
|
|
14
|
+
establish_connection(ancestor_pool.spec).tap do |pool|
|
|
15
|
+
pool.schema_cache = ancestor_pool.schema_cache if ancestor_pool.schema_cache
|
|
16
|
+
end
|
|
21
17
|
else
|
|
22
18
|
# Use same PoolProxy object
|
|
23
|
-
owner_to_pool[
|
|
19
|
+
owner_to_pool[spec_name] = ancestor_pool
|
|
24
20
|
end
|
|
25
21
|
else
|
|
26
|
-
owner_to_pool[
|
|
22
|
+
owner_to_pool[spec_name] = nil
|
|
27
23
|
end
|
|
28
|
-
|
|
24
|
+
end
|
|
29
25
|
end
|
|
30
26
|
end
|
|
31
27
|
end
|