postamt 0.9.0 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 34ca7a878f7cd7eb35c89e13148ff5bcc1ee9902
4
- data.tar.gz: 019233a57d48dcddfefd6ea65025e4a98d59ee78
3
+ metadata.gz: 0735b7ec645e87e9007592822f3e14bca2f4e810
4
+ data.tar.gz: 8b3f02abb5439a16c536fd3608c8d53147bc5f3d
5
5
  SHA512:
6
- metadata.gz: 40034cd7b4e0016401f4a98893b2e70a48556a340b9fe541e7693369eb039ea02f1e1c104ec9a81bb2a0b6becbb0e53f06fa1af3145ce4b993eb9bd4c348258b
7
- data.tar.gz: 2f7f090a657609cd192b44add07d8dd28e88773d299f6e8f792500f62f997d9917dfee86fa0192e2128f54381d6b126a108902a141919786169896c98cc87b55
6
+ metadata.gz: 0cf4b7e33e840638afa19a8fe57c49d4221f4974ff4407119fb7811d9b5b53eec0936298f9669dd34f38819a4c6b4d4b15afacfa8746eded03b505d75916bf25
7
+ data.tar.gz: a1cd70c63e0565966c399bdd52faecec71cfa932fd6948e4b491f76efb457713f3c02b5ef2df13102c864ed089c457ca684a2d40b8fc7b57f0790241edce516f
@@ -0,0 +1,7 @@
1
+ ## 0.9.1
2
+
3
+ Add support and test app for Rails 4.1.0.beta1.
4
+
5
+ ## 0.9.0
6
+
7
+ Initial release
data/README.md CHANGED
@@ -1,12 +1,31 @@
1
1
  # Postamt
2
2
 
