switchman 1.12.2 → 1.12.3
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/lib/switchman/active_record/query_methods.rb +6 -4
- data/lib/switchman/database_server.rb +30 -37
- data/lib/switchman/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ede324b26c105f71f0d071eee8afa73297430ae
|
4
|
+
data.tar.gz: 6dc4b1fd3878baa64ab87827cdab9da20c7693fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8655c6d6342901d739e858f5914aafc2a5b3a875c30a58802128df70630abcb2f09de364a52e43064ad5388368845d8d28c944617a7fd36eaaae7db45cf2e2ae
|
7
|
+
data.tar.gz: 5631ec070476582189e1ebb53c1822d50c2c72a5ee0dab301d604a18166f166e143e1b13edfee3fc95df015bf5a2e315e4ebc067d77dd6e8e741ffbd1936290a
|
@@ -224,7 +224,7 @@ module Switchman
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def arel_columns(columns)
|
227
|
-
columns.
|
227
|
+
columns.flat_map do |field|
|
228
228
|
if (Symbol === field || String === field) && (klass.has_attribute?(field) || klass.attribute_alias?(field)) && !from_clause.value
|
229
229
|
klass.arel_attribute(field, table)
|
230
230
|
elsif (Symbol === field || String === field) && columns_hash.key?(field.to_s) && !from_value
|
@@ -233,6 +233,8 @@ module Switchman
|
|
233
233
|
# the rest of this is pulled from AR - the only change is from quote_table_name to quote_column_name here
|
234
234
|
# otherwise qualified names will add the schema to a column
|
235
235
|
connection.quote_column_name(field.to_s)
|
236
|
+
elsif Proc === field
|
237
|
+
field.call
|
236
238
|
else
|
237
239
|
field
|
238
240
|
end
|
@@ -316,7 +318,7 @@ module Switchman
|
|
316
318
|
predicate.right
|
317
319
|
else
|
318
320
|
local_id = Shard.relative_id_for(predicate.right, current_source_shard, target_shard) || predicate.right
|
319
|
-
local_id = [] if remove && local_id.is_a?(
|
321
|
+
local_id = [] if remove && local_id.is_a?(Integer) && local_id > Shard::IDS_PER_SHARD
|
320
322
|
local_id
|
321
323
|
end
|
322
324
|
end
|
@@ -346,7 +348,7 @@ module Switchman
|
|
346
348
|
value
|
347
349
|
else
|
348
350
|
local_id = Shard.relative_id_for(current_id, current_shard, target_shard) || current_id
|
349
|
-
local_id = [] if remove_non_local_ids && local_id.is_a?(
|
351
|
+
local_id = [] if remove_non_local_ids && local_id.is_a?(Integer) && local_id > Shard::IDS_PER_SHARD
|
350
352
|
if current_id != local_id
|
351
353
|
# make a new bind param
|
352
354
|
::Arel::Nodes::BindParam.new(query_att.class.new(query_att.name, local_id, query_att.type))
|
@@ -356,7 +358,7 @@ module Switchman
|
|
356
358
|
end
|
357
359
|
else
|
358
360
|
local_id = Shard.relative_id_for(value, current_shard, target_shard) || value
|
359
|
-
local_id = [] if remove_non_local_ids && local_id.is_a?(
|
361
|
+
local_id = [] if remove_non_local_ids && local_id.is_a?(Integer) && local_id > Shard::IDS_PER_SHARD
|
360
362
|
local_id
|
361
363
|
end
|
362
364
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
1
3
|
module Switchman
|
2
4
|
class DatabaseServer
|
3
5
|
attr_accessor :id
|
@@ -136,27 +138,14 @@ module Switchman
|
|
136
138
|
create_schema = options[:schema]
|
137
139
|
# look for another shard associated with this db
|
138
140
|
other_shard = self.shards.where("name<>':memory:' OR name IS NULL").order(:id).first
|
139
|
-
temp_name = other_shard&.name unless id == ::Rails.env
|
140
|
-
temp_name = Shard.default.name if id == ::Rails.env
|
141
141
|
|
142
142
|
case config[:adapter]
|
143
143
|
when 'postgresql'
|
144
|
-
temp_name ||= 'public'
|
145
144
|
create_statement = lambda { "CREATE SCHEMA #{name}" }
|
146
145
|
password = " PASSWORD #{::ActiveRecord::Base.connection.quote(config[:password])}" if config[:password]
|
147
146
|
when 'sqlite3'
|
148
|
-
|
149
|
-
# Try to create a db on-disk even if the only shards for sqlite are in-memory
|
150
|
-
temp_name = nil if temp_name == ':memory:'
|
151
|
-
# Put it in the db directory if there are no other sqlite shards
|
152
|
-
temp_name ||= 'db/dummy'
|
153
|
-
temp_name = File.join(File.dirname(temp_name), "#{name}.sqlite3")
|
154
|
-
# If they really asked for :memory:, give them :memory:
|
155
|
-
temp_name = name if name == ':memory:'
|
156
|
-
name = temp_name
|
157
|
-
end
|
147
|
+
# no create_statement
|
158
148
|
else
|
159
|
-
temp_name ||= self.config[:database] % self.config
|
160
149
|
create_statement = lambda { "CREATE DATABASE #{name}" }
|
161
150
|
end
|
162
151
|
sharding_config = Switchman.config
|
@@ -170,27 +159,35 @@ module Switchman
|
|
170
159
|
end
|
171
160
|
|
172
161
|
create_shard = lambda do
|
173
|
-
|
174
|
-
|
175
|
-
|
162
|
+
shard_id = options.fetch(:id) do
|
163
|
+
case config[:adapter]
|
164
|
+
when 'postgresql'
|
165
|
+
id_seq = Shard.connection.quote(Shard.connection.quote_table_name('switchman_shards_id_seq'))
|
166
|
+
next_id = Shard.connection.select_value("SELECT nextval(#{id_seq})")
|
167
|
+
next_id.to_i
|
168
|
+
else
|
169
|
+
nil
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
if name.nil?
|
174
|
+
base_name = self.config[:database].to_s % self.config
|
175
|
+
base_name = $1 if base_name =~ /(?:.*\/)(.+)_shard_\d+(?:\.sqlite3)?$/
|
176
|
+
base_name = nil if base_name == ':memory:'
|
177
|
+
base_name << '_' if base_name
|
178
|
+
base_id = shard_id || SecureRandom.uuid
|
179
|
+
name = "#{base_name}shard_#{base_id}"
|
180
|
+
if config[:adapter] == 'sqlite3'
|
181
|
+
name = File.join('db', "#{name}.sqlite3")
|
182
|
+
end
|
176
183
|
end
|
184
|
+
|
185
|
+
shard = Shard.create!(:id => shard_id,
|
186
|
+
:name => name,
|
187
|
+
:database_server => self)
|
188
|
+
|
177
189
|
begin
|
178
190
|
self.class.creating_new_shard = true
|
179
|
-
if name.nil?
|
180
|
-
base_name = self.config[:database] % self.config
|
181
|
-
base_name = $1 if base_name =~ /(?:.*\/)(.+)_shard_\d+(?:\.sqlite3)?$/
|
182
|
-
base_name = nil if base_name == ':memory:'
|
183
|
-
base_name << '_' if base_name
|
184
|
-
name = "#{base_name}shard_#{shard.id}"
|
185
|
-
if config[:adapter] == 'sqlite3'
|
186
|
-
# Try to create a db on-disk even if the only shards for sqlite are in-memory
|
187
|
-
temp_name = nil if temp_name == ':memory:'
|
188
|
-
# Put it in the db directory if there are no other sqlite shards
|
189
|
-
temp_name ||= 'db/dummy'
|
190
|
-
name = File.join(File.dirname(temp_name), "#{name}.sqlite3")
|
191
|
-
shard.name = name
|
192
|
-
end
|
193
|
-
end
|
194
191
|
shard.activate(*Shard.categories) do
|
195
192
|
::Shackles.activate(:deploy) do
|
196
193
|
begin
|
@@ -199,14 +196,11 @@ module Switchman
|
|
199
196
|
::ActiveRecord::Base.connection.execute(stmt)
|
200
197
|
end
|
201
198
|
# have to disconnect and reconnect to the correct db
|
202
|
-
shard.name = name
|
203
199
|
if self.shareable? && other_shard
|
204
200
|
other_shard.activate { ::ActiveRecord::Base.connection }
|
205
201
|
else
|
206
202
|
::ActiveRecord::Base.connection_pool.current_pool.disconnect!
|
207
203
|
end
|
208
|
-
else
|
209
|
-
shard.name = name
|
210
204
|
end
|
211
205
|
old_proc = ::ActiveRecord::Base.connection.raw_connection.set_notice_processor {} if config[:adapter] == 'postgresql'
|
212
206
|
old_verbose = ::ActiveRecord::Migration.verbose
|
@@ -232,11 +226,10 @@ module Switchman
|
|
232
226
|
end
|
233
227
|
end
|
234
228
|
end
|
235
|
-
shard.save!
|
236
229
|
shard
|
237
230
|
rescue
|
238
231
|
shard.destroy
|
239
|
-
shard.drop_database
|
232
|
+
shard.drop_database rescue nil
|
240
233
|
reset_column_information unless create_schema == false rescue nil
|
241
234
|
raise
|
242
235
|
ensure
|
data/lib/switchman/version.rb
CHANGED
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.12.
|
4
|
+
version: 1.12.3
|
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: 2018-
|
13
|
+
date: 2018-08-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: railties
|