connection_manager 0.3.10 → 0.3.11

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.
@@ -52,7 +52,7 @@ module ConnectionManager
52
52
  klass = Class.new(ActiveRecord::Base)
53
53
  new_connection_class = Object.const_set(class_name, klass)
54
54
  new_connection_class.establish_managed_connection(connection_key)
55
- new_connection_class.table_name_prefix = "#{new_connection_class.database_name}."
55
+ new_connection_class.use_database(new_connection_class.current_database_name)
56
56
  end
57
57
  end
58
58
 
@@ -3,6 +3,26 @@ module ConnectionManager
3
3
  module ConnectionHelpers
4
4
  @@managed_connections = HashWithIndifferentAccess.new
5
5
 
6
+ # Returns the database_name of the connection unless set otherwise
7
+ def current_database_name
8
+ return "#{connection.config[:database].to_s}" if @current_database_name.blank?
9
+ @current_database_name
10
+ end
11
+ alias :database_name :current_database_name
12
+ alias :current_schema_name :current_database_name
13
+ alias :schema_name :current_database_name
14
+
15
+
16
+ # Sometimes we need to manually set the database name, like when the connection
17
+ # has a database but our table is in a different database/schema but on the
18
+ # same DMS.
19
+ def current_database_name=current_database_name
20
+ @current_database_name= current_database_name
21
+ end
22
+ alias :database_name= :current_database_name=
23
+ alias :current_schema_name= :current_database_name=
24
+ alias :schema_name= :current_database_name=
25
+
6
26
  # Returns true if this is a readonly only a readonly model
7
27
  # If the connection.readonly? then the model that uses the connection
8
28
  # must be readonly.
@@ -51,16 +71,18 @@ module ConnectionManager
51
71
  #
52
72
  # LegacyUser.limit(1).to_sql => "SELECT * FROM `BDUser`.`UserData` LIMIT 1
53
73
  #
54
- def use_database(database_name,opts={})
55
- self.database_name = database_name
56
- opts[:table_name_prefix] ||= "#{database_name}." if self.connection.cross_database_support?
74
+ def use_database(database_name=nil,opts={})
75
+ self.current_database_name = database_name if database_name
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?
78
+ opts[:table_name] = self.table_name if opts[:table_name].blank?
79
+ opts[:table_name].gsub!(self.table_name_prefix,'') unless self.table_name_prefix.blank?
80
+ self.table_name = "#{opts[:table_name_prefix]}#{opts[:table_name]}"
81
+ end
57
82
  self.table_name_prefix = opts[:table_name_prefix] unless opts[:table_name_prefix].blank?
58
- opts[:table_name] ||= self.table_name
59
- opts[:table_name] = opts[:table_name].to_s.split('.').last if self.connection.cross_database_support?
60
- self.table_name = "#{opts[:table_name_prefix]}#{opts[:table_name]}" unless self.abstract_class? || opts[:table_name].blank?
61
83
  end
62
84
  alias :use_schema :use_database
63
-
85
+
64
86
  # Establishes and checks in a connection, normally for abstract classes AKA connection classes.
65
87
  #
66
88
  # Options:
@@ -82,7 +104,7 @@ module ConnectionManager
82
104
  self.abstract_class = opts[:abstract_class]
83
105
  set_to_readonly if (readonly? || opts[:readonly] || self.connection.readonly?)
84
106
  add_managed_connections(yml_key,opts[:class_name])
85
- use_database(self.database_name,opts)
107
+ use_database(self.current_database_name,opts)
86
108
  end
87
109
 
88
110
  # Override ActiveRecord::Base instance method readonly? to force
@@ -36,27 +36,5 @@ if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 2
36
36
  end
37
37
  end
38
38
  end
39
- end
40
- end
41
-
42
- # We need to make sure we override existing database_name name methods
43
- module ActiveRecord
44
- class Base
45
- class << self
46
- # Returns the database_name of the connection unless set otherwise
47
- def database_name
48
- @database_name = "#{connection.config[:database].to_s}" if @database_name.blank?
49
- @database_name
50
- end
51
- alias :schema_name :database_name
52
-
53
- # Sometimes we need to manually set the database name, like when the connection
54
- # has a database but our table is in a different database/schema but on the
55
- # same DMS.
56
- def database_name=database_name
57
- @database_name = database_name
58
- end
59
- alias :schema_name= :database_name=
60
- end
61
39
  end
62
- end
40
+ end
@@ -38,7 +38,7 @@ module ConnectionManager
38
38
  options = {:name => "slaves"}.merge!(connections.extract_options!)
39
39
  options[:type] ||= :slaves
40
40
  options[:build_replicants] = true if (options[:build_replicants].blank? && options[:type] == :masters)
41
- self.use_database(self.database_name,{:table_name => self.table_name}) if self.connection.cross_database_support?
41
+ use_database(current_database_name, :table_name => table_name) # make sure the base class has current_database_name set
42
42
  connections = connection.replication_keys(options[:type]) if connections.blank?
43
43
  set_replications_to_method(connections,options[:name])
44
44
  build_repliciation_class_method(options)
@@ -6,6 +6,7 @@ module ConnectionManager
6
6
  d = fetch_duplicate_class(connection_class_name)
7
7
  r = ActiveRecord::Relation.new(d, d.arel_table)
