active_record_shards 2.8.0 → 3.0.0.beta1
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.
- data/lib/active_record_shards/arel_engine.rb +13 -0
- data/lib/active_record_shards/connection_handler.rb +11 -0
- data/lib/active_record_shards/connection_pool.rb +27 -50
- data/lib/active_record_shards/connection_specification.rb +7 -3
- data/lib/active_record_shards/connection_switcher.rb +14 -4
- data/lib/active_record_shards/default_slave_patches.rb +46 -35
- data/lib/active_record_shards.rb +25 -4
- data/test/connection_switching_test.rb +16 -22
- data/test/models.rb +0 -2
- data/test/schema.rb +0 -5
- metadata +12 -15
@@ -0,0 +1,13 @@
|
|
1
|
+
if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0
|
2
|
+
class ActiveRecord::Base
|
3
|
+
def self.arel_engine
|
4
|
+
@arel_engine ||= begin
|
5
|
+
if self == ActiveRecord::Base
|
6
|
+
Arel::Table.engine
|
7
|
+
else
|
8
|
+
connection_handler.connection_pools[connection_pool_name] ? self : superclass.arel_engine
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
ActiveRecord::ConnectionAdapters::ConnectionHandler.class_eval do
|
2
|
+
if ActiveRecord::VERSION::MAJOR >= 4
|
3
|
+
def retrieve_connection_pool(klass)
|
4
|
+
class_to_pool[klass.connection_pool_name] ||= pool_for(klass)
|
5
|
+
end
|
6
|
+
else
|
7
|
+
def retrieve_connection_pool(klass)
|
8
|
+
(@class_to_pool || @connection_pools)[klass.connection_pool_name]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,55 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# instead of klass.name as the pool key
|
4
|
-
def retrieve_connection_pool(klass)
|
5
|
-
pool = (@class_to_pool || @connection_pools)[klass.connection_pool_name]
|
6
|
-
return pool if pool
|
7
|
-
return nil if ActiveRecord::Base == klass
|
8
|
-
retrieve_connection_pool klass.superclass
|
9
|
-
end
|
10
|
-
|
11
|
-
def remove_connection(klass)
|
12
|
-
# rails 2: @connection_pools is a hash of klass.name => pool
|
13
|
-
# rails 3: @connection_pools is a hash of pool.spec => pool
|
14
|
-
# @class_to_pool is a hash of klass.name => pool
|
15
|
-
#
|
16
|
-
if @class_to_pool
|
17
|
-
pool = @class_to_pool.delete(klass.connection_pool_name)
|
18
|
-
@connection_pools.delete(pool.spec) if pool
|
19
|
-
else
|
20
|
-
pool = @connection_pools.delete(klass.connection_pool_name)
|
21
|
-
@connection_pools.delete_if { |key, value| value == pool }
|
22
|
-
end
|
23
|
-
|
24
|
-
return nil unless pool
|
25
|
-
|
26
|
-
pool.disconnect! if pool
|
27
|
-
pool.spec.config if pool
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
ActiveRecord::Base.singleton_class.class_eval do
|
32
|
-
def establish_connection_with_connection_pool_name(spec = nil)
|
33
|
-
case spec
|
34
|
-
when ActiveRecord::Base::ConnectionSpecification
|
35
|
-
connection_handler.establish_connection(connection_pool_name, spec)
|
36
|
-
else
|
37
|
-
establish_connection_without_connection_pool_name(spec)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
alias_method_chain :establish_connection, :connection_pool_name
|
41
|
-
end
|
1
|
+
module ActiveRecordShards
|
2
|
+
ConnectionPoolNameDecorator = Struct.new(:name)
|
42
3
|
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
4
|
+
# It overrides given connection handler methods (they differ depend on
|
5
|
+
# Rails version).
|
6
|
+
#
|
7
|
+
# It takes the first argument, ActiveRecord::Base object or
|
8
|
+
# String (connection_pool_name), converts it in Struct object and
|
9
|
+
# passes to the original method.
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
# methods_to_override = [:establish_connection, :remove_connection]
|
13
|
+
# ActiveRecordShards.override_connection_handler_methods(methods_to_override)
|
14
|
+
#
|
15
|
+
def self.override_connection_handler_methods(method_names)
|
16
|
+
method_names.each do |method_name|
|
17
|
+
ActiveRecord::ConnectionAdapters::ConnectionHandler.class_eval do
|
18
|
+
define_method("#{method_name}_with_connection_pool_name") do |*args|
|
19
|
+
unless args[0].is_a? ConnectionPoolNameDecorator
|
20
|
+
name = if args[0].is_a? String
|
21
|
+
args[0]
|
22
|
+
else
|
23
|
+
args[0].connection_pool_name
|
24
|
+
end
|
25
|
+
args[0] = ConnectionPoolNameDecorator.new(name)
|
26
|
+
end
|
27
|
+
send("#{method_name}_without_connection_pool_name", *args)
|
52
28
|
end
|
29
|
+
alias_method_chain method_name, :connection_pool_name
|
53
30
|
end
|
54
31
|
end
|
55
32
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
class ActiveRecord::Base
|
2
|
-
|
3
2
|
def self.establish_connection(spec = ENV["DATABASE_URL"])
|
4
|
-
resolver = ConnectionSpecification::Resolver.new spec, configurations
|
3
|
+
resolver = ActiveRecordShards::ConnectionSpecification::Resolver.new spec, configurations
|
5
4
|
spec = resolver.spec
|
6
5
|
|
7
6
|
unless respond_to?(spec.adapter_method)
|
@@ -10,6 +9,11 @@ class ActiveRecord::Base
|
|
10
9
|
|
11
10
|
remove_connection
|
12
11
|
specification_cache[connection_pool_name] = spec
|
13
|
-
|
12
|
+
|
13
|
+
if ActiveRecord::VERSION::STRING >= "4.0.0"
|
14
|
+
connection_handler.establish_connection self, spec
|
15
|
+
else
|
16
|
+
connection_handler.establish_connection connection_pool_name, spec
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
@@ -95,7 +95,11 @@ module ActiveRecordShards
|
|
95
95
|
if self == ActiveRecord::Base || !switch_to_slave || options[:construct_ro_scope] == false
|
96
96
|
yield
|
97
97
|
else
|
98
|
-
|
98
|
+
if ActiveRecord::VERSION::MAJOR == 2
|
99
|
+
with_scope({:find => {:readonly => true}}, &block)
|
100
|
+
else
|
101
|
+
readonly.scoping(&block)
|
102
|
+
end
|
99
103
|
end
|
100
104
|
ensure
|
101
105
|
@disallow_slave -= 1 if which == :master
|
@@ -174,11 +178,11 @@ module ActiveRecordShards
|
|
174
178
|
# connection adapter ourselves.
|
175
179
|
specification_cache[name] ||= begin
|
176
180
|
if ActiveRecord::VERSION::STRING >= "3.2.0"
|
177
|
-
resolver =
|
181
|
+
resolver = ActiveRecordShards::ConnectionSpecification::Resolver.new spec, configurations
|
178
182
|
resolver.spec
|
179
183
|
else
|
180
184
|
autoload_adapter(spec['adapter'])
|
181
|
-
|
185
|
+
ActiveRecordShards::ConnectionSpecification.new(spec, "#{spec['adapter']}_connection")
|
182
186
|
end
|
183
187
|
end
|
184
188
|
|
@@ -198,7 +202,13 @@ module ActiveRecordShards
|
|
198
202
|
end
|
199
203
|
|
200
204
|
def connected_to_shard?
|
201
|
-
|
205
|
+
if ActiveRecord::VERSION::MAJOR == 4
|
206
|
+
specs_to_pools = Hash[connection_handler.connection_pool_list.map { |pool| [pool.spec, pool] }]
|
207
|
+
else
|
208
|
+
specs_to_pools = connection_handler.connection_pools
|
209
|
+
end
|
210
|
+
|
211
|
+
specs_to_pools.has_key?(connection_pool_key)
|
202
212
|
end
|
203
213
|
|
204
214
|
def columns_with_default_shard
|
@@ -1,32 +1,23 @@
|
|
1
1
|
module ActiveRecordShards
|
2
2
|
module DefaultSlavePatches
|
3
|
-
|
3
|
+
CLASS_SLAVE_METHODS = [ :find_by_sql, :count_by_sql, :calculate, :find_one, :find_some, :find_every, :quote_value, :sanitize_sql_hash_for_conditions, :exists? ]
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def #{method}_with_default_slave#{punctuation}(*args, &block)
|
16
|
-
on_slave_unless_tx do
|
17
|
-
#{method}_without_default_slave#{punctuation}(*args, &block)
|
5
|
+
def self.extended(base)
|
6
|
+
base_methods = (base.methods | base.private_methods).map(&:to_sym)
|
7
|
+
(CLASS_SLAVE_METHODS & base_methods).each do |slave_method|
|
8
|
+
_, slave_method, punctuation = slave_method.to_s.match(/^(.*?)([\?\!]?)$/).to_a
|
9
|
+
base.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
10
|
+
class << self
|
11
|
+
def #{slave_method}_with_default_slave#{punctuation}(*args, &block)
|
12
|
+
on_slave_unless_tx do
|
13
|
+
#{slave_method}_without_default_slave#{punctuation}(*args, &block)
|
14
|
+
end
|
18
15
|
end
|
19
|
-
end
|
20
|
-
|
21
|
-
alias_method_chain :#{method}#{punctuation}, :default_slave
|
22
|
-
#{class_method ? "end" : ""}
|
23
|
-
RUBY
|
24
|
-
end
|
25
16
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
alias_method_chain :#{slave_method}#{punctuation}, :default_slave
|
18
|
+
end
|
19
|
+
RUBY
|
20
|
+
end
|
30
21
|
|
31
22
|
base.class_eval do
|
32
23
|
# fix ActiveRecord to do the right thing, and use our aliased quote_value
|
@@ -67,10 +58,33 @@ module ActiveRecordShards
|
|
67
58
|
end
|
68
59
|
|
69
60
|
alias_method_chain :transaction, :slave_off
|
61
|
+
|
62
|
+
|
63
|
+
def table_exists_with_default_slave?(*args)
|
64
|
+
on_slave_unless_tx(*args) { table_exists_without_default_slave?(*args) }
|
65
|
+
end
|
66
|
+
|
67
|
+
alias_method_chain :table_exists?, :default_slave
|
70
68
|
end
|
71
69
|
end
|
72
|
-
|
73
|
-
|
70
|
+
|
71
|
+
|
72
|
+
ActiveRecord::Associations::HasAndBelongsToManyAssociation.class_eval do
|
73
|
+
def construct_sql_with_default_slave(*args, &block)
|
74
|
+
on_slave_unless_tx do
|
75
|
+
construct_sql_without_default_slave(*args, &block)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def construct_find_options_with_default_slave!(*args, &block)
|
80
|
+
on_slave_unless_tx do
|
81
|
+
construct_find_options_without_default_slave!(*args, &block)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
alias_method_chain :construct_sql, :default_slave if respond_to?(:construct_sql)
|
86
|
+
alias_method_chain :construct_find_options!, :default_slave if respond_to?(:construct_find_options!)
|
87
|
+
end
|
74
88
|
end
|
75
89
|
|
76
90
|
def on_slave_unless_tx(&block)
|
@@ -83,23 +97,20 @@ module ActiveRecordShards
|
|
83
97
|
|
84
98
|
module ActiveRelationPatches
|
85
99
|
def self.included(base)
|
86
|
-
|
87
|
-
|
88
|
-
ActiveRecordShards::DefaultSlavePatches.wrap_method_in_on_slave(false, base, :pluck)
|
100
|
+
base.send :alias_method_chain, :calculate, :default_slave
|
101
|
+
base.send :alias_method_chain, :exists?, :default_slave
|
89
102
|
end
|
90
103
|
|
91
104
|
def on_slave_unless_tx
|
92
105
|
@klass.on_slave_unless_tx { yield }
|
93
106
|
end
|
94
|
-
end
|
95
107
|
|
96
|
-
|
97
|
-
|
98
|
-
ActiveRecordShards::DefaultSlavePatches.wrap_method_in_on_slave(false, base, :records_for) rescue nil
|
108
|
+
def calculate_with_default_slave(*args, &block)
|
109
|
+
on_slave_unless_tx { calculate_without_default_slave(*args, &block) }
|
99
110
|
end
|
100
111
|
|
101
|
-
def
|
102
|
-
|
112
|
+
def exists_with_default_slave?(*args, &block)
|
113
|
+
on_slave_unless_tx { exists_without_default_slave?(*args, &block) }
|
103
114
|
end
|
104
115
|
end
|
105
116
|
end
|
data/lib/active_record_shards.rb
CHANGED
@@ -8,11 +8,24 @@ require 'active_record_shards/association_collection_connection_selection'
|
|
8
8
|
require 'active_record_shards/connection_pool'
|
9
9
|
require 'active_record_shards/migration'
|
10
10
|
require 'active_record_shards/default_slave_patches'
|
11
|
+
require 'active_record_shards/arel_engine'
|
12
|
+
require 'active_record_shards/connection_handler'
|
11
13
|
|
12
14
|
if ActiveRecord::VERSION::STRING >= "3.2.0"
|
13
15
|
require 'active_record_shards/connection_specification'
|
14
16
|
end
|
15
17
|
|
18
|
+
if ActiveRecord::VERSION::STRING >= "4.0.0"
|
19
|
+
methods_to_override = [:establish_connection, :remove_connection, :pool_for,
|
20
|
+
:pool_from_any_process_for]
|
21
|
+
ActiveRecordShards::ConnectionSpecification = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
22
|
+
else
|
23
|
+
methods_to_override = [:remove_connection]
|
24
|
+
ActiveRecordShards::ConnectionSpecification = ActiveRecord::Base::ConnectionSpecification
|
25
|
+
end
|
26
|
+
|
27
|
+
ActiveRecordShards.override_connection_handler_methods(methods_to_override)
|
28
|
+
|
16
29
|
ActiveRecord::Base.extend(ActiveRecordShards::ConfigurationParser)
|
17
30
|
ActiveRecord::Base.extend(ActiveRecordShards::Model)
|
18
31
|
ActiveRecord::Base.extend(ActiveRecordShards::ConnectionSwitcher)
|
@@ -22,10 +35,6 @@ if ActiveRecord.const_defined?(:Relation)
|
|
22
35
|
ActiveRecord::Relation.send(:include, ActiveRecordShards::DefaultSlavePatches::ActiveRelationPatches)
|
23
36
|
end
|
24
37
|
|
25
|
-
if ActiveRecord::Associations.const_defined?(:Preloader)
|
26
|
-
ActiveRecord::Associations::Preloader::HasAndBelongsToMany.send(:include, ActiveRecordShards::DefaultSlavePatches::HasAndBelongsToManyPreloaderPatches)
|
27
|
-
end
|
28
|
-
|
29
38
|
if ActiveRecord::VERSION::STRING >= "3.1.0"
|
30
39
|
ActiveRecord::Associations::CollectionProxy.send(:include, ActiveRecordShards::AssociationCollectionConnectionSelection)
|
31
40
|
else
|
@@ -39,3 +48,15 @@ module ActiveRecordShards
|
|
39
48
|
env ||= ENV['RAILS_ENV']
|
40
49
|
end
|
41
50
|
end
|
51
|
+
|
52
|
+
ActiveRecord::Base.singleton_class.class_eval do
|
53
|
+
def establish_connection_with_connection_pool_name(spec = nil)
|
54
|
+
case spec
|
55
|
+
when ActiveRecordShards::ConnectionSpecification
|
56
|
+
connection_handler.establish_connection(connection_pool_name, spec)
|
57
|
+
else
|
58
|
+
establish_connection_without_connection_pool_name(spec)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
alias_method_chain :establish_connection, :connection_pool_name
|
62
|
+
end
|
@@ -233,7 +233,6 @@ describe "connection switching" do
|
|
233
233
|
end
|
234
234
|
|
235
235
|
it "execute the block on all shard masters" do
|
236
|
-
@database_names
|
237
236
|
assert_equal([ActiveRecord::Base.connection.select_value("SELECT DATABASE()")], @database_names)
|
238
237
|
end
|
239
238
|
end
|
@@ -244,7 +243,11 @@ describe "connection switching" do
|
|
244
243
|
|
245
244
|
before do
|
246
245
|
ActiveRecord::Base.configurations.delete('test_slave')
|
247
|
-
ActiveRecord::
|
246
|
+
if ActiveRecord::VERSION::MAJOR == 4
|
247
|
+
ActiveRecord::Base.connection_handler.connection_pool_list.clear
|
248
|
+
else
|
249
|
+
ActiveRecord::Base.connection_handler.connection_pools.clear
|
250
|
+
end
|
248
251
|
ActiveRecord::Base.establish_connection('test')
|
249
252
|
end
|
250
253
|
|
@@ -380,19 +383,13 @@ describe "connection switching" do
|
|
380
383
|
end
|
381
384
|
end
|
382
385
|
|
386
|
+
# TODO: make all this stuff rails 3 compatible.
|
383
387
|
describe "with finds routed to the slave by default" do
|
384
388
|
before do
|
385
389
|
Account.on_slave_by_default = true
|
386
|
-
Person.on_slave_by_default = true
|
387
390
|
Account.connection.execute("INSERT INTO accounts (id, name, created_at, updated_at) VALUES(1000, 'master_name', '2009-12-04 20:18:48', '2009-12-04 20:18:48')")
|
388
391
|
Account.on_slave.connection.execute("INSERT INTO accounts (id, name, created_at, updated_at) VALUES(1000, 'slave_name', '2009-12-04 20:18:48', '2009-12-04 20:18:48')")
|
389
392
|
Account.on_slave.connection.execute("INSERT INTO accounts (id, name, created_at, updated_at) VALUES(1001, 'slave_name2', '2009-12-04 20:18:48', '2009-12-04 20:18:48')")
|
390
|
-
|
391
|
-
Person.connection.execute("REPLACE INTO people(id, name) VALUES(10, 'master person')")
|
392
|
-
Person.on_slave.connection.execute("REPLACE INTO people(id, name) VALUES(20, 'slave person')")
|
393
|
-
|
394
|
-
Account.connection.execute("INSERT INTO account_people(account_id, person_id) VALUES(1000, 10)")
|
395
|
-
Account.on_slave.connection.execute("INSERT INTO account_people(account_id, person_id) VALUES(1001, 20)")
|
396
393
|
end
|
397
394
|
|
398
395
|
it "find() by default on the slave" do
|
@@ -451,21 +448,8 @@ describe "connection switching" do
|
|
451
448
|
assert AccountInherited.on_slave_by_default?
|
452
449
|
end
|
453
450
|
|
454
|
-
it "will :include things via has_and_belongs associations correctly" do
|
455
|
-
a = Account.first(:conditions => "id = 1001", :include => :people)
|
456
|
-
assert a.people.size > 0
|
457
|
-
assert_equal 'slave person', a.people.first.name
|
458
|
-
end
|
459
|
-
|
460
|
-
if ActiveRecord::VERSION::MAJOR >= 3 && ActiveRecord::VERSION::MINOR >= 2
|
461
|
-
it "supports .pluck" do
|
462
|
-
assert_equal ["slave_name", "slave_name2"], Account.pluck(:name)
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
451
|
after do
|
467
452
|
Account.on_slave_by_default = false
|
468
|
-
Person.on_slave_by_default = false
|
469
453
|
end
|
470
454
|
end
|
471
455
|
end
|
@@ -518,4 +502,14 @@ describe "connection switching" do
|
|
518
502
|
assert_using_database('ars_test_alternative', Email)
|
519
503
|
end
|
520
504
|
end
|
505
|
+
|
506
|
+
it "raises an exception if a connection is not found" do
|
507
|
+
ActiveRecord::Base.on_shard(0) do
|
508
|
+
ActiveRecord::Base.connection_handler.remove_connection(Ticket)
|
509
|
+
assert_raises(ActiveRecord::ConnectionNotEstablished) do
|
510
|
+
ActiveRecord::Base.connection_handler.retrieve_connection_pool(Ticket)
|
511
|
+
assert_using_database('ars_test_shard0', Ticket)
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|
521
515
|
end
|
data/test/models.rb
CHANGED
@@ -4,7 +4,6 @@ class Account < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
has_many :tickets
|
6
6
|
has_many :account_things
|
7
|
-
has_and_belongs_to_many :people, :join_table => 'account_people'
|
8
7
|
end
|
9
8
|
|
10
9
|
class AccountThing < ActiveRecord::Base
|
@@ -37,4 +36,3 @@ end
|
|
37
36
|
class User < Person
|
38
37
|
end
|
39
38
|
|
40
|
-
|
data/test/schema.rb
CHANGED
@@ -12,11 +12,6 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
12
12
|
t.boolean "enabled", :default => true
|
13
13
|
end
|
14
14
|
|
15
|
-
create_table "account_people", :force => true, :id => false do |t|
|
16
|
-
t.integer "account_id"
|
17
|
-
t.integer "person_id"
|
18
|
-
end
|
19
|
-
|
20
15
|
create_table "emails", :force => true do |t|
|
21
16
|
t.string "from"
|
22
17
|
t.string "to"
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_shards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0.beta1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Mick Staugaard
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-11-
|
14
|
+
date: 2013-11-06 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activerecord
|
@@ -21,9 +21,9 @@ dependencies:
|
|
21
21
|
- - ! '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 2.3.5
|
24
|
-
- -
|
24
|
+
- - <=
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.1'
|
27
27
|
type: :runtime
|
28
28
|
prerelease: false
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -32,9 +32,9 @@ dependencies:
|
|
32
32
|
- - ! '>='
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 2.3.5
|
35
|
-
- -
|
35
|
+
- - <=
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
37
|
+
version: '4.1'
|
38
38
|
description: Easily run queries on shard and slave databases.
|
39
39
|
email:
|
40
40
|
- mick@staugaard.com
|
@@ -44,8 +44,10 @@ executables: []
|
|
44
44
|
extensions: []
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
|
+
- lib/active_record_shards/arel_engine.rb
|
47
48
|
- lib/active_record_shards/association_collection_connection_selection.rb
|
48
49
|
- lib/active_record_shards/configuration_parser.rb
|
50
|
+
- lib/active_record_shards/connection_handler.rb
|
49
51
|
- lib/active_record_shards/connection_pool.rb
|
50
52
|
- lib/active_record_shards/connection_specification.rb
|
51
53
|
- lib/active_record_shards/connection_switcher.rb
|
@@ -81,18 +83,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
81
83
|
- - ! '>='
|
82
84
|
- !ruby/object:Gem::Version
|
83
85
|
version: '0'
|
84
|
-
segments:
|
85
|
-
- 0
|
86
|
-
hash: -479183148352030802
|
87
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
87
|
none: false
|
89
88
|
requirements:
|
90
|
-
- - ! '
|
89
|
+
- - ! '>'
|
91
90
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
93
|
-
segments:
|
94
|
-
- 0
|
95
|
-
hash: -479183148352030802
|
91
|
+
version: 1.3.1
|
96
92
|
requirements: []
|
97
93
|
rubyforge_project:
|
98
94
|
rubygems_version: 1.8.25
|
@@ -112,3 +108,4 @@ test_files:
|
|
112
108
|
- test/migrator_test.rb
|
113
109
|
- test/models.rb
|
114
110
|
- test/schema.rb
|
111
|
+
has_rdoc:
|