connection_manager 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MjczOGY2MmMzMzFiMDBiNDNjYzhiMTE5NGVkZWM2OGRmOGUxYzdiNA==
5
+ data.tar.gz: !binary |-
6
+ MTIwMjQ1ODQ3ZGMwYTY0YWI0ZDgwNDM4NGM1MTE0MGYxMzE5ZjQxZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MjAxNjI1Y2JjOGU0YjMzMWQyMzI0NjMyYzVmMmEzYTFjNWU3ZjBlNjk5OWNm
10
+ MDEyMTRmZDQ5MmRmMmFjYmUzMWVkYzNiNzk1OTRiMzgwNTRjOGMxYmExYzY2
11
+ Yjk1ZTRjMjI0MjkwY2U5YzM3ODBjNTQ2MzY3ZmRhOGM5M2VkYTM=
12
+ data.tar.gz: !binary |-
13
+ N2ZlMDg5N2NmOTEwNzQxN2ZlYmZkNjQyMmFlZDNmMTI3MjZjOTIwZWNmNWIy
14
+ MjZmYTQxZjE4M2QxYzg5ZTJjODZlM2FkMDIwMjY2MTE2ZDI1YzNjZGZjZjRi
15
+ N2Y5ZjZhZmQyMWNmYmMxYWM2ZGNhZWExYjEyM2Y5ODk3YTFmYTk=
@@ -0,0 +1,12 @@
1
+ ConnectionManager Changelog
2
+ =====================
3
+
4
+ HEAD
5
+ =======
6
+ - None yet!
7
+
8
+ 1.0.2
9
+ =======
10
+ - ActiveRecord 4.1 compatibility
11
+ - Refactor Using to make use of active record relations
12
+ - Better cross schema patching, make sure AR < 3.2 loads
@@ -17,12 +17,12 @@ Gem::Specification.new do |s|
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
- s.add_runtime_dependency 'activerecord', '>= 3.0', '<= 4.0'
20
+ s.add_runtime_dependency 'activerecord', '>= 3.0', '<= 4.1'
21
21
  s.add_development_dependency 'rspec'
22
22
  s.add_development_dependency 'autotest'
23
23
  s.add_development_dependency 'mocha'
24
24
  s.add_development_dependency 'factory_girl'
25
- s.add_development_dependency 'activesupport', '>= 3.0', '<= 4.0'
25
+ s.add_development_dependency 'activesupport', '>= 3.0', '<= 4.1'
26
26
 
27
27
  if(defined? RUBY_ENGINE and 'jruby' == RUBY_ENGINE)
28
28
  s.add_development_dependency 'jruby-openssl'
@@ -10,15 +10,12 @@ module ConnectionManager
10
10
  require 'connection_manager/shards'
11
11
  require 'connection_manager/replication'
12
12
  require 'connection_manager/patches/cross_schema_patch'
13
- require 'connection_manager/patches/reflections_patch'
14
- require 'connection_manager/patches/query_methods_patch'
15
13
  require 'connection_manager/connection_manager_railtie' if defined?(Rails)
16
14
 
17
15
  ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include,(ConnectionManager::AbstractAdapterHelper))
18
16
  ActiveRecord::Base.extend(ConnectionManager::ConnectionHelpers)
19
17
  ActiveRecord::Base.extend(ConnectionManager::ConnectionBuilder)
20
18
  ActiveRecord::Base.send(:include,ConnectionManager::Using)
21
- ActiveRecord::QueryMethods.send(:include,ConnectionManager::UsingQueryMethod)
22
19
  ActiveRecord::Base.extend(ConnectionManager::Replication)
23
20
  ActiveRecord::Base.extend(ConnectionManager::Shards)
24
21
 
@@ -3,44 +3,94 @@ module ConnectionManager
3
3
  def config
4
4
  @config
5
5
  end
6
-
6
+
7
7
  # Determines if connection supports cross database queries
8
8
  def cross_database_support?
9
- (@config[:cross_database_support] || @config[:adapter].match(/(mysql)|(postgres)|(sqlserver)/i))
9
+ (@config[:cross_database_support] || @config[:adapter].match(/(mysql)|(postgres)|(sqlserver)/i))
10
10
  end
11
11
  alias :cross_schema_support? :cross_database_support?
12
-
12
+
13
13
  def using_em_adapter?
14
14
  (@config[:adapter].match(/^em\_/) && defined?(EM) && EM::reactor_running?)
