switchman 1.9.14 → 1.10.0

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: 6b3272200e4d6343d49dec5aab8667e19b556e85
4
- data.tar.gz: 60fd7a0ea2885cf4826cda7092f74acf68293f2b
3
+ metadata.gz: d9bf082be6cc36e99b6be46bdf90c47102c45962
4
+ data.tar.gz: 105fd5544f11577cd939de766a0d2950f727759e
5
5
  SHA512:
6
- metadata.gz: 867dfb29be7c90e90e0ddf9b0e7b267c6a19977912d5fb028c2dd8fccdd921a1a999160507d5962f55023584c32e329626d92d0185f8c3ed199c740ed4c1c385
7
- data.tar.gz: 34e2b33034ce3a7090c27deb3c2dd709c77dad8796406eeaf47e5cf927b863894278ec010d6422d0d95956d4bc9502405cddf3d50b90caae88b28b7b7db3914d
6
+ metadata.gz: 3a69a13d8922e15c57a972c4521833f0d1658d7c13198f766e1cc2374a3cc8781765984194bb1b57950b32bc2c52221b3aeb8d1e6474e30bde3a4aa30a6d8cd3
7
+ data.tar.gz: a22298dbbc075b8a69af90bd87c97a74ad598729551f268a7bd3bb9eae08aa28eec6ca1654bf35b2b7863527acd2aab63458a8ad439453d4d86fb5514c0d7447
@@ -192,7 +192,7 @@ module Switchman
192
192
  max_procs = determine_max_procs(options.delete(:max_procs), parallel)
193
193
  if ::ActiveRecord::Relation === scope
194
194
  # still need a post-uniq, cause the default database server could be NULL or Rails.env in the db
195
- database_servers = scope.reorder('database_server_id').select(:database_server_id).uniq.
195
+ database_servers = scope.reorder('database_server_id').select(:database_server_id).distinct.
196
196
  map(&:database_server).compact.uniq
197
197
  parallel = [(max_procs.to_f / database_servers.count).ceil, parallel].min if max_procs
198
198
 
@@ -1,4 +1,4 @@
1
- class CreateSwitchmanShards < ActiveRecord::Migration
1
+ class CreateSwitchmanShards < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  create_table :switchman_shards do |t|
4
4
  t.string :name
@@ -1,4 +1,4 @@
1
- class CreateDefaultShard < ActiveRecord::Migration
1
+ class CreateDefaultShard < ActiveRecord::Migration[4.2]
2
2
  def up
3
3
  unless Switchman::Shard.default.is_a?(Switchman::Shard)
4
4
  Switchman::Shard.reset_column_information
@@ -1,4 +1,4 @@
1
- class AddBackDefaultStringLimitsSwitchman < ActiveRecord::Migration
1
+ class AddBackDefaultStringLimitsSwitchman < ActiveRecord::Migration[4.2]
2
2
  def up
3
3
  add_string_limit_if_missing :switchman_shards, :name
4
4
  add_string_limit_if_missing :switchman_shards, :database_server_id
@@ -38,6 +38,14 @@ module Switchman
38
38
  ensure
39
39
  @last_query_at = Time.now
40
40
  end
41
+
42
+ private
43
+
44
+ def id_value_for_database(value)
45
+ return super unless value.class.sharded_primary_key?
46
+ # do this the Rails 4.2 way, so that if Shard.current != self.shard, the id gets transposed
47
+ quote(value.id)
48
+ end
41
49
  end
42
50
  end
43
51
  end
@@ -36,14 +36,17 @@ module Switchman
36
36
  end
37
37
 
38
38
  module CollectionAssociation
