advanced_connection 0.5.1
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 +7 -0
- data/.document +5 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/.travis.yml +63 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +218 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +165 -0
- data/advanced_connection.gemspec +49 -0
- data/gemfiles/jruby/rails4_1.gemfile +7 -0
- data/gemfiles/jruby/rails4_2.gemfile +7 -0
- data/gemfiles/ruby/rails4_1.gemfile +7 -0
- data/gemfiles/ruby/rails4_2.gemfile +7 -0
- data/lib/advanced_connection/active_record_ext/abstract_adapter/statement_pooling.rb +121 -0
- data/lib/advanced_connection/active_record_ext/abstract_adapter.rb +48 -0
- data/lib/advanced_connection/active_record_ext/connection_pool/idle_manager.rb +271 -0
- data/lib/advanced_connection/active_record_ext/connection_pool/queues.rb +60 -0
- data/lib/advanced_connection/active_record_ext/connection_pool/statement_pooling.rb +42 -0
- data/lib/advanced_connection/active_record_ext/connection_pool/without_connection.rb +93 -0
- data/lib/advanced_connection/active_record_ext/connection_pool.rb +38 -0
- data/lib/advanced_connection/active_record_ext/without_connection.rb +30 -0
- data/lib/advanced_connection/active_record_ext.rb +59 -0
- data/lib/advanced_connection/config.rb +247 -0
- data/lib/advanced_connection/error.rb +27 -0
- data/lib/advanced_connection/railtie.rb +40 -0
- data/lib/advanced_connection/version.rb +29 -0
- data/lib/advanced_connection.rb +65 -0
- data/lib/generators/advanced_connection/install/USAGE +5 -0
- data/lib/generators/advanced_connection/install/install_generator.rb +30 -0
- data/lib/generators/advanced_connection/install/templates/advanced_connection.rb +142 -0
- data/lib/tasks/advanced_connection_tasks.rake +25 -0
- data/spec/config/database.yml +18 -0
- data/spec/config/database.yml.erb +54 -0
- data/spec/dummy/.gitignore +1 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/book.rb +2 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +13 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +17 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +48 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/advanced_connection.rb +142 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20160222045238_create_books.rb +10 -0
- data/spec/dummy/db/schema.rb +23 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/log/test.log +327 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/test/fixtures/books.yml +9 -0
- data/spec/dummy/test/models/book_test.rb +7 -0
- data/spec/idle_manager_spec.rb +16 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/db_config.rb +61 -0
- metadata +399 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
module AdvancedConnection
|
23
|
+
class Error < StandardError
|
24
|
+
class ConfigError < Error; end
|
25
|
+
class UnableToReleaseConnection < Error; end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
module AdvancedConnection
|
23
|
+
class Railtie < Rails::Railtie
|
24
|
+
config.advanced_connection = ActiveSupport::OrderedOptions.new
|
25
|
+
|
26
|
+
ActiveSupport.on_load(:before_initialize) do
|
27
|
+
ActiveSupport.on_load(:active_record) do
|
28
|
+
# load our intitializer ASAP so we can make use of user defined configuration
|
29
|
+
load Rails.root.join('config', 'initializers', 'advanced_connection.rb')
|
30
|
+
ActiveRecord::Base.send(:include, AdvancedConnection::ActiveRecordExt)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
config.after_initialize do
|
35
|
+
if AdvancedConnection.enable_idle_connection_manager && AdvancedConnection.warmup_connections
|
36
|
+
ActiveRecord::Base.connection_handler.connection_pool_list.each(&:warmup_connections)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
module AdvancedConnection
|
23
|
+
MAJOR = 0
|
24
|
+
MINOR = 5
|
25
|
+
PATCH = 1
|
26
|
+
|
27
|
+
VERSION = "%d.%d.%d" % [ MAJOR, MINOR, PATCH ]
|
28
|
+
GEM_VERSION = Gem::Version.new(VERSION)
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
require 'active_record'
|
23
|
+
require 'active_support/concern'
|
24
|
+
require 'active_support/hash_with_indifferent_access'
|
25
|
+
require 'advanced_connection/version'
|
26
|
+
require 'singleton'
|
27
|
+
require 'logger'
|
28
|
+
|
29
|
+
module AdvancedConnection
|
30
|
+
extend ActiveSupport::Autoload
|
31
|
+
|
32
|
+
eager_autoload do
|
33
|
+
autoload :ActiveRecordExt
|
34
|
+
autoload :Config
|
35
|
+
autoload :Error
|
36
|
+
end
|
37
|
+
|
38
|
+
class << self
|
39
|
+
def to_h
|
40
|
+
config.to_h
|
41
|
+
end
|
42
|
+
|
43
|
+
def configure(overwrite = true)
|
44
|
+
return unless overwrite
|
45
|
+
(yield config).tap {
|
46
|
+
config.loaded!
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def config
|
51
|
+
@config ||= Config.instance
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing(method, *args, &block)
|
55
|
+
return super unless config.respond_to? method
|
56
|
+
config.public_send(method, *args, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
def respond_to_missing?(method, include_private = false)
|
60
|
+
config.respond_to?(method) || super
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
require 'advanced_connection/railtie' if defined?(Rails)
|
65
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
module AdvancedConnection
|
23
|
+
class InstallGenerator < Rails::Generators::Base
|
24
|
+
source_root File.expand_path('../templates', __FILE__)
|
25
|
+
|
26
|
+
def copy_files
|
27
|
+
template "advanced_connection.rb", File.join("config", "initializers", "advanced_connection.rb")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
#
|
2
|
+
# Advanced Connection Configuration
|
3
|
+
#
|
4
|
+
AdvancedConnection.configure do |config|
|
5
|
+
#
|
6
|
+
## Idle Manager
|
7
|
+
#
|
8
|
+
# Enabling this will enable idle connection management. This allows you to specify settings
|
9
|
+
# to enable automatic warmup of connections on rails startup, min/max idle connections and
|
10
|
+
# idle connection culling.
|
11
|
+
# config.enable_idle_connection_manager = <%= AdvancedConnection::Config::DEFAULT_CONFIG.enable_idle_connection_manager.inspect %>
|
12
|
+
|
13
|
+
# Pool queue type determines both how free connections will be checkout out
|
14
|
+
# of the pool, as well as how idle connections will be culled. The options are:
|
15
|
+
#
|
16
|
+
# :fifo - All connections will have an equal opportunity to be used and culled (default)
|
17
|
+
# :lifo/:stack - More frequently used connections will be reused, leaving less frequently used
|
18
|
+
# connections to be culled
|
19
|
+
# :prefer_older - Longer lived connections will tend to stick around longer, with younger
|
20
|
+
# connections being culled
|
21
|
+
# :prefer_younger - Younger lived connections will tend to stick around longer, with older
|
22
|
+
# connections being culled
|
23
|
+
#
|
24
|
+
# config.connection_pool_queue_type = <%= AdvancedConnection::Config::DEFAULT_CONFIG.connection_pool_queue_type.inspect %>
|
25
|
+
|
26
|
+
# How many connections to prestart on initial startup of rails. This can
|
27
|
+
# help to reduce the time it takes a restarted production node to start
|
28
|
+
# responding again.
|
29
|
+
#
|
30
|
+
# config.warmup_connections = <%= AdvancedConnection::Config::DEFAULT_CONFIG.warmup_connections.inspect %>
|
31
|
+
|
32
|
+
# Minimum number of connection to keep idle. If, during the idle check, you have fewer
|
33
|
+
# than this many connections idle, then a number of new connections will be created
|
34
|
+
# up to this this number.
|
35
|
+
#
|
36
|
+
# config.min_idle_connections = <%= AdvancedConnection::Config::DEFAULT_CONFIG.min_idle_connections.inspect %>
|
37
|
+
|
38
|
+
# Maximum number of connections that can remain idle without being culled. If you have
|
39
|
+
# more idle conections than this, only the difference between the total idle and this
|
40
|
+
# maximum will be culled.
|
41
|
+
#
|
42
|
+
# config.max_idle_connections = ::Float::INFINITY
|
43
|
+
|
44
|
+
# How long (in seconds) a connection can remain idle before being culled
|
45
|
+
#
|
46
|
+
# config.max_idle_time = 90
|
47
|
+
|
48
|
+
# How many seconds between idle checks (defaults to max_idle_time)
|
49
|
+
#
|
50
|
+
# config.idle_check_interval = 90
|
51
|
+
|
52
|
+
#
|
53
|
+
## Without Connection
|
54
|
+
#
|
55
|
+
# Enabling this will add a new method to ActiveRecord::Base that allows you to
|
56
|
+
# mark a block of code as not requiring a connection. This can be useful in reducing
|
57
|
+
# pressure on the pool, especially when you have sections of code that make
|
58
|
+
# potentially long-lived external requests. E.g.,
|
59
|
+
#
|
60
|
+
# require 'open-uri'
|
61
|
+
# results = ActiveRecord::Base.without_connection do
|
62
|
+
# open('http://some-slow-site.com/api/foo')
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# During the call to the remote site, the db connection is checked in and subsequently
|
66
|
+
# checked back out once the block finishes.
|
67
|
+
#
|
68
|
+
# To enable this feature, uncomment the following:
|
69
|
+
#
|
70
|
+
# config.enable_without_connection = true
|
71
|
+
#
|
72
|
+
# WARNING: this feature cannot be enabled with Statement Pooling.
|
73
|
+
#
|
74
|
+
# Additionally, you can hook into the checkin / chekcout lifecycle by way of callbacks. This
|
75
|
+
# can be extremely useful when employing something like Apartment to manage switching
|
76
|
+
# between tenants.
|
77
|
+
#
|
78
|
+
# config.without_connection_callbacks = {
|
79
|
+
# # runs right before the connection is checked back into the pool
|
80
|
+
# before: ->() { },
|
81
|
+
# around: ->(&block) {
|
82
|
+
# tenant = Apartment::Tenant.current
|
83
|
+
# block.call
|
84
|
+
# Apartment::Tenant.switch(tenant)
|
85
|
+
# },
|
86
|
+
# # runs right after the connection is checked back out of the pool
|
87
|
+
# after: ->() { }
|
88
|
+
# }
|
89
|
+
#
|
90
|
+
## Statement Pooling
|
91
|
+
#
|
92
|
+
# **** WARNING **** EXPERIMENTAL **** WARNING **** EXPERIMENTAL ****
|
93
|
+
#
|
94
|
+
# THIS FEATURE IS HIGHLY EXPERIMENTAL AND PRONE TO FAILURE. DO NOT USE UNLESS
|
95
|
+
# YOU PLAN TO AIDE IN IT'S DEVELOPMENT.
|
96
|
+
#
|
97
|
+
# When enabled, this feature causes your connections to immediately be returned to
|
98
|
+
# the pool upon completion of each query (with the exception of transactions, where
|
99
|
+
# the connection is returned after transaction commit/rollback). This can help to
|
100
|
+
# reduce pressure on the pool, as well as the number of the connections to the
|
101
|
+
# backend by making more efficient use of existing connections.
|
102
|
+
#
|
103
|
+
# WARNING: this cannot be enabled with Without Connection.
|
104
|
+
#
|
105
|
+
# To enable, simply uncomment the following:
|
106
|
+
#
|
107
|
+
# config.enable_statement_pooling = true
|
108
|
+
#
|
109
|
+
# Additionally, callbacks are provided around the connection checkin. This can
|
110
|
+
# be extremely useful when in a multi-tenant situation using something like
|
111
|
+
# Apartment, e.g.:
|
112
|
+
#
|
113
|
+
# lib/apartment/elevators/my_elevator.rb:
|
114
|
+
# module Apartment::Elevators
|
115
|
+
# class MyElevator < Generic
|
116
|
+
# def call(env)
|
117
|
+
# super
|
118
|
+
# ensure
|
119
|
+
# Thread.current[:tenant] = nil
|
120
|
+
# Apartment::Tenant.reset
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# def parse_tenant_name(request)
|
124
|
+
# request.host.split('.').first.tap do |tenant|
|
125
|
+
# Thread.current[:tenant] = tenant
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
# . . .
|
130
|
+
# end
|
131
|
+
#
|
132
|
+
# and then set your statement_pooling_callbacks like so:
|
133
|
+
#
|
134
|
+
# config.statement_pooling_callbacks = {
|
135
|
+
# # switch back to the stored tenant prior to executing sql
|
136
|
+
# before: ->() {
|
137
|
+
# if Thread.current[:tenant]
|
138
|
+
# Apartment::Tenant.switch(Thread.current[:tenant])
|
139
|
+
# end
|
140
|
+
# }
|
141
|
+
# }
|
142
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2016 Finalsite, LLC
|
3
|
+
# Copyright (C) 2016 Carl P. Corliss <carl.corliss@finalsite.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# desc "Explaining what the task does"
|
23
|
+
# task :advanced_connection do
|
24
|
+
# # Task goes here
|
25
|
+
# end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
default: &default
|
2
|
+
adapter: postgresql
|
3
|
+
database: advanced_connection_test
|
4
|
+
<%- if RUBY_ENGINE == 'jruby' -%>
|
5
|
+
driver: org.postgresql.Driver
|
6
|
+
url: jdbc:postgresql://localhost:5432/advanced_connection_test
|
7
|
+
<%- end -%>
|
8
|
+
pool: 50
|
9
|
+
timeout: 5000
|
10
|
+
pool_queue_type: lifo
|
11
|
+
max_idle_time: 5
|
12
|
+
max_idle_connections: 10
|
13
|
+
min_idle_connections: 5
|
14
|
+
prestart_connections: 10
|
15
|
+
dead_connection_timeout: 30
|
16
|
+
|
17
|
+
test:
|
18
|
+
<<: *default
|
@@ -0,0 +1,54 @@
|
|
1
|
+
default: &default
|
2
|
+
pool: 20
|
3
|
+
timeout: 5000
|
4
|
+
pool_queue_type: fifo
|
5
|
+
max_idle_time: 5
|
6
|
+
min_idle_connections: 5
|
7
|
+
max_idle_connections: 10
|
8
|
+
prestart_connections: 10
|
9
|
+
dead_connection_timeout: 30
|
10
|
+
|
11
|
+
default_mysql: &default_mysql
|
12
|
+
<<: *default
|
13
|
+
adapter: mysql2
|
14
|
+
database: advanced_connection_test
|
15
|
+
username: root
|
16
|
+
min_messages: WARNING
|
17
|
+
|
18
|
+
default_postgresql: &default_postgresql
|
19
|
+
<<: *default
|
20
|
+
adapter: postgresql
|
21
|
+
database: advanced_connection_test
|
22
|
+
username: postgres
|
23
|
+
min_messages: WARNING
|
24
|
+
|
25
|
+
<% if defined?(JRUBY_VERSION) %>
|
26
|
+
connections:
|
27
|
+
postgresql:
|
28
|
+
<<: *default_postgresql
|
29
|
+
driver: org.postgresql.Driver
|
30
|
+
url: jdbc:postgresql://localhost:5432/advanced_connection_test
|
31
|
+
|
32
|
+
mysql:
|
33
|
+
<<: *default_mysql
|
34
|
+
adapter: mysql
|
35
|
+
driver: com.mysql.jdbc.Driver
|
36
|
+
url: jdbc:mysql://localhost:3306/advanced_connection_test
|
37
|
+
|
38
|
+
<% else %>
|
39
|
+
connections:
|
40
|
+
postgresql:
|
41
|
+
<<: *default_postgresql
|
42
|
+
schema_search_path: public
|
43
|
+
password:
|
44
|
+
|
45
|
+
mysql:
|
46
|
+
<<: *default_mysql
|
47
|
+
adapter: mysql2
|
48
|
+
password:
|
49
|
+
|
50
|
+
sqlite:
|
51
|
+
<<: *default
|
52
|
+
adapter: sqlite3
|
53
|
+
database: <%= File.expand_path('../spec/dummy/db', __FILE__) %>/default.sqlite3
|
54
|
+
<% end %>
|