fresh_connection 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/Appraisals +17 -0
  4. data/README.md +72 -8
  5. data/Rakefile +5 -0
  6. data/fresh_connection.gemspec +6 -1
  7. data/gemfiles/rails3.gemfile +9 -0
  8. data/gemfiles/rails40.gemfile +9 -0
  9. data/gemfiles/rails41.gemfile +9 -0
  10. data/lib/fresh_connection.rb +39 -9
  11. data/lib/fresh_connection/abstract_connection_manager.rb +4 -1
  12. data/lib/fresh_connection/access_control.rb +56 -0
  13. data/lib/fresh_connection/connection_manager.rb +2 -2
  14. data/lib/fresh_connection/extend/ar_base.rb +47 -0
  15. data/lib/fresh_connection/extend/ar_relation.rb +44 -0
  16. data/lib/fresh_connection/extend/connection_handler.rb +16 -0
  17. data/lib/fresh_connection/extend/mysql2_adapter.rb +46 -0
  18. data/lib/fresh_connection/initializer.rb +35 -0
  19. data/lib/fresh_connection/rack/connection_management.rb +1 -1
  20. data/lib/fresh_connection/railtie.rb +7 -4
  21. data/lib/fresh_connection/slave_connection.rb +29 -65
  22. data/lib/fresh_connection/slave_connection_handler.rb +43 -0
  23. data/lib/fresh_connection/version.rb +1 -1
  24. data/log/.gitkeep +0 -0
  25. data/spec/database.yml +14 -0
  26. data/spec/db_schema.sql +291 -0
  27. data/spec/prepare.rb +33 -0
  28. data/spec/spec_helper.rb +8 -0
  29. data/spec/support/active_record_logger.rb +3 -0
  30. data/spec/unit/access_control_spec.rb +63 -0
  31. data/spec/unit/ar_base_spec.rb +42 -0
  32. data/spec/unit/fresh_connection_spec.rb +106 -0
  33. data/spec/unit/recovery_spec.rb +39 -0
  34. metadata +154 -81
  35. data/lib/fresh_connection/active_record/abstract_adapter.rb +0 -35
  36. data/lib/fresh_connection/active_record/mysql2_adapter.rb +0 -14
  37. data/lib/fresh_connection/active_record/relation.rb +0 -33
@@ -1,35 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- class AbstractAdapter
4
- def select_all_with_slave_connection(arel, name = nil, binds = [])
5
- if FreshConnection::SlaveConnection.slave_access?
6
- change_connection {select_all_without_slave_connection(arel, "[slave] #{name}", binds)}
7
- else
8
- select_all_without_slave_connection(arel, name, binds)
9
- end
10
- end
11
- alias_method_chain :select_all, :slave_connection
12
-
13
- private
14
-
15
- def change_connection
16
- retry_count = 0
17
- master_connection = @connection
18
- begin
19
- slave_connection = FreshConnection::SlaveConnection.slave_connection
20
- @connection = slave_connection.raw_connection
21
- yield
22
- rescue ActiveRecord::StatementInvalid => exception
23
- if FreshConnection::SlaveConnection.recovery(slave_connection, exception)
24
- retry_count += 1
25
- retry if retry_count < FreshConnection::SlaveConnection.retry_limit
26
- end
27
-
28
- raise
29
- end
30
- ensure
31
- @connection = master_connection
32
- end
33
- end
34
- end
35
- end
@@ -1,14 +0,0 @@
1
- require 'active_record/connection_adapters/mysql2_adapter'
2
-
3
- module ActiveRecord
4
- module ConnectionAdapters
5
- class Mysql2Adapter < AbstractMysqlAdapter
6
- private
7
-
8
- def configure_connection_with_ignore
9
- configure_connection_without_ignore unless FreshConnection::SlaveConnection.ignore_configure_connection?
10
- end
11
- alias_method_chain :configure_connection, :ignore
12
- end
13
- end
14
- end
@@ -1,33 +0,0 @@
1
- module ActiveRecord
2
- class Relation
3
- private
4
-
5
- def exec_queries_with_slave_connection
6
- return @records if loaded?
7
-
8
- FreshConnection::SlaveConnection.manage_access(@klass, go_slave?) do
9
- exec_queries_without_slave_connection
10
- end
11
- end
12
- alias_method_chain :exec_queries, :slave_connection
13
-
14
- if Rails.version.to_f > 3
15
- def go_slave?
16
- connection.open_transactions == 0 && (readonly_value.nil? || readonly_value)
17
- end
18
- else
19
- def go_slave?
20
- connection.open_transactions == 0 && (@readonly_value.nil? || @readonly_value)
21
- end
22
- end
23
- end
24
-
25
- module Calculations
26
- def calculate_with_slave_connection(operation, column_name, options = {})
27
- FreshConnection::SlaveConnection.manage_access(@klass, (go_slave? && options[:readonly] != false)) do
28
- calculate_without_slave_connection(operation, column_name, options)
29
- end
30
- end
31
- alias_method_chain :calculate, :slave_connection
32
- end
33
- end