rails_multisite 2.0.6 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rails_multisite might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +1 -3
- data/lib/rails_multisite/connection_management.rb +86 -19
- data/lib/rails_multisite/middleware.rb +1 -0
- data/lib/rails_multisite/railtie.rb +12 -4
- data/lib/rails_multisite/version.rb +1 -1
- data/lib/tasks/db.rake +1 -0
- data/lib/tasks/generators.rake +1 -1
- metadata +12 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cf1529e713938afd1edfb04e2e52f8199f86901f3278821d8514c9bc5855b27
|
4
|
+
data.tar.gz: b5d16cf92694fe94445a141ebc0e8bf2817b665d9789f3ba0ac79ef7af369ed4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ecfa664b8367ebd065ecfee14ab1f52ab613aef1c7d404c2944cbedcc93c45899ef53544ca6915260aca0cd5ed6823e6b1bf032569f69fce3001bdaccda12bf
|
7
|
+
data.tar.gz: d3bb77f2e4906ae9736fba551c40972be4a9bd15777447cb5eaaf45d8dc0b0ecf9fa23d1c2baf09dd4b20304776b2b8f7c929aa2173846d64219c73885be6ccf
|
data/README.md
CHANGED
@@ -35,7 +35,6 @@ mlp:
|
|
35
35
|
host: dbhost
|
36
36
|
pool: 5
|
37
37
|
timeout: 5000
|
38
|
-
db_id: 1 # ensure db_id is unique for each site
|
39
38
|
host_names:
|
40
39
|
- discourse.equestria.com
|
41
40
|
- discourse.equestria.internal
|
@@ -48,7 +47,6 @@ drwho:
|
|
48
47
|
host: dbhost
|
49
48
|
pool: 5
|
50
49
|
timeout: 5000
|
51
|
-
db_id: 2 # ensure db_id is unique for each site
|
52
50
|
host_names:
|
53
51
|
- discuss.tardis.gallifrey
|
54
52
|
```
|
@@ -92,7 +90,7 @@ db_two:
|
|
92
90
|
To get a Rails console that is connected to `some_database_1` database:
|
93
91
|
|
94
92
|
```
|
95
|
-
|
93
|
+
RAILS_DB=db_one rails console
|
96
94
|
```
|
97
95
|
|
98
96
|
|
@@ -4,12 +4,17 @@ module RailsMultisite
|
|
4
4
|
class ConnectionManagement
|
5
5
|
|
6
6
|
DEFAULT = 'default'
|
7
|
+
SPEC_KLASS = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
7
8
|
|
8
9
|
def self.default_config_filename
|
9
10
|
File.absolute_path(Rails.root.to_s + "/config/multisite.yml")
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.clear_settings!
|
14
|
+
@instance&.db_spec_cache&.each do |key, spec|
|
15
|
+
@instance.connection_handlers.delete(self.handler_key(spec))
|
16
|
+
end
|
17
|
+
|
13
18
|
@instance = nil
|
14
19
|
end
|
15
20
|
|
@@ -35,7 +40,7 @@ module RailsMultisite
|
|
35
40
|
end
|
36
41
|
|
37
42
|
def self.reload
|
38
|
-
@instance
|
43
|
+
@instance.reload
|
39
44
|
end
|
40
45
|
|
41
46
|
def self.has_db?(db)
|
@@ -97,6 +102,13 @@ module RailsMultisite
|
|
97
102
|
config[:host_names].nil? ? config[:host] : config[:host_names].first
|
98
103
|
end
|
99
104
|
|
105
|
+
def self.current_db_hostnames
|
106
|
+
spec = @instance.connection_spec(db: self.current_db) if @instance
|
107
|
+
spec ||= ActiveRecord::Base.connection_pool.spec
|
108
|
+
config = spec.config
|
109
|
+
config[:host_names].nil? ? [config[:host]] : config[:host_names]
|
110
|
+
end
|
111
|
+
|
100
112
|
def self.connection_spec(opts)
|
101
113
|
if @instance
|
102
114
|
@instance.connection_spec(opts)
|
@@ -113,12 +125,42 @@ module RailsMultisite
|
|
113
125
|
end
|
114
126
|
end
|
115
127
|
|
116
|
-
|
128
|
+
def self.handler_key(spec)
|
129
|
+
@handler_key_suffix ||= begin
|
130
|
+
if ActiveRecord::Base.respond_to?(:writing_role)
|
131
|
+
"_#{ActiveRecord::Base.writing_role}"
|
132
|
+
else
|
133
|
+
""
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
:"#{spec.name}#{@handler_key_suffix}"
|
138
|
+
end
|
139
|
+
|
140
|
+
attr_reader :config_filename, :db_spec_cache, :connection_handlers
|
117
141
|
|
118
142
|
def initialize(config_filename)
|
119
143
|
@config_filename = config_filename
|
120
144
|
|
121
|
-
|
145
|
+
@connection_handlers = begin
|
146
|
+
if ActiveRecord::Base.respond_to?(:connection_handlers)
|
147
|
+
ActiveRecord::Base.connection_handlers
|
148
|
+
else
|
149
|
+
{}
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
@db_spec_cache = {}
|
154
|
+
@default_spec = SPEC_KLASS::Resolver.new(ActiveRecord::Base.configurations).spec(Rails.env.to_sym)
|
155
|
+
@default_connection_handler = ActiveRecord::Base.connection_handler
|
156
|
+
@established_default = false
|
157
|
+
|
158
|
+
@reload_mutex = Mutex.new
|
159
|
+
|
160
|
+
load_config!
|
161
|
+
end
|
162
|
+
|
163
|
+
def load_config!
|
122
164
|
configs = YAML::load(File.open(@config_filename))
|
123
165
|
|
124
166
|
no_prepared_statements = ActiveRecord::Base.configurations[Rails.env]["prepared_statements"] == false
|
@@ -129,27 +171,52 @@ module RailsMultisite
|
|
129
171
|
v[:prepared_statements] = false if no_prepared_statements
|
130
172
|
end
|
131
173
|
|
132
|
-
|
133
|
-
|
174
|
+
resolve_configs = configs
|
175
|
+
|
176
|
+
# rails 6 needs to use a proper object for the resolver
|
177
|
+
if defined?(ActiveRecord::DatabaseConfigurations)
|
178
|
+
resolve_configs = ActiveRecord::DatabaseConfigurations.new(configs)
|
179
|
+
end
|
134
180
|
|
135
|
-
|
181
|
+
resolver = SPEC_KLASS::Resolver.new(resolve_configs)
|
136
182
|
|
183
|
+
# Build a hash of db name => spec
|
184
|
+
new_db_spec_cache = Hash[*configs.map { |k, _| [k, resolver.spec(k.to_sym)] }.flatten]
|
185
|
+
new_db_spec_cache.each do |k, v|
|
186
|
+
# If spec already existed, use the old version
|
187
|
+
if v&.to_hash == @db_spec_cache[k]&.to_hash
|
188
|
+
new_db_spec_cache[k] = @db_spec_cache[k]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# Build a hash of hostname => spec
|
193
|
+
new_host_spec_cache = {}
|
137
194
|
configs.each do |k, v|
|
138
195
|
next unless v["host_names"]
|
139
196
|
v["host_names"].each do |host|
|
140
|
-
|
197
|
+
new_host_spec_cache[host] = new_db_spec_cache[k]
|
141
198
|
end
|
142
199
|
end
|
143
200
|
|
144
|
-
|
201
|
+
# Add the default hostnames as well
|
145
202
|
ActiveRecord::Base.configurations[Rails.env]["host_names"].each do |host|
|
146
|
-
|
203
|
+
new_host_spec_cache[host] = @default_spec
|
147
204
|
end
|
148
205
|
|
149
|
-
|
206
|
+
removed_dbs = @db_spec_cache.keys - new_db_spec_cache.keys
|
207
|
+
removed_specs = @db_spec_cache.values_at(*removed_dbs)
|
150
208
|
|
151
|
-
@
|
152
|
-
@
|
209
|
+
@host_spec_cache = new_host_spec_cache
|
210
|
+
@db_spec_cache = new_db_spec_cache
|
211
|
+
|
212
|
+
# Clean up connection handler cache.
|
213
|
+
removed_specs.each { |s| @connection_handlers.delete(handler_key(s)) }
|
214
|
+
end
|
215
|
+
|
216
|
+
def reload
|
217
|
+
@reload_mutex.synchronize do
|
218
|
+
load_config!
|
219
|
+
end
|
153
220
|
end
|
154
221
|
|
155
222
|
def has_db?(db)
|
@@ -171,11 +238,11 @@ module RailsMultisite
|
|
171
238
|
spec ||= @default_spec
|
172
239
|
handler = nil
|
173
240
|
if spec != @default_spec
|
174
|
-
handler = @connection_handlers[spec]
|
241
|
+
handler = @connection_handlers[handler_key(spec)]
|
175
242
|
unless handler
|
176
243
|
handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
177
244
|
handler_establish_connection(handler, spec)
|
178
|
-
@connection_handlers[spec] = handler
|
245
|
+
@connection_handlers[handler_key(spec)] = handler
|
179
246
|
end
|
180
247
|
else
|
181
248
|
handler = @default_connection_handler
|
@@ -313,11 +380,11 @@ module RailsMultisite
|
|
313
380
|
private
|
314
381
|
|
315
382
|
def handler_establish_connection(handler, spec)
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
383
|
+
handler.establish_connection(spec.config)
|
384
|
+
end
|
385
|
+
|
386
|
+
def handler_key(spec)
|
387
|
+
self.class.handler_key(spec)
|
321
388
|
end
|
322
389
|
|
323
390
|
end
|
@@ -7,20 +7,28 @@ module RailsMultisite
|
|
7
7
|
end
|
8
8
|
|
9
9
|
initializer "RailsMultisite.init" do |app|
|
10
|
-
|
10
|
+
app.config.multisite = false
|
11
11
|
|
12
12
|
config_file = ConnectionManagement.default_config_filename
|
13
13
|
if File.exist?(config_file)
|
14
14
|
ConnectionManagement.config_filename = ConnectionManagement.default_config_filename
|
15
|
-
|
15
|
+
app.config.multisite = true
|
16
16
|
Rails.logger.formatter = RailsMultisite::Formatter.new
|
17
|
-
|
18
|
-
app.
|
17
|
+
|
18
|
+
if !skip_middleware?(app.config)
|
19
|
+
app.middleware.insert_after(ActionDispatch::Executor, RailsMultisite::Middleware)
|
20
|
+
app.middleware.delete(ActionDispatch::Executor)
|
21
|
+
end
|
19
22
|
|
20
23
|
if ENV['RAILS_DB'].present?
|
21
24
|
ConnectionManagement.establish_connection(db: ENV['RAILS_DB'], raise_on_missing: true)
|
22
25
|
end
|
23
26
|
end
|
24
27
|
end
|
28
|
+
|
29
|
+
def skip_middleware?(config)
|
30
|
+
return false if !config.respond_to?(:skip_multisite_middleware)
|
31
|
+
config.skip_multisite_middleware
|
32
|
+
end
|
25
33
|
end
|
26
34
|
end
|
data/lib/tasks/db.rake
CHANGED
data/lib/tasks/generators.rake
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
desc "generate multisite config file (if missing)"
|
2
3
|
task "multisite:generate:config" => :environment do
|
3
4
|
filename = RailsMultisite::ConnectionManagement.config_filename
|
@@ -14,7 +15,6 @@ task "multisite:generate:config" => :environment do
|
|
14
15
|
# host: localhost
|
15
16
|
# pool: 5
|
16
17
|
# timeout: 5000
|
17
|
-
# db_id: 1 # optionally include other settings you need
|
18
18
|
# host_names:
|
19
19
|
# - www.mysite.com
|
20
20
|
# - www.anothersite.com
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_multisite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,40 +16,40 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '7'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '5.0'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '7'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: railties
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - ">"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '5.0'
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '7'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
49
|
+
version: '5.0'
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '
|
52
|
+
version: '7'
|
53
53
|
description: Multi tenancy support for Rails
|
54
54
|
email:
|
55
55
|
- sam.saffron@gmail.com
|
@@ -78,15 +78,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements:
|
79
79
|
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 2.
|
81
|
+
version: 2.4.0
|
82
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
84
|
- - ">="
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: '0'
|
87
87
|
requirements: []
|
88
|
-
|
89
|
-
rubygems_version: 2.7.6
|
88
|
+
rubygems_version: 3.0.3
|
90
89
|
signing_key:
|
91
90
|
specification_version: 4
|
92
91
|
summary: Multi tenancy support for Rails
|