8
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)
9
10
  r
10
11
  end
11
12
 
@@ -28,10 +29,11 @@ module ConnectionManager
28
29
  # return the connection class as AR sometimes uses the the superclass
29
30
  # connection
30
31
  def build_dup_class(connection_class_name)
32
+ use_database(self.current_database_name) # make sure we are consistent from super to dup
31
33
  con_class = connection_class_name.constantize
32
- db_name = con_class.database_name
34
+ db_name = con_class.current_database_name
33
35
  dup_klass = dup
34
- dup_klass.class_eval <<-STR
36
+ dup_klass.class_eval <<-STR
35
37
  self.use_database('#{db_name}',{:table_name => '#{table_name}'})
36
38
  class << self
37
39
  def model_name
@@ -50,6 +52,7 @@ module ConnectionManager
50
52
  STR
51
53
 
52
54
  self.const_set("#{connection_class_name}Dup", dup_klass)
55
+ "#{self.name}::#{connection_class_name}Dup".constantize
53
56
  end
54
57
  end
55
58
 
@@ -68,6 +71,7 @@ module ConnectionManager
68
71
  d = klass.using(connection_class_name)
69
72
  relation = clone
70
73
  relation.instance_variable_set(:@klass, d.klass)
74
+ relation = relation.from(d.quoted_table_name) unless (ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0)
71
75
  relation
72
76
  end
73
77
  end
@@ -1,3 +1,3 @@
1
1
  module ConnectionManager
2
- VERSION = "0.3.10"
2
+ VERSION = "0.3.11"
3
3
  end
@@ -25,5 +25,4 @@ describe ConnectionManager::ConnectionBuilder do
25
25
  MyConnectionClass.superclass.should eql(ActiveRecord::Base)
26
26
  end
27
27
  end
28
- end
29
-
28
+ end
@@ -16,6 +16,11 @@ describe ConnectionManager::ConnectionHelpers do
16
16
  }, {:readonly => true})
17
17
  end
18
18
 
19
+ class MyPrefixedConnection < MyConnectionClass
20
+ self.abstract_class = true
21
+ self.use_database("boo")
22
+ end
23
+
19
24
  class MyFoo < MyConnectionClass
20
25
  self.table_name = 'foos'
21
26
  end
@@ -51,7 +56,7 @@ describe ConnectionManager::ConnectionHelpers do
51
56
  describe '#use_database' do
52
57
  it "should set the database/schema for the model to the supplied schema_name" do
53
58
  Fruit.use_database('my_schema')
54
- Fruit.database_name.should eql('my_schema')
59
+ Fruit.current_database_name.should eql('my_schema')
55
60
  end
56
61
 
57
62
  it "should set the contactinate the schema_name and table_name; and set the table_name to that value" do
@@ -66,5 +71,9 @@ describe ConnectionManager::ConnectionHelpers do
66
71
  Fruit.table_name_prefix.should eql('my_schema.')
67
72
  end
68
73
  end
74
+
75
+ it "should have the correct database name" do
76
+ MyPrefixedConnection.current_database_name.should eql('boo')
77
+ end
69
78
  end
70
79
 
@@ -3,7 +3,7 @@ describe ConnectionManager::Replication do
3
3
 
4
4
  describe '#database_name' do
5
5
  it "should return the name of the database the model is using" do
6
- Fruit.database_name.should eql('cm_test')
6
+ Fruit.current_database_name.should eql('cm_test')
7
7
  end
8
8
  end
9
9
 
@@ -45,6 +45,7 @@ describe ConnectionManager::Replication do
45
45
  Fruit.replicated
46
46
  Fruit.slaves.joins(:region).to_sql.should eql(Fruit.joins(:region).to_sql)
47
47
  Fruit.slaves.joins(:fruit_baskets).to_sql.should eql(Fruit.joins(:fruit_baskets).to_sql)
48
+ Fruit.slaves.joins(:region).joins("LEFT OUTER JOIN `fruit_baskets` ON `fruit_baskets`.`fruit_id` = `cm_test`.`fruits`.`id`").to_sql.should eql(Fruit.joins(:region).joins("LEFT OUTER JOIN `fruit_baskets` ON `fruit_baskets`.`fruit_id` = `cm_test`.`fruits`.`id`").to_sql)
48
49
  Fruit.slaves.includes(:fruit_baskets).to_sql.should eql(Fruit.includes(:fruit_baskets).to_sql)
49
50
  Fruit.slaves.includes(:region).to_sql.should eql(Fruit.includes(:region).to_sql)
50
51
  end
@@ -108,9 +109,9 @@ describe ConnectionManager::Replication do
108
109
 
109
110
  # We'd like this to happen magically some day. Possible in 3.2
110
111
  it "should eager load with replication instances" #do
111
- #user = User.slaves.includes(:foos).where(:id => @user.id).first
112
- #user.foos.first.should_not be_kind_of(Foo)
113
- #end
112
+ # user = User.slaves.includes(:foos).where(:id => @user.id).first
113
+ # user.foos.first.should_not be_kind_of(Foo)
114
+ # end
114
115
 
115
116
  context "specifically defined replication association" do
116
117
  it "should eager load with replication instances" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.10
4
+ version: 0.3.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-02 00:00:00.000000000 Z
12
+ date: 2013-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord