switchman 1.5.9 → 1.5.10

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: abf642d4e18ec28d2f9b71eb4aa3d4edb8ec8a92
4
- data.tar.gz: 64297343a489ffdfc3eb22f851a2c11dc797d211
3
+ metadata.gz: a864ee73e89a300af961ba7041f8f82ae193d9e5
4
+ data.tar.gz: 3b15e10e5bcb9dccd99e3b88b257f1f95c551a9b
5
5
  SHA512:
6
- metadata.gz: b3c185968b0864ed798bda19dedb9268473f672e118ce01636f3d9c0449f902b7c3ae6a2244342530566232e42b38739df47f5af93ed00d3be60eb1c20906c7e
7
- data.tar.gz: 3abd5123fa4d0807492131fd0179d17df0784b6c6abbca69fc178db9cd4fb78338037414ee0f3a44294d832933471010524e93c7a580361869eedeba535ff609
6
+ metadata.gz: aa6ea9736d0316467d7f9493eecb127ed352a2421df4789b8ceb129f5a6eb9ed893ae3863dc72b15268bf7241c55d97dea00b26f78e9dafc0059e18999575a78
7
+ data.tar.gz: 0ee49239c7054e8e510c350aa0c9fe529c92e18fd50ee8ee8ceb468e9d2971f99ce788ce4071543d2b2f85bb73dcad94ef1f36b171cc6f09ad420ba8ec50e03e
@@ -110,7 +110,7 @@ module Switchman
110
110
  private
111
111
 
112
112
  [:where, :having].each do |type|
113
- class_eval <<-RUBY
113
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
114
114
  def transpose_#{type}_clauses(source_shard, target_shard, remove_nonlocal_primary_keys)
115
115
  if ::Rails.version >= '5'