15
15
  end
16
-
16
+
17
17
  def readonly?
18
18
  (@config[:readonly] == true)
19
- end
20
-
19
+ end
20
+
21
21
  def replicated?
22
22
  (!slave_keys.blank? || !master_keys.blank?)
23
23
  end
24
-
24
+
25
25
  def database_name
26
26
  @config[:database]
27
27
  end
28
-
28
+
29
29
  def replication_keys(type=:slaves)
30
30
  return slave_keys if type == :slaves
31
31
  master_keys
32
32
  end
33
-
33
+
34
34
  def slave_keys
35
- slave_keys = []
36
- slave_keys = @config[:slaves].collect{|r| r.to_sym} if @config[:slaves]
37
- slave_keys
35
+ return @config[:slaves].collect{|r| r.to_sym} if @config[:slaves]
36
+ []
38
37
  end
39
-
38
+
40
39
  def master_keys
41
- master_keys = []
42
- master_keys = @config[:masters].collect{|r| r.to_sym} if @config[:masters]
43
- master_keys
40
+ return @config[:masters].collect{|r| r.to_sym} if @config[:masters]
41
+ []
42
+ end
43
+
44
+ if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
45
+
46
+ # Returns the schema for a give table. Returns nil of multiple matches are found
47
+ def fetch_table_schema(table_name)
48
+ sql = "SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
49
+ found = nil
50
+ results = execute(sql, 'SCHEMA')
51
+ found = results.to_a
52
+ if (found.length == 1)
53
+ found = found[0][0]
54
+ end
55
+ found
56
+ end
57
+
58
+ # Returns table_schema.table_name for the given table. Returns nil if multiple matches are found
59
+ def fetch_full_table_name(table_name)
60
+ return table_name if (table_name.to_s.match(/(^$)|(\.)/))
61
+ sql = "SELECT CONCAT(table_schema,'.',table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
62
+ found = nil
63
+ results = execute(sql, 'SCHEMA')
64
+ found = results.to_a
65
+ if (found.length == 1)
66
+ found = found[0][0]
67
+ else
68
+ found = table_name
69
+ end
70
+ found
71
+ end
72
+ else
73
+
74
+ # Returns the schema for a give table. Returns nil of multiple matches are found
75
+ def fetch_table_schema(table_name)
76
+ sql = "SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
77
+ execute_and_free(sql, 'SCHEMA') do |result|
78
+ found = result.to_a
79
+ return nil unless (found.length == 1)
80
+ found[0][0]
81
+ end
82
+ end
83
+
84
+ # Returns table_schema.table_name for the given table. Returns nil if multiple matches are found
85
+ def fetch_full_table_name(table_name)
86
+ return table_name if (table_name.to_s.match(/(^$)|(\.)/))
87
+ sql = "SELECT CONCAT(table_schema,'.',table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
88
+ execute_and_free(sql, 'SCHEMA') do |result|
89
+ found = result.to_a
90
+ return table_name unless (found.length == 1)
91
+ found[0][0]
92
+ end
93
+ end
44
94
  end
45
95
  end
46
96
  end
@@ -74,7 +74,7 @@ module ConnectionManager
74
74
  def use_database(database_name=nil,opts={})
75
75
  self.current_database_name = database_name if database_name
76
76
  opts[:table_name_prefix] = "#{self.current_database_name}." if opts[:table_name_prefix].blank? && self.connection.cross_database_support?
77
- unless self.abstract_class?
77
+ unless self.abstract_class? || self.name == "ActiveRecord::Base"
78
78
  opts[:table_name] = self.table_name if opts[:table_name].blank?
79
79
  opts[:table_name].gsub!(self.table_name_prefix,'') unless self.table_name_prefix.blank?
80
80
  self.table_name = "#{opts[:table_name_prefix]}#{opts[:table_name]}"