39
- def get_records
40
- shards = reflection.options[:multishard] && owner.respond_to?(:associated_shards) ? owner.associated_shards : [shard]
41
- # activate both the owner and the target's shard category, so that Reflection#join_id_for,
42
- # when called for the owner, will be returned relative to shard the query will execute on
43
- Shard.with_each_shard(shards, [klass.shard_category, owner.class.shard_category].uniq) do
44
- super
39
+ method = ::Rails.version < '5.1' ? :get_records : :find_target
40
+ module_eval <<-RUBY, __FILE__, __LINE__ + 1
41
+ def #{method}
42
+ shards = reflection.options[:multishard] && owner.respond_to?(:associated_shards) ? owner.associated_shards : [shard]
43
+ # activate both the owner and the target's shard category, so that Reflection#join_id_for,
44
+ # when called for the owner, will be returned relative to shard the query will execute on
45
+ Shard.with_each_shard(shards, [klass.shard_category, owner.class.shard_category].uniq) do
46
+ super
47
+ end
45
48
  end
46
- end
49
+ RUBY
47
50
  end
48
51
 
49
52
  module BelongsToAssociation
@@ -138,7 +138,7 @@ module Switchman
138
138
  end
139
139
 
140
140
  def hash
141
- self.class.sharded_primary_key? ? Shard.global_id_for(id).hash : super
141
+ self.class.sharded_primary_key? ? self.class.hash ^ Shard.global_id_for(id).hash : super
142
142
  end
143
143
 
144
144
  def to_param
@@ -156,7 +156,7 @@ module Switchman
156
156
  def quoted_id
157
157
  return super unless self.class.sharded_primary_key?
158
158
  # do this the Rails 4.2 way, so that if Shard.current != self.shard, the id gets transposed
159
- self.class.connection.quote(id, column_for_attribute(self.class.primary_key))
159
+ self.class.connection.quote(id)
160
160
  end
161
161
  end
162
162
  end
@@ -40,10 +40,15 @@ module Switchman
40
40
  Shard.default
41
41
 
42
42
  # automatically change config to allow for sharing connections with simple config
43
- ConnectionHandler.make_sharing_automagic(spec.config)
43
+ config = ::Rails.version < '5.1' ? spec.config : pool.spec.config
44
+ ConnectionHandler.make_sharing_automagic(config)
44
45
  ConnectionHandler.make_sharing_automagic(Shard.default.database_server.config)
45
46
 
46
- ::ActiveRecord::Base.configurations[::Rails.env] = spec.instance_variable_get(:@config).stringify_keys
47
+ if ::Rails.version < '5.1'
48
+ ::ActiveRecord::Base.configurations[::Rails.env] = spec.instance_variable_get(:@config).stringify_keys
49
+ else
50
+ ::ActiveRecord::Base.configurations[::Rails.env] = config.stringify_keys
51
+ end
47
52
  end
48
53
 
49
54
  @shard_connection_pools ||= { [:master, Shard.default.database_server.shareable? ? ::Rails.env : Shard.default] => pool}
@@ -162,12 +167,13 @@ module Switchman
162
167
  # A connection was established in an ancestor process that must have
163
168
  # subsequently forked. We can't reuse the connection, but we can copy
164
169
  # the specification and establish a new connection with it.
165
- pool = nil
166
- if ancestor_pool.is_a?(ConnectionPoolProxy)
167
- pool = establish_connection ancestor_pool.default_pool.spec
170
+ spec = if ancestor_pool.is_a?(ConnectionPoolProxy)
171
+ ancestor_pool.default_pool.spec
168
172
  else
169
- pool = establish_connection ancestor_pool.spec
173
+ ancestor_pool.spec
170
174
  end
175
+ spec = spec.to_hash if ::Rails.version >= '5.1'
176
+ pool = establish_connection spec
171
177
  pool.instance_variable_set(:@schema_cache, ancestor_pool.schema_cache) if ancestor_pool.schema_cache
172
178
  pool
173
179
  elsif spec_name != "primary"
@@ -21,8 +21,6 @@ module Switchman
21
21
  binds = " " + payload[:binds].map { |col,v|
22
22
  render_bind(col, v)
23
23
  }.inspect
24
- elsif ::Rails.version < '5.0.3'
25
- binds = " " + payload[:binds].map { |attr| render_bind(attr) }.inspect
26
24
  else
27
25
  casted_params = type_casted_binds(payload[:binds], payload[:type_casted_binds])
28
26
  binds = " " + payload[:binds].zip(casted_params).map { |attr, value|
@@ -1,6 +1,23 @@
1
1
  module Switchman
2
2
  module ActiveRecord
3
3
  module Migration
4
+ module Compatibility
5
+ module V5_0
6
+ def create_table(*args, **options)
7
+ unless options.key?(:id)
8
+ options[:id] = :bigserial
9
+ end
10
+ if block_given?
11
+ super do |td|
12
+ yield td
13
+ end
14
+ else
15
+ super
16
+ end
17
+ end
18
+ end
19
+ end
20
+
4
21
  def connection
5
22
  conn = super
6
23
  if conn.shard != ::ActiveRecord::Base.connection_pool.current_pool.shard
@@ -1,8 +1,10 @@
1
1
  module Switchman
2
2
  module ActiveRecord
3
3
  module PostgreSQLAdapter
4
- def self.prepended(klass)
5
- klass::NATIVE_DATABASE_TYPES[:primary_key] = "bigserial primary key".freeze
4
+ if ::Rails.version < '5'
5
+ def self.prepended(klass)
6
+ klass::NATIVE_DATABASE_TYPES[:primary_key] = "bigserial primary key".freeze
7
+ end
6
8
  end
7
9
 
8
10
  # copy/paste; use quote_local_table_name
@@ -137,7 +139,7 @@ module Switchman
137
139
  end.compact
138
140
  end
139
141
 
140
- def index_name_exists?(table_name, index_name, default)
142
+ def index_name_exists?(table_name, index_name, _default = nil)
141
143
  schema = shard.name if use_qualified_names?
142
144
 
143
145
  exec_query(<<-SQL, 'SCHEMA').rows.first[0].to_i > 0
@@ -80,22 +80,46 @@ module Switchman
80
80
 
81
81
  private
82
82
 
83
- def cache_sql(sql, binds)
84
- # have to include the shard id in the cache key because of switching dbs on the same connection
85
- sql = "#{self.shard.id}::#{sql}"
86
- result =
87
- if query_cache[sql].key?(binds)
88
- ::ActiveSupport::Notifications.instrument("sql.active_record",
89
- :sql => sql, :binds => binds, :name => "CACHE", :connection_id => object_id)
90
- query_cache[sql][binds]
91
- else
92
- query_cache[sql][binds] = yield
93
- end
83
+ if ::Rails.version < '5.1'
84
+ def cache_sql(sql, binds)
85
+ # have to include the shard id in the cache key because of switching dbs on the same connection
86
+ sql = "#{self.shard.id}::#{sql}"
87
+ result =
88
+ if query_cache[sql].key?(binds)
89
+ ::ActiveSupport::Notifications.instrument("sql.active_record",
90
+ :sql => sql, :binds => binds, :name => "CACHE", :connection_id => object_id)
91
+ query_cache[sql][binds]
92
+ else
93
+ query_cache[sql][binds] = yield
94
+ end
94
95
 
95
- if ::ActiveRecord::Result === result
96
- result.dup
97
- else
98
- result.collect { |row| row.dup }
96
+ if ::ActiveRecord::Result === result
97
+ result.dup
98
+ else
99
+ result.collect { |row| row.dup }
100
+ end
101
+ end
102
+ else
103
+ def cache_sql(sql, name, binds)
104
+ # have to include the shard id in the cache key because of switching dbs on the same connection
105
+ sql = "#{self.shard.id}::#{sql}"
106
+ @lock.synchronize do
107
+ result =
108
+ if query_cache[sql].key?(binds)
109
+ ::ActiveSupport::Notifications.instrument(
110
+ "sql.active_record",
111
+ sql: sql,
112
+ binds: binds,
113
+ name: name,
114
+ connection_id: object_id,
115
+ cached: true,
116
+ )
117
+ query_cache[sql][binds]
118
+ else
119
+ query_cache[sql][binds] = yield
120
+ end
121
+ result.dup
122
+ end
99
123
  end
100
124
  end
101
125
  end
@@ -44,12 +44,22 @@ module Switchman
44
44
  end
45
45
  end
46
46
 
47
- def generic_query_builder(connection)
48
- @query_builder ||= connection.cacheable_query(@arel)
49
- end
47
+ if ::Rails.version < '5.1'
48
+ def generic_query_builder(connection)
49
+ @query_builder ||= connection.cacheable_query(@arel)
50
+ end
51
+
52
+ def qualified_query_builder(shard, klass)
53
+ @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(@arel)
54
+ end
55
+ else
56
+ def generic_query_builder(connection)
57
+ @query_builder ||= connection.cacheable_query(self.class, @arel)
58
+ end
50
59
 
51
- def qualified_query_builder(shard, klass)
52
- @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(@arel)
60
+ def qualified_query_builder(shard, klass)
61
+ @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(self.class, @arel)
62
+ end
53
63
  end
54
64
 
55
65
  module BindMap
@@ -129,6 +129,9 @@ module Switchman
129
129
 
130
130
  ::ActiveRecord::LogSubscriber.prepend(ActiveRecord::LogSubscriber)
131
131
  ::ActiveRecord::Migration.prepend(ActiveRecord::Migration)
132
+ if ::Rails.version >= '5'
133
+ ::ActiveRecord::Migration::Compatibility::V5_0.prepend(ActiveRecord::Migration::Compatibility::V5_0)
134
+ end
132
135
  ::ActiveRecord::Migrator.prepend(ActiveRecord::Migrator)
133
136
 
134
137
  ::ActiveRecord::Reflection::AbstractReflection.include(ActiveRecord::Reflection::AbstractReflection)
@@ -118,7 +118,8 @@ module Switchman
118
118
  klass.before do
119
119
  raise "Sharding did not set up correctly" if @@sharding_failed
120
120
  Shard.clear_cache
121
- if (::Rails.version >= '5' && use_transactional_tests) || use_transactional_fixtures
121
+ if ::Rails.version >= '5.1' ? use_transactional_tests :
122
+ (::Rails.version >= '5' && use_transactional_tests) || use_transactional_fixtures
122
123
  Shard.default(true)
123
124
  @shard1 = Shard.find(@shard1.id)
124
125
  @shard2 = Shard.find(@shard2.id)
@@ -134,7 +135,8 @@ module Switchman
134
135
 
135
136
  klass.after do
136
137
  next if @@sharding_failed
137
- if (::Rails.version >= '5' && use_transactional_tests) || use_transactional_fixtures
138
+ if ::Rails.version >= '5.1' ? use_transactional_tests :
139
+ (::Rails.version >= '5' && use_transactional_tests) || use_transactional_fixtures
138
140
  shards = [@shard2]
139
141
  shards << @shard1 unless @shard1.database_server == Shard.default.database_server
140
142
  shards.each do |shard|
@@ -1,3 +1,3 @@
1
1
  module Switchman
2
- VERSION = "1.9.14"
2
+ VERSION = "1.10.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switchman
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.14
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
@@ -19,9 +19,9 @@ dependencies:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '4.2'
22
- - - "<="
22
+ - - "<"
23
23
  - !ruby/object:Gem::Version
24
- version: '5.1'
24
+ version: '5.2'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,9 +29,9 @@ dependencies:
29
29
  - - ">="
30
30
  - !ruby/object:Gem::Version
31
31
  version: '4.2'
32
- - - "<="
32
+ - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: '5.1'
34
+ version: '5.2'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: activerecord
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -39,9 +39,9 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4.2'
42
- - - "<="
42
+ - - "<"
43
43
  - !ruby/object:Gem::Version
44
- version: '5.1'
44
+ version: '5.2'
45
45
  type: :runtime
46
46
  prerelease: false
47
47
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,23 +49,23 @@ dependencies:
49
49
  - - ">="
50
50
  - !ruby/object:Gem::Version
51
51
  version: '4.2'
52
- - - "<="
52
+ - - "<"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.1'
54
+ version: '5.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: shackles
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.3.0
61
+ version: '1.3'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.3.0
68
+ version: '1.3'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: open4
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 2.1.0
89
+ version: '2.1'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 2.1.0
96
+ version: '2.1'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: byebug
99
99
  requirement: !ruby/object:Gem::Requirement