116
116
  unless (predicates = #{type}_clause.send(:predicates)).empty?
@@ -263,7 +263,11 @@ module Switchman
263
263
  relation, column = relation_and_column(predicate.left)
264
264
  next predicate unless (type = transposable_attribute_type(relation, column))
265
265
 
266
- remove = true if type == :primary && remove_nonlocal_primary_keys && predicate.left.relation.model == klass
266
+ remove = true if type == :primary &&
267
+ remove_nonlocal_primary_keys &&
268
+ predicate.left.relation.model == klass &&
269
+ predicate.is_a?(::Arel::Nodes::Equality)
270
+
267
271
  current_source_shard =
268
272
  if source_shard
269
273
  source_shard
@@ -321,7 +325,7 @@ module Switchman
321
325
  predicate.right
322
326
  else
323
327
  local_id = Shard.relative_id_for(predicate.right, current_source_shard, target_shard)
324
- local_id = [] if remove && local_id > Shard::IDS_PER_SHARD
328
+ local_id = [] if remove && local_id.is_a?(Fixnum) && local_id > Shard::IDS_PER_SHARD
325
329
  local_id
326
330
  end
327
331
 
@@ -38,6 +38,10 @@ module Switchman
38
38
  primary_shard.activate(klass.shard_category) { super }
39
39
  end
40
40
 
41
+ def to_sql
42
+ primary_shard.activate(klass.shard_category) { super }
43
+ end
44
+
41
45
  def explain(super_method: false)
42
46
  return super() if super_method
43
47
  self.activate { |relation| relation.explain(super_method: true) }
@@ -0,0 +1,203 @@
1
+ module Switchman
2
+ class Engine < ::Rails::Engine
3
+ require 'byebug'
4
+ debugger
5
+ isolate_namespace Switchman
6
+
7
+ config.autoload_once_paths << File.expand_path(File.join(__FILE__, "../../../app/models"))
8
+
9
+ def self.lookup_stores(cache_store_config)
10
+ result = {}
11
+ cache_store_config.each do |key, value|
12
+ next if value.is_a?(String)
13
+ result[key] = ::ActiveSupport::Cache.lookup_store(value)
14
+ end
15
+
16
+ cache_store_config.each do |key, value|
17
+ next unless value.is_a?(String)
18
+ result[key] = result[value]
19
+ end
20
+ result
21
+ end
22
+
23
+ initializer 'switchman.initialize_cache', :before => 'initialize_cache' do
24
+ require "switchman/active_support/cache"
25
+ ::ActiveSupport::Cache.singleton_class.prepend(ActiveSupport::Cache::ClassMethods)
26
+
27
+ # if we haven't already setup our cache map out-of-band, set it up from
28
+ # config.cache_store now. behaves similarly to Rails' default
29
+ # initialize_cache initializer, but for each value in the map, rather
30
+ # than just Rails.cache. if config.cache_store is a flat value, uses it
31
+ # to fill just the Rails.env entry in the cache map.
32
+ unless Switchman.config[:cache_map].present?
33
+ cache_store_config = ::Rails.configuration.cache_store
34
+ unless cache_store_config.is_a?(Hash)
35
+ cache_store_config = {::Rails.env => cache_store_config}
36
+ end
37
+
38
+ Switchman.config[:cache_map] = Engine.lookup_stores(cache_store_config)
39
+ end
40
+
41
+ # if the configured cache map (either from before, or as populated from
42
+ # config.cache_store) didn't have an entry for Rails.env, add one using
43
+ # lookup_store(nil); matches the behavior of Rails' default
44
+ # initialize_cache initializer when config.cache_store is nil.
45
+ unless Switchman.config[:cache_map].has_key?(::Rails.env)
46
+ value = ::ActiveSupport::Cache.lookup_store(nil)
47
+ Switchman.config[:cache_map][::Rails.env] = value
48
+ end
49
+
50
+ middlewares = Switchman.config[:cache_map].values.map do |store|
51
+ store.middleware if store.respond_to?(:middleware)
52
+ end.compact.uniq
53
+ middlewares.each do |middleware|
54
+ config.middleware.insert_before("Rack::Runtime", middleware)
55
+ end
56
+
57
+ # prevent :initialize_cache from trying to (or needing to) set
58
+ # Rails.cache. once our switchman.extend_ar initializer (below) runs
59
+ # Rails.cache will be overridden to pull appropriate values from the
60
+ # cache map, but between now and then, Rails.cache should return the
61
+ # Rails.env entry in the cache map.
62
+ ::Rails.cache = Switchman.config[:cache_map][::Rails.env]
63
+
64
+ require "switchman/rails"
65
+ ::Rails.singleton_class.prepend(Rails::ClassMethods)
66
+ end
67
+
68
+ initializer 'switchman.asplode', :after => "active_record.initialize_database" do
69
+ ::Rails.cache
70
+ end
71
+
72
+ initializer 'switchman.extend_ar', :before => "active_record.initialize_database" do
73
+ ::ActiveSupport.on_load(:active_record) do
74
+ require 'byebug'
75
+ debugger
76
+ require "switchman/active_record/abstract_adapter"
77
+ require "switchman/active_record/association"
78
+ require "switchman/active_record/attribute_methods"
79
+ require "switchman/active_record/base"
80
+ require "switchman/active_record/calculations"
81
+ require "switchman/active_record/connection_handler"
82
+ require "switchman/active_record/connection_pool"
83
+ require "switchman/active_record/finder_methods"
84
+ require "switchman/active_record/log_subscriber"
85
+ require "switchman/active_record/model_schema"
86
+ require "switchman/active_record/persistence"
87
+ require "switchman/active_record/predicate_builder"
88
+ require "switchman/active_record/query_cache"
89
+ require "switchman/active_record/query_methods"
90
+ require "switchman/active_record/reflection"
91
+ require "switchman/active_record/relation"
92
+ require "switchman/active_record/spawn_methods"
93
+ require "switchman/active_record/where_clause_factory"
94
+ require "switchman/active_record/type_caster"
95
+ require "switchman/arel"
96
+ require "switchman/shackles/relation"
97
+
98
+ include ActiveRecord::Base
99
+ include ActiveRecord::AttributeMethods
100
+ include ActiveRecord::Persistence
101
+ singleton_class.prepend ActiveRecord::ModelSchema::ClassMethods
102
+
103
+ if ::Rails.version > '4.2'
104
+ require "switchman/active_record/statement_cache"
105
+ ::ActiveRecord::StatementCache.prepend(ActiveRecord::StatementCache)
106
+ ::ActiveRecord::StatementCache::BindMap.prepend(ActiveRecord::StatementCache::BindMap)
107
+ ::ActiveRecord::StatementCache::Substitute.send(:attr_accessor, :primary, :sharded)
108
+
109
+ ::ActiveRecord::Associations::CollectionAssociation.prepend(ActiveRecord::CollectionAssociation)
110
+ ::ActiveRecord::PredicateBuilder.singleton_class.prepend(ActiveRecord::PredicateBuilder)
111
+ end
112
+
113
+ if ::Rails.version > '4.1'
114
+ prepend(ActiveRecord::AutosaveAssociation)
115
+ end
116
+
117
+ ::ActiveRecord::Associations::Association.prepend(ActiveRecord::Association)
118
+ ::ActiveRecord::Associations::BelongsToAssociation.prepend(ActiveRecord::BelongsToAssociation)
119
+ ::ActiveRecord::Associations::CollectionProxy.include(ActiveRecord::CollectionProxy)
120
+ if ::Rails.version < '5'
121
+ ::ActiveRecord::Associations::Builder::CollectionAssociation.include(ActiveRecord::Builder::CollectionAssociation)
122
+ end
123
+
124
+ ::ActiveRecord::Associations::Preloader::Association.prepend(ActiveRecord::Preloader::Association)
125
+ ::ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(ActiveRecord::AbstractAdapter)
126
+ ::ActiveRecord::ConnectionAdapters::ConnectionHandler.prepend(ActiveRecord::ConnectionHandler)
127
+ ::ActiveRecord::ConnectionAdapters::ConnectionPool.prepend(ActiveRecord::ConnectionPool)
128
+ ::ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(ActiveRecord::QueryCache)
129
+ # when we call super in Switchman::ActiveRecord::QueryCache#select_all,
130
+ # we want it to find the definition from
131
+ # ActiveRecord::ConnectionAdapters::DatabaseStatements, not
132
+ # ActiveRecord::ConnectionAdapters::QueryCache
133
+ ::ActiveRecord::ConnectionAdapters::QueryCache.send(:remove_method, :select_all)
134
+
135
+ ::ActiveRecord::LogSubscriber.prepend(ActiveRecord::LogSubscriber)
136
+ ::ActiveRecord::Reflection::AssociationReflection.prepend(ActiveRecord::Reflection::AssociationReflection)
137
+ ::ActiveRecord::Relation.prepend(ActiveRecord::Calculations)
138
+ ::ActiveRecord::Relation.include(ActiveRecord::FinderMethods)
139
+ ::ActiveRecord::Relation.include(ActiveRecord::QueryMethods)
140
+ ::ActiveRecord::Relation.prepend(ActiveRecord::Relation)
141
+ ::ActiveRecord::Relation.include(ActiveRecord::SpawnMethods)
142
+ ::ActiveRecord::Relation.prepend(Shackles::Relation)
143
+
144
+ if ::Rails.version >= '5'
145
+ ::ActiveRecord::Relation::WhereClauseFactory.prepend(ActiveRecord::WhereClauseFactory)
146
+ ::ActiveRecord::PredicateBuilder::AssociationQueryValue.prepend(ActiveRecord::PredicateBuilder::AssociationQueryValue)
147
+ ::ActiveRecord::TypeCaster::Map.include(ActiveRecord::TypeCaster::Map)
148
+ ::ActiveRecord::TypeCaster::Connection.include(ActiveRecord::TypeCaster::Connection)
149
+ end
150
+
151
+ ::Arel::Table.prepend(Arel::Table)
152
+ ::Arel::Visitors::ToSql.prepend(Arel::Visitors::ToSql)
153
+ ::Arel::Visitors::PostgreSQL.include(Arel::Visitors::PostgreSQL) if ::Rails.version < '4.2'
154
+ end
155
+ end
156
+
157
+ def self.foreign_key_check(name, type, options)
158
+ if name.to_s =~ /_id\z/ && type.to_s == 'integer' && options[:limit].to_i < 8
159
+ puts "WARNING: All foreign keys need to be 8-byte integers. #{name} looks like a foreign key. If so, please add the option: `:limit => 8`"
160
+ end
161
+ end
162
+
163
+ initializer 'switchman.extend_connection_adapters', :after => "active_record.initialize_database" do
164
+ ::ActiveSupport.on_load(:active_record) do
165
+ ::ActiveRecord::ConnectionAdapters::AbstractAdapter.descendants.each do |klass|
166
+ klass.prepend(ActiveRecord::AbstractAdapter::ForeignKeyCheck)
167
+ end
168
+
169
+ require 'switchman/active_record/table_definition'
170
+ ::ActiveRecord::ConnectionAdapters::TableDefinition.prepend(ActiveRecord::TableDefinition)
171
+
172
+ if defined?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
173
+ require "switchman/active_record/postgresql_adapter"
174
+ ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(ActiveRecord::PostgreSQLAdapter)
175
+ end
176
+ end
177
+ end
178
+
179
+ initializer 'switchman.eager_load' do
180
+ ::ActiveSupport.on_load(:before_eager_load) do
181
+ # This needs to be loaded before Switchman::Shard, otherwise it won't autoload it correctly
182
+ require 'active_record/base'
183
+ end
184
+ end
185
+
186
+ initializer 'switchman.extend_shackles', :before => "switchman.extend_ar" do
187
+ ::ActiveSupport.on_load(:active_record) do
188
+ require "switchman/shackles"
189
+
190
+ ::Shackles.singleton_class.prepend(Shackles::ClassMethods)
191
+ end
192
+ end
193
+
194
+ initializer 'switchman.extend_controller', :after => "shackles.extend_ar" do
195
+ ::ActiveSupport.on_load(:action_controller) do
196
+ require "switchman/action_controller/caching"
197
+
198
+ ::ActionController::Base.include(ActionController::Caching)
199
+ end
200
+ end
201
+
202
+ end
203
+ end
@@ -1,3 +1,3 @@
1
1
  module Switchman
2
- VERSION = "1.5.9"
2
+ VERSION = "1.5.10"
3
3
  end
@@ -49,7 +49,7 @@ module Switchman
49
49
  old_actions = old_task.actions.dup
50
50
  old_task.actions.clear
51
51
 
52
- old_task.enhance do
52
+ old_task.enhance do |*task_args|
53
53
  if ::Rails.env.test?
54
54
  require 'switchman/test_helper'
55
55
  TestHelper.recreate_persistent_test_shards(dont_create: true)
@@ -62,7 +62,7 @@ module Switchman
62
62
  ::ActiveRecord::Base.connection_pool.spec.config[:shard_name] = Shard.current.name
63
63
  ::ActiveRecord::Base.configurations[::Rails.env] = ::ActiveRecord::Base.connection_pool.spec.config.stringify_keys
64
64
  shard.database_server.unshackle do
65
- old_actions.each(&:call)
65
+ old_actions.each { |action| action.call(*task_args) }
66
66
  end
67
67
  nil
68
68
  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.5.9
4
+ version: 1.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-06-10 00:00:00.000000000 Z
13
+ date: 2016-06-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: railties
@@ -162,7 +162,6 @@ files:
162
162
  - app/models/switchman/shard_internal.rb
163
163
  - db/migrate/20130328212039_create_switchman_shards.rb
164
164
  - db/migrate/20130328224244_create_default_shard.rb
165
- - db/shard_1708.sqlite3
166
165
  - lib/switchman.rb
167
166
  - lib/switchman/action_controller/caching.rb
168
167
  - lib/switchman/active_record/abstract_adapter.rb
@@ -194,6 +193,7 @@ files:
194
193
  - lib/switchman/database_server.rb
195
194
  - lib/switchman/default_shard.rb
196
195
  - lib/switchman/engine.rb
196
+ - lib/switchman/engine.rb~
197
197
  - lib/switchman/environment.rb
198
198
  - lib/switchman/errors.rb
199
199
  - lib/switchman/r_spec_helper.rb
@@ -225,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
225
  version: '0'
226
226
  requirements: []
227
227
  rubyforge_project:
228
- rubygems_version: 2.4.5
228
+ rubygems_version: 2.4.5.1
229
229
  signing_key:
230
230
  specification_version: 4
231
231
  summary: Rails 4 sharding magic
File without changes