3
- Performs (some of) your read-only queries on a hot standby.
3
+ [![Gem Version](https://badge.fury.io/rb/postamt.png)](http://rubygems.org/gems/postamt)
4
+
5
+ Postamt is a sane, Rails-4-ready solution for performing database
6
+ reads against a hot standby server.
7
+
8
+ Choose per model and/or controller&action whether a read-only query
9
+ should be sent to master or a hot standby.<br />
10
+ Inside a transaction reads always happen against master.
11
+
12
+ Care has been taken to avoid [common performance
13
+ pitfalls](http://charlie.bz/blog/things-that-clear-rubys-method-cache).
14
+ It's been battle tested in production at
15
+ [sauspiel.de](https://www.sauspiel.de/).
16
+
17
+ Monkey-patching is kept to an absolute minimum, the hard work happens
18
+ through [officially-supported Rails
19
+ APIs](https://github.com/rails/rails/commit/ba1544d71628abff2777c9c514142d7e9a159111#commitcomment-2106059).
20
+ That's why there's so little code compared to similar gems.
21
+
22
+ Postamt requires Rails 3.2+ and works with Rails 4.
4
23
 
5
24
  ## Installation
6
25
 
7
26
  Add this line to your application's Gemfile:
8
27
 
9
- gem 'pg_charmer'
28
+ gem 'postamt'
10
29
 
11
30
  ## Example usage
12
31
 
@@ -81,6 +100,37 @@ end
81
100
  Postamt.force_connection = :master
82
101
  ```
83
102
 
103
+ ## Tests
104
+
105
+ Create the DB `postamt_test` and ensure the users `master` and
106
+ `slave` exist:
107
+
108
+ ```
109
+ $ createdb postamt_test
110
+ $ createuser -s master # -s => superuser
111
+ $ createuser -s slave # better to restrict slave to be read-only
112
+ ```
113
+
114
+ Migrate the DB in the Rails 4 app:
115
+
116
+ ```
117
+ $ cd testapp # Rails 4
118
+ $ RAILS_ENV=test bundle exec rake db:migrate
119
+ ```
120
+
121
+ Run the tests on Rails 3.2 and Rails 4:
122
+
123
+ ```
124
+ $ cd testapp # Rails 4
125
+ $ bundle exec ruby -Itest test/integration/postamt_test.rb
126
+ $ cd testapp32 # Rails 3.2
127
+ $ bundle exec ruby -Itest test/integration/postamt_test.rb
128
+ ```
129
+
130
+ You can't run the tests via a simple `rake` because Postamt deactivates
131
+ itself when it detects that a task starting with 'db' is run (like
132
+ `db:test:prepare`)
133
+
84
134
  ## Contributing
85
135
 
86
136
  1. Fork it
@@ -88,3 +138,4 @@ Postamt.force_connection = :master
88
138
  3. Commit your changes (`git commit -am 'Add some feature'`)
89
139
  4. Push to the branch (`git push origin my-new-feature`)
90
140
  5. Create new Pull Request
141
+
@@ -42,7 +42,7 @@ module Postamt
42
42
  Thread.current[:postamt_overwritten_default_connections] ||= {}
43
43
  end
44
44
 
45
- if Rails::VERSION::MAJOR == 4 and Rails::VERSION::MINOR == 0
45
+ if Rails::VERSION::MAJOR == 4 and Rails::VERSION::MINOR <= 1
46
46
  Postamt::ConnectionSpecificationResolver = ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
47
47
  elsif Rails::VERSION::MAJOR == 3 and Rails::VERSION::MINOR == 2
48
48
  Postamt::ConnectionSpecificationResolver = ActiveRecord::Base::ConnectionSpecification::Resolver
@@ -52,7 +52,7 @@ module Postamt
52
52
 
53
53
  # Called by Postamt::Railtie
54
54
  def self.hook!
55
- if Rails::VERSION::MAJOR == 4 and Rails::VERSION::MINOR == 0
55
+ if Rails::VERSION::MAJOR == 4 and Rails::VERSION::MINOR <= 1
56
56
  ActiveRecord::Base.default_connection_handler = Postamt::ConnectionHandler.new
57
57
  elsif Rails::VERSION::MAJOR == 3 and Rails::VERSION::MINOR == 2
58
58
  ActiveRecord::Base.connection_handler = Postamt::ConnectionHandler.new
@@ -96,16 +96,40 @@ module Postamt
96
96
  alias_method_chain :update_all, :postamt
97
97
  end
98
98
 
99
+ ActiveRecord::LogSubscriber.class_eval do
100
+ attr_accessor :connection_name
101
+
102
+ def sql_with_connection_name(event)
103
+ self.connection_name = ObjectSpace._id2ref(event.payload[:connection_id]).instance_variable_get(:@config)[:username]
104
+ sql_without_connection_name(event)
105
+ end
106
+
107
+ def debug_with_connection_name(msg)
108
+ conn = connection_name ? color(" [#{connection_name}]", ActiveSupport::LogSubscriber::BLUE, true) : ''
109
+ debug_without_connection_name(conn + msg)
110
+ end
111
+
112
+ # TODO: Switch to Module#prepend once we are Ruby-2.0.0-onlhy
113
+ alias_method_chain :sql, :connection_name
114
+ alias_method_chain :debug, :connection_name
115
+ end
116
+
99
117
  ActionController::Base.instance_eval do
100
118
  def use_db_connection(connection, args)
101
- default_connections = {}
102
119
  klass_names = args.delete(:for)
103
- klass_names.each do |klass_name|
104
- default_connections[klass_name] = connection
105
- end
106
-
107
- before_filter(args) do |controller|
108
- Postamt.overwritten_default_connections.merge!(default_connections)
120
+ if klass_names == :all
121
+ around_filter(args) do |controller|
122
+ Postamt.on(connection) { yield }
123
+ end
124
+ else
125
+ default_connections = {}
126
+ klass_names.each do |klass_name|
127
+ default_connections[klass_name] = connection
128
+ end
129
+
130
+ before_filter(args) do |controller|
131
+ Postamt.overwritten_default_connections.merge!(default_connections)
132
+ end
109
133
  end
110
134
  end
111
135
 
@@ -2,8 +2,13 @@ module Postamt
2
2
  class Railtie < Rails::Railtie
3
3
  railtie_name "postamt"
4
4
 
5
+ attr_accessor :running_in_rake
6
+ rake_tasks do
7
+ self.running_in_rake = true
8
+ end
9
+
5
10
  initializer "postamt.hook", before: "active_record.initialize_database" do |app|
6
- if (defined?($rails_rake_task) && $rails_rake_task)
11
+ if self.running_in_rake
7
12
  # We mustn't hook into AR when db:migrate or db:test:load_schema
8
13
  # run, but user-defined Rake tasks still need us
9
14
  task_names = []
@@ -13,7 +18,17 @@ module Postamt
13
18
  task_names << task.name
14
19
  tasks_to_examine += task.prerequisite_tasks
15
20
  end
16
- next if task_names.any? { |task_name| task_name.start_with? "db:" }
21
+ if task_names.any? { |task_name| task_name.start_with? "db:" }
22
+ # Stub out Postamt's monkeypatches if we're running in a Rake task
23
+ ActionController::Base.instance_eval do
24
+ def use_db_connection(connection, args)
25
+ end
26
+ end
27
+ ActiveRecord::Base.instance_eval do
28
+ class_attribute :default_connection
29
+ end
30
+ next
31
+ end
17
32
  end
18
33
  Postamt.hook!
19
34
  end
@@ -1,3 +1,3 @@
1
1
  module Postamt
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -6,8 +6,8 @@ require 'postamt/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "postamt"
8
8
  spec.version = Postamt::VERSION
9
- spec.authors = ["Martin Schürrer"]
10
- spec.email = ["martin@schuerrer.org"]
9
+ spec.authors = ["Martin Schürrer", "Martin Kavalar"]
10
+ spec.email = ["martin@schuerrer.org", "martin@sauspiel.de"]
11
11
  spec.description = %q{Choose per model and/or controller&action whether a read-only query should be sent to master or a hot standby. Or just use Postamt.on(:slave) { ... }. }
12
12
  spec.summary = %q{Performs (some of) your read-only queries on a hot standby}
13
13
  spec.homepage = "https://github.com/sauspiel/postamt"
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "thread_safe", "~> 0.1"
22
- spec.add_dependency "railties", [">= 3.2.0", "< 4.1.0"]
22
+ spec.add_dependency "railties", [">= 3.2.0", "<= 4.1.0"]
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
25
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postamt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Schürrer
8
+ - Martin Kavalar
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-04-16 00:00:00.000000000 Z
12
+ date: 2014-01-06 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: thread_safe
@@ -31,7 +32,7 @@ dependencies:
31
32
  - - '>='
32
33
  - !ruby/object:Gem::Version
33
34
  version: 3.2.0
34
- - - <
35
+ - - <=
35
36
  - !ruby/object:Gem::Version
36
37
  version: 4.1.0
37
38
  type: :runtime
@@ -41,7 +42,7 @@ dependencies:
41
42
  - - '>='
42
43
  - !ruby/object:Gem::Version
43
44
  version: 3.2.0
44
- - - <
45
+ - - <=
45
46
  - !ruby/object:Gem::Version
46
47
  version: 4.1.0
47
48
  - !ruby/object:Gem::Dependency
@@ -77,11 +78,13 @@ description: 'Choose per model and/or controller&action whether a read-only quer
77
78
  }. '
78
79
  email:
79
80
  - martin@schuerrer.org
81
+ - martin@sauspiel.de
80
82
  executables: []
81
83
  extensions: []
82
84
  extra_rdoc_files: []
83
85
  files:
84
86
  - .gitignore
87
+ - CHANGELOG.md
85
88
  - Gemfile
86
89
  - LICENSE.txt
87
90
  - README.md
@@ -111,9 +114,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
114
  version: '0'
112
115
  requirements: []
113
116
  rubyforge_project:
114
- rubygems_version: 2.0.3
117
+ rubygems_version: 2.0.14
115
118
  signing_key:
116
119
  specification_version: 4
117
120
  summary: Performs (some of) your read-only queries on a hot standby
118
121
  test_files: []
119
- has_rdoc: