dbhijacker 0.8.3 → 0.9.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.
- data/Gemfile.lock +7 -7
- data/dbhijacker.gemspec +1 -1
- data/lib/hijacker.rb +30 -31
- metadata +36 -20
- checksums.yaml +0 -7
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dbhijacker (0.
|
4
|
+
dbhijacker (0.9.0)
|
5
5
|
rails (>= 2.3.14)
|
6
6
|
|
7
7
|
GEM
|
@@ -43,10 +43,10 @@ PLATFORMS
|
|
43
43
|
ruby
|
44
44
|
|
45
45
|
DEPENDENCIES
|
46
|
-
bundler (
|
46
|
+
bundler (>= 1.3)
|
47
47
|
dbhijacker!
|
48
|
-
rack (
|
49
|
-
rack-test (
|
50
|
-
rake (
|
51
|
-
rspec (
|
52
|
-
sqlite3 (
|
48
|
+
rack (>= 1.1.0)
|
49
|
+
rack-test (>= 0.6.1)
|
50
|
+
rake (>= 0.9.2)
|
51
|
+
rspec (>= 2.8)
|
52
|
+
sqlite3 (>= 1.3.5)
|
data/dbhijacker.gemspec
CHANGED
data/lib/hijacker.rb
CHANGED
@@ -24,7 +24,7 @@ module Hijacker
|
|
24
24
|
#
|
25
25
|
# Background: every time rails gets information
|
26
26
|
# from the database, it uses the last established connection. So,
|
27
|
-
# although we've already established a connection to a
|
27
|
+
# although we've already established a connection to a root db
|
28
28
|
# ("crystal", in this case), if we establish a new connection, all
|
29
29
|
# subsequent database calls will use these settings instead (well,
|
30
30
|
# until it's called again when it gets another request).
|
@@ -44,9 +44,7 @@ module Hijacker
|
|
44
44
|
return "Already connected to #{target_name}"
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
database = determine_database(target_name, sister_name, verify)
|
47
|
+
database = determine_database(target_name, sister_name)
|
50
48
|
|
51
49
|
establish_connection_to_database(database)
|
52
50
|
|
@@ -63,7 +61,8 @@ module Hijacker
|
|
63
61
|
# don't cache sister site
|
64
62
|
cache_database_route(target_name, database) unless sister_name
|
65
63
|
|
66
|
-
|
64
|
+
# Do this even on a site without a master so we reconnect these models
|
65
|
+
connect_sister_site_models(database.master || database)
|
67
66
|
|
68
67
|
reenable_query_caching
|
69
68
|
|
@@ -80,29 +79,33 @@ module Hijacker
|
|
80
79
|
|
81
80
|
# very small chance this will raise, but if it does, we will still handle it the
|
82
81
|
# same as +Hijacker.connect+ so we don't lock up the app.
|
83
|
-
#
|
82
|
+
#
|
84
83
|
# Also note that sister site models share a connection via minor management of
|
85
84
|
# AR's connection_pool stuff, and will use ActiveRecord::Base.connection_pool if
|
86
85
|
# we're not in a sister-site situation
|
87
|
-
def self.connect_sister_site_models(
|
88
|
-
|
89
|
-
|
86
|
+
def self.connect_sister_site_models(master_database)
|
87
|
+
master_db_connection_pool = if processing_sister_site?
|
88
|
+
nil
|
89
|
+
else
|
90
|
+
ActiveRecord::Base.connection_pool
|
91
|
+
end
|
92
|
+
master_config = connection_config(master_database)
|
93
|
+
|
94
|
+
config[:sister_site_models].each do |model_name|
|
95
|
+
klass = model_name.constantize
|
90
96
|
|
91
|
-
|
92
|
-
self.config[:sister_site_models].each do |model_name|
|
93
|
-
ar_model = model_name.constantize
|
97
|
+
klass.establish_connection(master_config)
|
94
98
|
|
95
|
-
if !
|
96
|
-
ar_model.establish_connection(connection_config(database))
|
99
|
+
if !master_db_connection_pool
|
97
100
|
begin
|
98
|
-
|
101
|
+
klass.connection
|
99
102
|
rescue
|
100
|
-
|
101
|
-
raise Hijacker::InvalidDatabase,
|
103
|
+
klass.establish_connection(root_config)
|
104
|
+
raise Hijacker::InvalidDatabase, database.name
|
102
105
|
end
|
103
|
-
|
106
|
+
master_db_connection_pool = klass.connection_pool
|
104
107
|
else
|
105
|
-
ActiveRecord::Base.connection_handler.connection_pools[model_name] =
|
108
|
+
ActiveRecord::Base.connection_handler.connection_pools[model_name] = master_db_connection_pool
|
106
109
|
end
|
107
110
|
end
|
108
111
|
end
|
@@ -110,20 +113,21 @@ module Hijacker
|
|
110
113
|
# connects the sister_site_models to +db+ while calling the block
|
111
114
|
# if +db+ and self.master differ
|
112
115
|
def self.temporary_sister_connect(db, &block)
|
113
|
-
processing_sister_site = (db !=
|
116
|
+
processing_sister_site = (db != master && db != sister)
|
114
117
|
self.sister = db if processing_sister_site
|
115
118
|
self.connect_sister_site_models(db) if processing_sister_site
|
116
119
|
result = block.call
|
117
120
|
self.connect_sister_site_models(self.master) if processing_sister_site
|
118
121
|
self.sister = nil if processing_sister_site
|
119
|
-
|
122
|
+
|
123
|
+
result
|
120
124
|
end
|
121
125
|
|
122
|
-
# maintains and returns a connection to the
|
126
|
+
# maintains and returns a connection to the root database.
|
123
127
|
#
|
124
128
|
# The advantage of using this over just calling
|
125
129
|
# ActiveRecord::Base.establish_connection (without arguments) to reconnect
|
126
|
-
# to the
|
130
|
+
# to the root database is that reusing the same connection greatly reduces
|
127
131
|
# context switching overhead etc involved with establishing a connection to
|
128
132
|
# the database. It may seem trivial, but it actually seems to speed things
|
129
133
|
# up by ~ 1/3 for already fast requests (probably less noticeable on slower
|
@@ -139,7 +143,7 @@ module Hijacker
|
|
139
143
|
ActiveRecord::Base.establish_connection(current_config) # reconnect, we don't intend to hijack
|
140
144
|
end
|
141
145
|
|
142
|
-
|
146
|
+
$hijacker_root_connection
|
143
147
|
end
|
144
148
|
|
145
149
|
def self.root_config
|
@@ -161,18 +165,13 @@ module Hijacker
|
|
161
165
|
end
|
162
166
|
|
163
167
|
def self.master
|
164
|
-
@master || database_configurations.fetch(ENV['RAILS_ENV'] ||
|
168
|
+
@master || database_configurations.fetch(ENV['RAILS_ENV'] || Rails.env)['database']
|
165
169
|
end
|
166
170
|
|
167
171
|
def self.current_client
|
168
172
|
sister || master
|
169
173
|
end
|
170
174
|
|
171
|
-
def self.do_hijacking?
|
172
|
-
(Hijacker.config[:hosted_environments] || %w[staging production]).
|
173
|
-
include?(ENV['RAILS_ENV'])
|
174
|
-
end
|
175
|
-
|
176
175
|
# just calling establish_connection doesn't actually check to see if
|
177
176
|
# we've established a VALID connection. a call to connection will check
|
178
177
|
# this, and throw an error if the connection's invalid. It is important
|
@@ -192,7 +191,7 @@ private
|
|
192
191
|
current_client == new_master && sister == new_sister
|
193
192
|
end
|
194
193
|
|
195
|
-
def self.determine_database(target_name, sister_name
|
194
|
+
def self.determine_database(target_name, sister_name)
|
196
195
|
if sister_name
|
197
196
|
database = Hijacker::Database.find_by_name(sister_name)
|
198
197
|
raise(Hijacker::InvalidDatabase, sister_name) if database.nil?
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbhijacker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Michael Xavier
|
@@ -15,99 +16,113 @@ dependencies:
|
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: rails
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
18
20
|
requirements:
|
19
|
-
- - '>='
|
21
|
+
- - ! '>='
|
20
22
|
- !ruby/object:Gem::Version
|
21
23
|
version: 2.3.14
|
22
24
|
type: :runtime
|
23
25
|
prerelease: false
|
24
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
25
28
|
requirements:
|
26
|
-
- - '>='
|
29
|
+
- - ! '>='
|
27
30
|
- !ruby/object:Gem::Version
|
28
31
|
version: 2.3.14
|
29
32
|
- !ruby/object:Gem::Dependency
|
30
33
|
name: bundler
|
31
34
|
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
32
36
|
requirements:
|
33
|
-
- - '>='
|
37
|
+
- - ! '>='
|
34
38
|
- !ruby/object:Gem::Version
|
35
39
|
version: '1.3'
|
36
40
|
type: :development
|
37
41
|
prerelease: false
|
38
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
39
44
|
requirements:
|
40
|
-
- - '>='
|
45
|
+
- - ! '>='
|
41
46
|
- !ruby/object:Gem::Version
|
42
47
|
version: '1.3'
|
43
48
|
- !ruby/object:Gem::Dependency
|
44
49
|
name: rake
|
45
50
|
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
46
52
|
requirements:
|
47
|
-
- - '>='
|
53
|
+
- - ! '>='
|
48
54
|
- !ruby/object:Gem::Version
|
49
55
|
version: 0.9.2
|
50
56
|
type: :development
|
51
57
|
prerelease: false
|
52
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
53
60
|
requirements:
|
54
|
-
- - '>='
|
61
|
+
- - ! '>='
|
55
62
|
- !ruby/object:Gem::Version
|
56
63
|
version: 0.9.2
|
57
64
|
- !ruby/object:Gem::Dependency
|
58
65
|
name: rack-test
|
59
66
|
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
60
68
|
requirements:
|
61
|
-
- - '>='
|
69
|
+
- - ! '>='
|
62
70
|
- !ruby/object:Gem::Version
|
63
71
|
version: 0.6.1
|
64
72
|
type: :development
|
65
73
|
prerelease: false
|
66
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
67
76
|
requirements:
|
68
|
-
- - '>='
|
77
|
+
- - ! '>='
|
69
78
|
- !ruby/object:Gem::Version
|
70
79
|
version: 0.6.1
|
71
80
|
- !ruby/object:Gem::Dependency
|
72
81
|
name: rack
|
73
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
74
84
|
requirements:
|
75
|
-
- - '>='
|
85
|
+
- - ! '>='
|
76
86
|
- !ruby/object:Gem::Version
|
77
87
|
version: 1.1.0
|
78
88
|
type: :development
|
79
89
|
prerelease: false
|
80
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
81
92
|
requirements:
|
82
|
-
- - '>='
|
93
|
+
- - ! '>='
|
83
94
|
- !ruby/object:Gem::Version
|
84
95
|
version: 1.1.0
|
85
96
|
- !ruby/object:Gem::Dependency
|
86
97
|
name: rspec
|
87
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
88
100
|
requirements:
|
89
|
-
- - '>='
|
101
|
+
- - ! '>='
|
90
102
|
- !ruby/object:Gem::Version
|
91
103
|
version: '2.8'
|
92
104
|
type: :development
|
93
105
|
prerelease: false
|
94
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
95
108
|
requirements:
|
96
|
-
- - '>='
|
109
|
+
- - ! '>='
|
97
110
|
- !ruby/object:Gem::Version
|
98
111
|
version: '2.8'
|
99
112
|
- !ruby/object:Gem::Dependency
|
100
113
|
name: sqlite3
|
101
114
|
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
|
-
- - '>='
|
117
|
+
- - ! '>='
|
104
118
|
- !ruby/object:Gem::Version
|
105
119
|
version: 1.3.5
|
106
120
|
type: :development
|
107
121
|
prerelease: false
|
108
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
109
124
|
requirements:
|
110
|
-
- - '>='
|
125
|
+
- - ! '>='
|
111
126
|
- !ruby/object:Gem::Version
|
112
127
|
version: 1.3.5
|
113
128
|
description: Allows a single Rails appliation to access many different databases
|
@@ -142,27 +157,28 @@ files:
|
|
142
157
|
homepage: https://github.com/crystalcommerce/hijacker
|
143
158
|
licenses:
|
144
159
|
- MIT
|
145
|
-
metadata: {}
|
146
160
|
post_install_message:
|
147
161
|
rdoc_options:
|
148
162
|
- --charset=UTF-8
|
149
163
|
require_paths:
|
150
164
|
- lib
|
151
165
|
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
152
167
|
requirements:
|
153
|
-
- - '>='
|
168
|
+
- - ! '>='
|
154
169
|
- !ruby/object:Gem::Version
|
155
170
|
version: '0'
|
156
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
|
+
none: false
|
157
173
|
requirements:
|
158
|
-
- - '>='
|
174
|
+
- - ! '>='
|
159
175
|
- !ruby/object:Gem::Version
|
160
176
|
version: '0'
|
161
177
|
requirements: []
|
162
178
|
rubyforge_project:
|
163
|
-
rubygems_version:
|
179
|
+
rubygems_version: 1.8.25
|
164
180
|
signing_key:
|
165
|
-
specification_version:
|
181
|
+
specification_version: 3
|
166
182
|
summary: One application, multiple client databases
|
167
183
|
test_files:
|
168
184
|
- spec/hijacker/alias_spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 5e23b73c48be348d0c277a5f2753847a227e3a3e
|
4
|
-
data.tar.gz: 3685236e56248cb7d1a06069d890d8dcc8d0a9cd
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 6c3624189638fab27821c39a4d6070c633cc952596c2177ee379882d8978580ec6cfea12a5a29282ce5a2bbf797ff529b55430e5da957db45af49659304436e5
|
7
|
-
data.tar.gz: 83522e3c058a48ec43d7681d2ff5c755a517b97fd73cbfbf8bc4ed2af79d760b4b9600b6f33b970db8bd425e60e6a7bbe024b43427c783d2b54f8ec4dc9c4602
|