@@ -1,10 +1,35 @@
1
- # ActiveRecord 3.0 BACK PORT ONLY
2
- # https://github.com/brianmario/mysql2/commit/14accdf8d1bf557f652c19b870316094a7441334#diff-0
3
- if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 2
4
- (require 'active_record/connection_adapters/abstract_mysql_adapter' if (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 2))
1
+ module ActiveRecord
2
+ class Base
3
+ class << self
4
+ unless ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
5
+ # We want to make sure we get the full table name with schema
6
+ def arel_table # :nodoc:
7
+ @arel_table ||= Arel::Table.new(quoted_table_name.to_s.gsub('`',''), arel_engine)
8
+ end
9
+ end
10
+
11
+ private
12
+ alias :base_compute_table_name :compute_table_name
13
+ # In a schema schema environment we want to set table name prefix
14
+ # to the schema_name + . if its not set already
15
+ def compute_table_name
16
+ result = base_compute_table_name
17
+ if result.match(/^[^.]*$/) && connection.cross_schema_support?
18
+ t_schema = connection.fetch_table_schema(undecorated_table_name(name))
19
+ self.table_name_prefix = "#{t_schema}." if t_schema
20
+ result = base_compute_table_name
21
+ end
22
+ result
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
29
+ require 'active_record/connection_adapters/mysql2_adapter'
5
30
  module ActiveRecord
6
31
  module ConnectionAdapters
7
- class Mysql2Adapter < ((ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 2) ? AbstractMysqlAdapter : AbstractAdapter)
32
+ class Mysql2Adapter < AbstractAdapter
8
33
 
9
34
  # Force all tables to be cached for the life connection
10
35
  def cached_tables
@@ -16,14 +41,13 @@ if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 2
16
41
  cached_tables[database] ||= []
17
42
  return [like] if like && cached_tables[database].include?(like)
18
43
  sql = "SHOW TABLES "
19
- sql << "IN #{quote_table_name(database)} " if database
44
+ sql << "IN #{database} " if database
20
45
  sql << "LIKE #{quote(like)}" if like
21
46
  result = execute(sql, 'SCHEMA')
22
47
  cached_tables[database] = (cached_tables[database] | result.collect { |field| field[0] }).compact
23
48
  end
24
49
 
25
- alias :new_tables :tables
26
-
50
+ # We have to clean the name of '`' and fetch table name with schema
27
51
  def table_exists?(name)
28
52
  return false unless name
29
53
  name = name.to_s
@@ -32,7 +56,7 @@ if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 2
32
56
  table = schema
33
57
  schema = nil
34
58
  end
35
- new_tables(nil, schema, table).include?(table)
59
+ tables(nil, schema, table).include?(table)
36
60
  end
37
61
  end
38
62
  end
@@ -1,79 +1,92 @@
1
+ require 'active_support/core_ext/module/delegation'
1
2
  module ConnectionManager
2
3
  module Using
3
4
  module ClassMethods
4
-
5
- def using(connection_class_name)
6
- d = fetch_duplicate_class(connection_class_name)
7
- r = ActiveRecord::Relation.new(d, d.arel_table)
8
- r = r.readonly if d.connection.readonly?
9
- r = r.from(d.quoted_table_name) unless (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0)
10
- r
11
- end
12
-
13
- private
5
+
14
6
  # We use dup here because its just too tricky to make sure we override
15
- # all the methods necessary when using a child class of the model. This
7
+ # all the methods necessary when using a child class of the model. This
16
8
  # action is lazy and the created sub is named to a constant so we only
17
9
  # have to do it once.
18
- def fetch_duplicate_class(connection_class_name)
10
+ def fetch_duplicate_class(connection_class_name)
19
11
  begin
20
12
  return "#{self.name}::#{connection_class_name}Dup".constantize
21
13
  rescue NameError
22
14
  return build_dup_class(connection_class_name)
23
15
  end
24
16
  end
25
-
17
+
18
+ private
26
19
  # Modifies the dup class to use the connection class connection.
27
20
  # We want to use the current class table name, but the connection
28
- # class database as the prefix, useful when shards but normally
29
- # should be the same. We also want the superclass method to
21
+ # class database as the prefix, useful when shards but normally
22
+ # should be the same. We also want the superclass method to
30
23
  # return the connection class as AR sometimes uses the the superclass
31
24
  # connection
32
25
  def build_dup_class(connection_class_name)
33
26
  use_database(self.current_database_name) # make sure we are consistent from super to dup
34
27
  con_class = connection_class_name.constantize
35
28
  db_name = con_class.current_database_name
36
- dup_klass = dup
29
+ dup_klass = dup
37
30
  dup_klass.class_eval <<-STR
38
- self.use_database('#{db_name}',{:table_name => '#{table_name}'})
39
- class << self
40
- def model_name
41
- #{self.name}.model_name
42
- end
43
- def connection_class
44
- #{connection_class_name}
45
- end
46
- def connection
47
- connection_class.connection
48
- end
49
- def superclass
50
- connection_class
51
- end
31
+ self.use_database('#{db_name}',{:table_name => '#{table_name}'})
32
+ class << self
33
+ def model_name
34
+ #{self.name}.model_name
35
+ end
36
+ def connection_class
37
+ #{connection_class_name}
38
+ end
39
+ def connection
40
+ connection_class.connection
52
41
  end
42
+ def superclass
43
+ connection_class
44
+ end
45
+ end
53
46
  STR
54
-
47
+
55
48
  self.const_set("#{connection_class_name}Dup", dup_klass)
56
49
  "#{self.name}::#{connection_class_name}Dup".constantize
57
50
  end
58
51
  end
59
-
52
+
60
53
  # Instance method for casting to a duplication class
61
54
  def using(connection_class)
62
55
  becomes(self.class.using(connection_class).klass)
63
56
  end
64
-
57
+
65
58
  def self.included(host_class)
66
59
  host_class.extend(ClassMethods)
67
60
  end
68
61
  end
69
-
70
- module UsingQueryMethod
71
- def using(connection_class_name)
72
- d = klass.using(connection_class_name)
73
- relation = clone
74
- relation.instance_variable_set(:@klass, d.klass)
75
- relation = relation.from(d.quoted_table_name) unless (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0)
76
- relation
62
+ end
63
+
64
+ module ActiveRecord
65
+ # = Active Record Relation
66
+ class Relation
67
+ if ActiveRecord::VERSION::MAJOR == 4
68
+ def using(connection_class_name)
69
+ d = @klass.fetch_duplicate_class(connection_class_name)
70
+ self.instance_variable_set(:@arel_table, d.arel_table)
71
+ self.instance_variable_set(:@klass, d)
72
+ self
73
+ end
74
+ else
75
+ def using(connection_class_name)
76
+ d = @klass.fetch_duplicate_class(connection_class_name)
77
+ rel = clone
78
+ rel.instance_variable_set(:@arel_table, d.arel_table)
79
+ rel.instance_variable_set(:@klass, d)
80
+ rel
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ module ActiveRecord
87
+ class Base
88
+ class << self
89
+ delegate :using, :to => (ActiveRecord::VERSION::MAJOR == 4 ? :all : :scoped)
77
90
  end
78
91
  end
79
92
  end
@@ -1,3 +1,3 @@
1
1
  module ConnectionManager
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -2,13 +2,13 @@ class TestDB
2
2
  def self.yml(driver='sqlite')
3
3
  YAML::load(File.open(File.join(File.dirname(__FILE__),'..',"#{driver}_database.yml")))
4
4
  end
5
-
5
+
6
6
  def self.connect(driver='sqlite',logging=false)
7
7
  ActiveRecord::Base.configurations = yml(driver)
8
- ActiveRecord::Base.establish_connection('test')
8
+ ActiveRecord::Base.establish_connection('test')
9
9
  ActiveRecord::Base.logger = Logger.new(STDOUT) if logging
10
10
  end
11
-
11
+
12
12
  def self.clean
13
13
  [:foos,:fruits,:baskets,:fruit_baskets,:regions,:types].each do |t|
14
14
  DBSpecManagement.connection.execute("DELETE FROM #{t.to_s}")
@@ -19,46 +19,63 @@ class TestDB
19
19
  end
20
20
  end
21
21
 
22
-
23
22
  #Put all the test migrations here
24
- class TestMigrations < ActiveRecord::Migration
23
+ class TestMigrations < ActiveRecord::Migration
25
24
  # all the ups
26
- def self.up(connection_name='test',master_2_connection_name='master_2_cm_test', user_connection_name='cm_user_test')
27
- [connection_name,master_2_connection_name].each do |c|
28
- ActiveRecord::Base.establish_connection(c)
29
- begin
30
- create_table :foos do |t|
31
- t.string :name
32
- t.integer :user_id
33
- end
34
- create_table :fruits do |t|
35
- t.string :name
36
- t.integer :region_id
37
- t.timestamps
38
- end
39
- create_table :baskets do |t|
40
- t.string :name
41
- t.timestamps
42
- end
43
- create_table :fruit_baskets do |t|
44
- t.integer :fruit_id
45
- t.integer :basket_id
46
- t.timestamps
47
- end
48
- create_table :regions do |t|
49
- t.string :name
50
- t.integer :type_id
51
- t.timestamps
52
- end
53
- create_table :types do |t|
54
- t.string :name
55
- t.timestamps
56
- end
57
- rescue => e
58
- puts "tables failed to create: #{e}"
25
+ def self.up(connection_name='test', user_connection_name='cm_user_test')
26
+ ActiveRecord::Base.establish_connection(connection_name)
27
+ begin
28
+ create_table "#{ActiveRecord::Base.schema_name}.foos" do |t|
29
+ t.string :name
30
+ t.integer :user_id
31
+ end
32
+ rescue => e
33
+ puts "tables failed to create: #{e}"
34
+ end
35
+ begin
36
+ create_table "#{ActiveRecord::Base.schema_name}.fruits" do |t|
37
+ t.string :name
38
+ t.integer :region_id
39
+ t.timestamps
40
+ end
41
+ rescue => e
42
+ puts "tables failed to create: #{e}"
43
+ end
44
+ begin
45
+ create_table "#{ActiveRecord::Base.schema_name}.baskets" do |t|
46
+ t.string :name
47
+ t.timestamps
48
+ end
49
+ rescue => e
50
+ puts "tables failed to create: #{e}"
51
+ end
52
+ begin
53
+ create_table "#{ActiveRecord::Base.schema_name}.fruit_baskets" do |t|
54
+ t.integer :fruit_id
55
+ t.integer :basket_id
56
+ t.timestamps
57
+ end
58
+ rescue => e
59
+ puts "tables failed to create: #{e}"
60
+ end
61
+ begin
62
+ create_table "#{ActiveRecord::Base.schema_name}.regions" do |t|
63
+ t.string :name
64
+ t.integer :type_id
65
+ t.timestamps
66
+ end
67
+ rescue => e
68
+ puts "tables failed to create: #{e}"
69
+ end
70
+ begin
71
+ create_table "#{ActiveRecord::Base.schema_name}.types" do |t|
72
+ t.string :name
73
+ t.timestamps
59
74
  end
75
+ rescue => e
76
+ puts "tables failed to create: #{e}"
60
77
  end
61
-
78
+
62
79
  ActiveRecord::Base.establish_connection(user_connection_name)
63
80
  begin
64
81
  create_table :users do |t|
@@ -67,30 +84,28 @@ class TestMigrations < ActiveRecord::Migration
67
84
  rescue => e
68
85
  puts "tables failed to create: #{e}"
69
86
  end
70
-
87
+
71
88
  ActiveRecord::Base.establish_connection(connection_name)
72
89
  end
73
-
90
+
74
91
  # all the downs
75
- def self.down(connection_name='test',master_2_connection_name='master_2_cm_test',user_connection_name='cm_user_test')
76
- [connection_name,master_2_connection_name].each do |c|
77
- ActiveRecord::Base.establish_connection(c)
92
+ def self.down(connection_name='test',user_connection_name='cm_user_test')
93
+ ActiveRecord::Base.establish_connection(connection_name)
94
+ [:foos,:fruits,:baskets,:fruit_baskets,:regions,:types].each do |t|
78
95
  begin
79
- [:foos,:fruits,:baskets,:fruit_baskets,:regions,:types].each do |t|
80
- drop_table t
81
- end
96
+ drop_table t
82
97
  rescue => e
83
98
  puts "tables were not dropped: #{e}"
84
99
  end
85
100
  end
86
- ActiveRecord::Base.establish_connection(user_connection_name)
101
+ ActiveRecord::Base.establish_connection(user_connection_name)
87
102
  begin
88
103
  [:users].each do |t|
89
- drop_table t
104
+ drop_table t
90
105
  end
91
106
  rescue => e
92
107
  puts "tables were not dropped: #{e}"
93
108
  end
94
- ActiveRecord::Base.establish_connection(connection_name)
95
- end
96
- end
109
+ ActiveRecord::Base.establish_connection(connection_name)
110
+ end
111
+ end
@@ -38,11 +38,6 @@ slave_2_cm_test:
38
38
  <<: *common
39
39
  <<: *readonly
40
40
  database: cm_test
41
-
42
- master_2_cm_test:
43
- <<: *common
44
- <<: *master
45
- database: cm_master_2_test
46
41
 
47
42
  shard_1_cm_test:
48
43
  <<: *common
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ describe ActiveRecord::ConnectionAdapters::Mysql2Adapter do
3
+ describe '#fetch_full_table_name' do
4
+ it "should return a string consisting of the schema name, a '.' and the table_name" do
5
+ Fruit.connection.fetch_full_table_name('fruits').should eql('cm_test.fruits')
6
+ end
7
+ end
8
+
9
+ describe '#table_exists?' do
10
+ it "should return true for unquoted full_names" do
11
+ Fruit.connection.table_exists?('cm_test.fruits').should be_true
12
+ end
13
+ it "should return true for table only names" do
14
+ Fruit.connection.table_exists?('fruits').should be_true
15
+ end
16
+ end
17
+ end
18
+ describe ActiveRecord::Base do
19
+ describe '#arel_table' do
20
+ it "should use quote_table_name" do
21
+ Fruit.arel_table.name.should eql('cm_test.fruits')
22
+ end
23
+ end
24
+ end
@@ -68,11 +68,10 @@ describe ConnectionManager::Replication do
68
68
  end
69
69
 
70
70
  context "the objects return from a query" do
71
- # The default connection is the original connection for the model
72
- it "should have the connection as the replication" do
71
+ it "should not have the same connection as the master class" do
73
72
  Fruit.replicated
74
73
  FactoryGirl.create(:fruit)
75
- Fruit.slaves.first.connection.config.should eql(Fruit.slaves.connection.config)
74
+ Fruit.slaves.connection.config.should_not eql(Fruit.connection.config)
76
75
  Fruit.slaves.first.should_not be_nil
77
76
  end
78
77
  end
@@ -2,9 +2,6 @@ require 'spec_helper'
2
2
  class CmFooSlaveConnection < ActiveRecord::Base
3
3
  establish_managed_connection(:slave_1_cm_test)
4
4
  end
5
- class CmMasterConnection < ActiveRecord::Base
6
- establish_managed_connection(:master_2_cm_test)
7
- end
8
5
 
9
6
  describe ConnectionManager::Using do
10
7
 
@@ -21,10 +18,11 @@ describe ConnectionManager::Using do
21
18
  Fruit.using("CmFooSlaveConnection").connection.config.should_not eql(Fruit.connection.config)
22
19
  end
23
20
 
24
- it "should create the exact same sql if called from model or from relation" #do
25
- #Fruit.where(:name => "malarky").using("CmFooSlaveConnection").to_sql.should eql(
26
- #Fruit.using("CmFooSlaveConnection").where(:name => "malarky").to_sql)
27
- #end
21
+ it "should create the exact same sql if called from model or from relation" do
22
+ class_sql = Fruit.using("CmFooSlaveConnection").where(:name => "malarky").to_sql
23
+ relation_sql = Fruit.where(:name => "malarky").using("CmFooSlaveConnection").to_sql
24
+ class_sql.should eql(relation_sql)
25
+ end
28
26
 
29
27
  it "should have the same connection if called from model or from relation" do
30
28
  Fruit.where(:name => "malarky").using("CmFooSlaveConnection").connection.config.should eql(
@@ -34,30 +32,6 @@ describe ConnectionManager::Using do
34
32
  Fruit.where(:name => "malarky").using("CmFooSlaveConnection").connection.config.should_not eql(
35
33
  Fruit.where(:name => "malarky").connection.config)
36
34
  end
37
-
38
- it "should work" do
39
- FactoryGirl.create(:fruit)
40
- Fruit.using("CmFooSlaveConnection").first
41
- end
42
-
43
- it "should really use a different connection" do
44
- f = Fruit.using("CmMasterConnection").new
45
- f.name = FactoryGirl.generate(:rand_name)
46
- f.save
47
- Fruit.where(:name => "malarky").first.should be_nil
48
- Fruit.using("CmFooSlaveConnection").where(:name => f.name).first.should be_nil
49
- Fruit.using("CmMasterConnection").where(:name => f.name).first.should_not be_nil
50
- end
51
-
52
- it "should save to schema/database set in connection class" do
53
- Fruit.table_name_prefix = "cm_test."
54
- f = Fruit.using("CmMasterConnection").new
55
- f.name = FactoryGirl.generate(:rand_name)
56
- f.save
57
- Fruit.where(:name => f.name).first.should be_nil
58
- Fruit.using("CmFooSlaveConnection").where(:name => f.name).first.should be_nil
59
- Fruit.using("CmMasterConnection").where(:name => f.name).first.should_not be_nil
60
- end
61
35
  end
62
36
  end
63
37
 
@@ -39,11 +39,6 @@ slave_2_cm_test:
39
39
  <<: *readonly
40
40
  database: cm_test
41
41
 
42
- master_2_cm_test:
43
- <<: *common
44
- <<: *master
45
- database: cm_master_2_test
46
-
47
42
  shard_1_cm_test:
48
43
  <<: *common
49
44
  <<: *master
metadata CHANGED
@@ -1,42 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joshua Mckinney
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-24 00:00:00.000000000 Z
11
+ date: 2014-04-24 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '3.0'
22
20
  - - <=
23
21
  - !ruby/object:Gem::Version
24
- version: '4.0'
22
+ version: '4.1'
25
23
  type: :runtime
26
24
  prerelease: false
27
25
  version_requirements: !ruby/object:Gem::Requirement
28
- none: false
29
26
  requirements:
30
27
  - - ! '>='
31
28
  - !ruby/object:Gem::Version
32
29
  version: '3.0'
33
30
  - - <=
34
31
  - !ruby/object:Gem::Version
35
- version: '4.0'
32
+ version: '4.1'
36
33
  - !ruby/object:Gem::Dependency
37
34
  name: rspec
38
35
  requirement: !ruby/object:Gem::Requirement
39
- none: false
40
36
  requirements:
41
37
  - - ! '>='
42
38
  - !ruby/object:Gem::Version
@@ -44,7 +40,6 @@ dependencies:
44
40
  type: :development
45
41
  prerelease: false
46
42
  version_requirements: !ruby/object:Gem::Requirement
47
- none: false
48
43
  requirements:
49
44
  - - ! '>='
50
45
  - !ruby/object:Gem::Version
@@ -52,7 +47,6 @@ dependencies:
52
47
  - !ruby/object:Gem::Dependency
53
48
  name: autotest
54
49
  requirement: !ruby/object:Gem::Requirement
55
- none: false
56
50
  requirements:
57
51
  - - ! '>='
58
52
  - !ruby/object:Gem::Version
@@ -60,7 +54,6 @@ dependencies:
60
54
  type: :development
61
55
  prerelease: false
62
56
  version_requirements: !ruby/object:Gem::Requirement
63
- none: false
64
57
  requirements:
65
58
  - - ! '>='
66
59
  - !ruby/object:Gem::Version
@@ -68,7 +61,6 @@ dependencies:
68
61
  - !ruby/object:Gem::Dependency
69
62
  name: mocha
70
63
  requirement: !ruby/object:Gem::Requirement
71
- none: false
72
64
  requirements:
73
65
  - - ! '>='
74
66
  - !ruby/object:Gem::Version
@@ -76,7 +68,6 @@ dependencies:
76
68
  type: :development
77
69
  prerelease: false
78
70
  version_requirements: !ruby/object:Gem::Requirement
79
- none: false
80
71
  requirements:
81
72
  - - ! '>='
82
73
  - !ruby/object:Gem::Version
@@ -84,7 +75,6 @@ dependencies:
84
75
  - !ruby/object:Gem::Dependency
85
76
  name: factory_girl
86
77
  requirement: !ruby/object:Gem::Requirement
87
- none: false
88
78
  requirements:
89
79
  - - ! '>='
90
80
  - !ruby/object:Gem::Version
@@ -92,7 +82,6 @@ dependencies:
92
82
  type: :development
93
83
  prerelease: false
94
84
  version_requirements: !ruby/object:Gem::Requirement
95
- none: false
96
85
  requirements:
97
86
  - - ! '>='
98
87
  - !ruby/object:Gem::Version
@@ -100,29 +89,26 @@ dependencies:
100
89
  - !ruby/object:Gem::Dependency
101
90
  name: activesupport
102
91
  requirement: !ruby/object:Gem::Requirement
103
- none: false
104
92
  requirements:
105
93
  - - ! '>='
106
94
  - !ruby/object:Gem::Version
107
95
  version: '3.0'
108
96
  - - <=
109
97
  - !ruby/object:Gem::Version
110
- version: '4.0'
98
+ version: '4.1'
111
99
  type: :development
112
100
  prerelease: false
113
101
  version_requirements: !ruby/object:Gem::Requirement
114
- none: false
115
102
  requirements:
116
103
  - - ! '>='
117
104
  - !ruby/object:Gem::Version
118
105
  version: '3.0'
119
106
  - - <=
120
107
  - !ruby/object:Gem::Version
121
- version: '4.0'
108
+ version: '4.1'
122
109
  - !ruby/object:Gem::Dependency
123
110
  name: mysql2
124
111
  requirement: !ruby/object:Gem::Requirement
125
- none: false
126
112
  requirements:
127
113
  - - ! '>='
128
114
  - !ruby/object:Gem::Version
@@ -130,7 +116,6 @@ dependencies:
130
116
  type: :development
131
117
  prerelease: false
132
118
  version_requirements: !ruby/object:Gem::Requirement
133
- none: false
134
119
  requirements:
135
120
  - - ! '>='
136
121
  - !ruby/object:Gem::Version
@@ -145,6 +130,7 @@ extra_rdoc_files: []
145
130
  files:
146
131
  - .gitignore
147
132
  - .rspec
133
+ - CHANGE.md
148
134
  - Gemfile
149
135
  - LICENSE.txt
150
136
  - README.md
@@ -156,8 +142,6 @@ files:
156
142
  - lib/connection_manager/helpers/abstract_adapter_helper.rb
157
143
  - lib/connection_manager/helpers/connection_helpers.rb
158
144
  - lib/connection_manager/patches/cross_schema_patch.rb
159
- - lib/connection_manager/patches/query_methods_patch.rb
160
- - lib/connection_manager/patches/reflections_patch.rb
161
145
  - lib/connection_manager/replication.rb
162
146
  - lib/connection_manager/shards.rb
163
147
  - lib/connection_manager/using.rb
@@ -168,6 +152,7 @@ files:
168
152
  - spec/jdbcmysql_database.yml
169
153
  - spec/lib/connection_builder_spec.rb
170
154
  - spec/lib/connection_helpers_spec.rb
155
+ - spec/lib/patches/cross_schema_path_spec.rb
171
156
  - spec/lib/replication_spec.rb
172
157
  - spec/lib/shards_spec.rb
173
158
  - spec/lib/using_spec.rb
@@ -177,27 +162,26 @@ files:
177
162
  - spec/sqlite_database.yml
178
163
  homepage: ''
179
164
  licenses: []
165
+ metadata: {}
180
166
  post_install_message:
181
167
  rdoc_options: []
182
168
  require_paths:
183
169
  - lib
184
170
  required_ruby_version: !ruby/object:Gem::Requirement
185
- none: false
186
171
  requirements:
187
172
  - - ! '>='
188
173
  - !ruby/object:Gem::Version
189
174
  version: '0'
190
175
  required_rubygems_version: !ruby/object:Gem::Requirement
191
- none: false
192
176
  requirements:
193
177
  - - ! '>='
194
178
  - !ruby/object:Gem::Version
195
179
  version: '0'
196
180
  requirements: []
197
181
  rubyforge_project: connection_manager
198
- rubygems_version: 1.8.25
182
+ rubygems_version: 2.2.2
199
183
  signing_key:
200
- specification_version: 3
184
+ specification_version: 4
201
185
  summary: Simplifies connecting to Multiple and Replication databases with rails and
202
186
  active_record
203
187
  test_files:
@@ -207,6 +191,7 @@ test_files:
207
191
  - spec/jdbcmysql_database.yml
208
192
  - spec/lib/connection_builder_spec.rb
209
193
  - spec/lib/connection_helpers_spec.rb
194
+ - spec/lib/patches/cross_schema_path_spec.rb
210
195
  - spec/lib/replication_spec.rb
211
196
  - spec/lib/shards_spec.rb
212
197
  - spec/lib/using_spec.rb
@@ -1,15 +0,0 @@
1
- module ActiveRecord
2
- module QueryMethods
3
- private
4
- # For some reason on .include or a custom join
5
- # Arel drops the table name prefix on slave classes
6
- def build_select(arel, selects)
7
- unless selects.empty?
8
- @implicit_readonly = false
9
- arel.project(*selects)
10
- else
11
- arel.project("#{quoted_table_name}.*")
12
- end
13
- end
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- if ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR <= 0
2
- # Sometimes for some reason the quoted_table_name instance methods
3
- # drops the schema. If the quoted table name does not include a '.'
4
- # want to retrieve the quoted_table_name from the class and reset
5
- module ActiveRecord
6
- # = Active Record Reflection
7
- module Reflection # :nodoc:
8
- class AssociationReflection < MacroReflection
9
- def table_name
10
- @table_name = klass.table_name
11
- end
12
-
13
- def quoted_table_name
14
- @quoted_table_name = klass.quoted_table_name
15
- end
16
- end
17
- end
18
- end
19
- end