connection_manager 1.0.4 → 1.1.0

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.
Files changed (45) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGE.md +12 -1
  3. data/README.md +99 -82
  4. data/connection_manager.gemspec +7 -11
  5. data/lib/connection_manager/builder.rb +56 -0
  6. data/lib/connection_manager/connection_adapters/abstract_adapter.rb +50 -0
  7. data/lib/connection_manager/connection_adapters/mysql_adapter.rb +39 -0
  8. data/lib/connection_manager/connection_handling.rb +91 -0
  9. data/lib/connection_manager/core.rb +24 -0
  10. data/lib/connection_manager/querying.rb +13 -0
  11. data/lib/connection_manager/railtie.rb +10 -0
  12. data/lib/connection_manager/relation.rb +21 -0
  13. data/lib/connection_manager/replication.rb +56 -85
  14. data/lib/connection_manager/shards.rb +2 -1
  15. data/lib/connection_manager/using.rb +30 -24
  16. data/lib/connection_manager/version.rb +1 -1
  17. data/lib/connection_manager.rb +26 -16
  18. data/spec/{mysql2_database.yml → database.yml} +30 -26
  19. data/spec/factories.rb +1 -1
  20. data/spec/helpers/database_spec_helper.rb +91 -62
  21. data/spec/helpers/models_spec_helper.rb +23 -12
  22. data/spec/lib/builder_spec.rb +31 -0
  23. data/spec/lib/connection_adapters/abstract_adapter_spec.rb +48 -0
  24. data/spec/lib/connection_adapters/mysql_adapter_spec.rb +13 -0
  25. data/spec/lib/connection_handling_spec.rb +65 -0
  26. data/spec/lib/core_spec.rb +10 -0
  27. data/spec/lib/integration/cross_schema_spec.rb +35 -0
  28. data/spec/lib/querying_spec.rb +19 -0
  29. data/spec/lib/relation_spec.rb +21 -0
  30. data/spec/lib/replication_spec.rb +19 -57
  31. data/spec/lib/shards_spec.rb +3 -3
  32. data/spec/lib/using_proxy_spec.rb +27 -0
  33. data/spec/lib/using_spec.rb +28 -15
  34. data/spec/spec_helper.rb +2 -10
  35. metadata +73 -35
  36. data/lib/connection_manager/connection_builder.rb +0 -82
  37. data/lib/connection_manager/connection_manager_railtie.rb +0 -8
  38. data/lib/connection_manager/helpers/abstract_adapter_helper.rb +0 -95
  39. data/lib/connection_manager/helpers/connection_helpers.rb +0 -119
  40. data/lib/connection_manager/patches/cross_schema_patch.rb +0 -67
  41. data/spec/jdbcmysql_database.yml +0 -50
  42. data/spec/lib/connection_builder_spec.rb +0 -28
  43. data/spec/lib/connection_helpers_spec.rb +0 -79
  44. data/spec/lib/patches/cross_schema_path_spec.rb +0 -74
  45. data/spec/sqlite_database.yml +0 -26
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Mckinney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-28 00:00:00.000000000 Z
11
+ date: 2014-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -31,19 +31,53 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '4.1'
33
33
  - !ruby/object:Gem::Dependency
34
- name: rspec
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
40
+ - - <=
41
+ - !ruby/object:Gem::Version
42
+ version: '4.1'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ - - <=
51
+ - !ruby/object:Gem::Version
52
+ version: '4.1'
53
+ - !ruby/object:Gem::Dependency
54
+ name: thread_safe
35
55
  requirement: !ruby/object:Gem::Requirement
36
56
  requirements:
37
57
  - - ! '>='
38
58
  - !ruby/object:Gem::Version
39
59
  version: '0'
40
- type: :development
60
+ type: :runtime
41
61
  prerelease: false
42
62
  version_requirements: !ruby/object:Gem::Requirement
43
63
  requirements:
44
64
  - - ! '>='
45
65
  - !ruby/object:Gem::Version
46
66
  version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: rspec
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
47
81
  - !ruby/object:Gem::Dependency
48
82
  name: autotest
49
83
  requirement: !ruby/object:Gem::Requirement
@@ -87,27 +121,21 @@ dependencies:
87
121
  - !ruby/object:Gem::Version
88
122
  version: '0'
89
123
  - !ruby/object:Gem::Dependency
90
- name: activesupport
124
+ name: mysql2
91
125
  requirement: !ruby/object:Gem::Requirement
92
126
  requirements:
93
127
  - - ! '>='
94
128
  - !ruby/object:Gem::Version
95
- version: '3.0'
96
- - - <=
97
- - !ruby/object:Gem::Version
98
- version: '4.1'
129
+ version: '0'
99
130
  type: :development
100
131
  prerelease: false
101
132
  version_requirements: !ruby/object:Gem::Requirement
102
133
  requirements:
103
134
  - - ! '>='
104
135
  - !ruby/object:Gem::Version
105
- version: '3.0'
106
- - - <=
107
- - !ruby/object:Gem::Version
108
- version: '4.1'
136
+ version: '0'
109
137
  - !ruby/object:Gem::Dependency
110
- name: mysql2
138
+ name: pg
111
139
  requirement: !ruby/object:Gem::Requirement
112
140
  requirements:
113
141
  - - ! '>='
@@ -120,8 +148,8 @@ dependencies:
120
148
  - - ! '>='
121
149
  - !ruby/object:Gem::Version
122
150
  version: '0'
123
- description: Simplifies connecting to Multiple and Replication databases with rails
124
- and active_record
151
+ description: Improves support for cross-schema, replication and mutli-DMS applications
152
+ using ActiveRecord.
125
153
  email:
126
154
  - joshmckin@gmail.com
127
155
  executables: []
@@ -137,29 +165,36 @@ files:
137
165
  - Rakefile
138
166
  - connection_manager.gemspec
139
167
  - lib/connection_manager.rb
140
- - lib/connection_manager/connection_builder.rb
141
- - lib/connection_manager/connection_manager_railtie.rb
142
- - lib/connection_manager/helpers/abstract_adapter_helper.rb
143
- - lib/connection_manager/helpers/connection_helpers.rb
144
- - lib/connection_manager/patches/cross_schema_patch.rb
168
+ - lib/connection_manager/builder.rb
169
+ - lib/connection_manager/connection_adapters/abstract_adapter.rb
170
+ - lib/connection_manager/connection_adapters/mysql_adapter.rb
171
+ - lib/connection_manager/connection_handling.rb
172
+ - lib/connection_manager/core.rb
173
+ - lib/connection_manager/querying.rb
174
+ - lib/connection_manager/railtie.rb
175
+ - lib/connection_manager/relation.rb
145
176
  - lib/connection_manager/replication.rb
146
177
  - lib/connection_manager/shards.rb
147
178
  - lib/connection_manager/using.rb
148
179
  - lib/connection_manager/version.rb
180
+ - spec/database.yml
149
181
  - spec/factories.rb
150
182
  - spec/helpers/database_spec_helper.rb
151
183
  - spec/helpers/models_spec_helper.rb
152
- - spec/jdbcmysql_database.yml
153
- - spec/lib/connection_builder_spec.rb
154
- - spec/lib/connection_helpers_spec.rb
155
- - spec/lib/patches/cross_schema_path_spec.rb
184
+ - spec/lib/builder_spec.rb
185
+ - spec/lib/connection_adapters/abstract_adapter_spec.rb
186
+ - spec/lib/connection_adapters/mysql_adapter_spec.rb
187
+ - spec/lib/connection_handling_spec.rb
188
+ - spec/lib/core_spec.rb
189
+ - spec/lib/integration/cross_schema_spec.rb
190
+ - spec/lib/querying_spec.rb
191
+ - spec/lib/relation_spec.rb
156
192
  - spec/lib/replication_spec.rb
157
193
  - spec/lib/shards_spec.rb
194
+ - spec/lib/using_proxy_spec.rb
158
195
  - spec/lib/using_spec.rb
159
- - spec/mysql2_database.yml
160
196
  - spec/spec.opts
161
197
  - spec/spec_helper.rb
162
- - spec/sqlite_database.yml
163
198
  homepage: ''
164
199
  licenses: []
165
200
  metadata: {}
@@ -182,20 +217,23 @@ rubyforge_project: connection_manager
182
217
  rubygems_version: 2.2.2
183
218
  signing_key:
184
219
  specification_version: 4
185
- summary: Simplifies connecting to Multiple and Replication databases with rails and
186
- active_record
220
+ summary: Cross-schema, replication and mutli-DMS gem for ActiveRecord.
187
221
  test_files:
222
+ - spec/database.yml
188
223
  - spec/factories.rb
189
224
  - spec/helpers/database_spec_helper.rb
190
225
  - spec/helpers/models_spec_helper.rb
191
- - spec/jdbcmysql_database.yml
192
- - spec/lib/connection_builder_spec.rb
193
- - spec/lib/connection_helpers_spec.rb
194
- - spec/lib/patches/cross_schema_path_spec.rb
226
+ - spec/lib/builder_spec.rb
227
+ - spec/lib/connection_adapters/abstract_adapter_spec.rb
228
+ - spec/lib/connection_adapters/mysql_adapter_spec.rb
229
+ - spec/lib/connection_handling_spec.rb
230
+ - spec/lib/core_spec.rb
231
+ - spec/lib/integration/cross_schema_spec.rb
232
+ - spec/lib/querying_spec.rb
233
+ - spec/lib/relation_spec.rb
195
234
  - spec/lib/replication_spec.rb
196
235
  - spec/lib/shards_spec.rb
236
+ - spec/lib/using_proxy_spec.rb
197
237
  - spec/lib/using_spec.rb
198
- - spec/mysql2_database.yml
199
238
  - spec/spec.opts
200
239
  - spec/spec_helper.rb
201
- - spec/sqlite_database.yml
@@ -1,82 +0,0 @@
1
- require 'active_support/core_ext/hash/indifferent_access'
2
- module ConnectionManager
3
- module ConnectionBuilder
4
-
5
- # Get the current environment if defined
6
- # Check for Rails, check for RACK_ENV, default to 'development'
7
- def ar_env
8
- return Rails.env if defined?(Rails)
9
- return RACK_ENV if defined?(RACK_ENV)
10
- return ENV["AR_ENV"] if ENV["AR_ENV"]
11
- "development"
12
- end
13
-
14
- # Grab only those connections that correspond to the current env. If env
15
- # is blank it grabs all the connection keys
16
- #
17
- # If you current environment valid database keys can be:
18
- # * development
19
- # * other_database_development
20
- # * slave_database_development
21
- def configuration_keys
22
- ActiveRecord::Base.configurations.keys.select{|n| n.match(ar_env_regex)}
23
- end
24
-
25
- def database_yml_attributes(name_from_yml)
26
- found = ActiveRecord::Base.configurations[name_from_yml]
27
- ActiveRecord::Base.configurations[name_from_yml].symbolize_keys if found
28
- end
29
-
30
- # Returns currently loaded configurations where :build_connection is true
31
- def database_keys_for_auto_build
32
- ab_configs = []
33
- configuration_keys.each do |key|
34
- ab_configs << key if (database_yml_attributes(key)[:build_connection_class] == true)
35
- end
36
- ab_configs
37
- end
38
-
39
- # Builds connection classes using the database keys provided; expects an array.
40
- def build_connection_classes(database_keys_to_use=database_keys_for_auto_build)
41
- database_keys_to_use.each do |key|
42
- build_connection_class(connection_class_name(key),key)
43
- end
44
- end
45
-
46
- # Build connection classes base on the supplied class name and connection
47
- # key from database.yml
48
- def build_connection_class(class_name,connection_key)
49
- begin
50
- class_name.constantize
51
- rescue NameError
52
- klass = Class.new(ActiveRecord::Base)
53
- new_connection_class = Object.const_set(class_name, klass)
54
- new_connection_class.establish_managed_connection(connection_key)
55
- new_connection_class.use_database(new_connection_class.current_database_name)
56
- end
57
- end
58
-
59
- private
60
- def ar_env_regex
61
- return @ar_env_regex if @ar_env_regex
62
- s = "#{ar_env}$"
63
- @ar_env_regex = Regexp.new("(#{s})")
64
- end
65
-
66
- # Creates a string to be used for the class name. Removes the current env.
67
- def clean_yml_key(name)
68
- new_name = "#{name}".gsub(ar_env_regex,'')
69
- new_name = "Base"if new_name.blank?
70
- new_name.gsub(/\_$/,'')
71
- end
72
-
73
- # Given an connection key name from the database.yml, returns the string
74
- # equivalent of the class name for that entry.
75
- def connection_class_name(name_from_yml)
76
- new_class_name = clean_yml_key(name_from_yml)
77
- new_class_name = new_class_name.gsub(/\_/,' ').titleize.gsub(/ /,'')
78
- new_class_name << "Connection"
79
- new_class_name
80
- end
81
- end
82
- end
@@ -1,8 +0,0 @@
1
- module ConnectionManager
2
- class ConnectionManagerRailtie < ::Rails::Railtie
3
- initializer "connection_manager.build_connection_classes" do
4
- ActiveRecord::Base.build_connection_classes
5
- end
6
- end
7
- end
8
-
@@ -1,95 +0,0 @@
1
- module ConnectionManager
2
- module AbstractAdapterHelper
3
- def config
4
- @config
5
- end
6
-
7
- # Determines if connection supports cross database queries
8
- def cross_database_support?
9
- @cross_database_support ||= (@config[:cross_database_support] || @config[:adapter].match(/(mysql)|(postgres)|(sqlserver)/i))
10
- end
11
- alias :cross_schema_support? :cross_database_support?
12
-
13
- def using_em_adapter?
14
- (@config[:adapter].match(/^em\_/) && defined?(EM) && EM::reactor_running?)
15
- end
16
-
17
- def readonly?
18
- (@config[:readonly] == true)
19
- end
20
-
21
- def replicated?
22
- (!slave_keys.blank? || !master_keys.blank?)
23
- end
24
-
25
- def database_name
26
- @config[:database]
27
- end
28
-
29
- def replication_keys(type=:slaves)
30
- return slave_keys if type == :slaves
31
- master_keys
32
- end
33
-
34
- def slave_keys
35
- @slave_keys ||= (@config[:slaves] ? @config[:slaves].collect{|r| r.to_sym} : [] )
36
- end
37
-
38
- def master_keys
39
- @master_keys ||= (@config[:masters] ? @config[:masters].collect{|r| r.to_sym} : [])
40
- end
41
-
42
- if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
43
-
44
- # Returns the schema for a give table. Returns nil of multiple matches are found
45
- def fetch_table_schema(table_name)
46
- return nil unless cross_database_support?
47
- sql = "SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
48
- results = execute(sql, 'SCHEMA')
49
- found = results.to_a
50
- return found[0][0] if (found.length == 1)
51
- nil
52
- end
53
-
54
- # Returns table_schema.table_name for the given table. Returns nil if multiple matches are found
55
- def fetch_full_table_name(table_name)
56
- return nil unless cross_database_support?
57
- return table_name if (table_name.to_s.match(/(^$)|(\.)/))
58
- sql = "SELECT CONCAT(table_schema,'.',table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
59
- found = nil
60
- results = execute(sql, 'SCHEMA')
61
- found = results.to_a
62
- if (found.length == 1)
63
- found = found[0][0]
64
- else
65
- found = table_name
66
- end
67
- found
68
- end
69
- else
70
-
71
- # Returns the schema for a give table. Returns nil of multiple matches are found
72
- def fetch_table_schema(table_name)
73
- return nil unless cross_database_support?
74
- sql = "SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
75
- execute_and_free(sql, 'SCHEMA') do |result|
76
- found = result.to_a
77
- return nil unless (found.length == 1)
78
- found[0][0]
79
- end
80
- end
81
-
82
- # Returns table_schema.table_name for the given table. Returns nil if multiple matches are found
83
- def fetch_full_table_name(table_name)
84
- return nil unless cross_database_support?
85
- return table_name if (table_name.to_s.match(/(^$)|(\.)/))
86
- sql = "SELECT CONCAT(table_schema,'.',table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '#{table_name}'"
87
- execute_and_free(sql, 'SCHEMA') do |result|
88
- found = result.to_a
89
- return table_name unless (found.length == 1)
90
- found[0][0]
91
- end
92
- end
93
- end
94
- end
95
- end
@@ -1,119 +0,0 @@
1
- require 'active_support/core_ext/hash/indifferent_access'
2
- module ConnectionManager
3
- module ConnectionHelpers
4
- @@managed_connections = HashWithIndifferentAccess.new
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
-
26
- # Returns true if this is a readonly only a readonly model
27
- # If the connection.readonly? then the model that uses the connection
28
- # must be readonly.
29
- def readonly?
30
- ((@readonly == true)||connection.readonly?)
31
- end
32
-
33
- # Allow setting of readonly at the model level
34
- def readonly=readonly
35
- @readonly = readonly
36
- end
37
-
38
- # A place to store managed connections
39
- def managed_connections
40
- @@managed_connections
41
- end
42
-
43
- def add_managed_connections(yml_key,value)
44
- @@managed_connections[yml_key] ||= []
45
- @@managed_connections[yml_key] << value unless @@managed_connections[yml_key].include?(value)
46
- @@managed_connections
47
- end
48
-
49
- def managed_connection_classes
50
- managed_connections.values.flatten
51
- end
52
-
53
- def yml_key
54
- @yml_key
55
- end
56
-
57
- # Tell Active Record to use a different database/schema on this model.
58
- # You may call #use_database when your schemas reside on the same database server
59
- # and you do not want to create extra connection class and database.yml entries.
60
- #
61
- # Options:
62
- # * :table_name_prefix - the prefix required for making cross database/schema
63
- # joins for you database management system. By default table_name_prefix is the
64
- # database/schema name followed by a period EX: "my_database."
65
- # * :table_name - the table name for the model if it does not match ActiveRecord
66
- # naming conventions
67
- #
68
- # EX: class LegacyUser < ActiveRecord::Base
69
- # use_database('DBUser', :table_name => 'UserData')
70
- # end
71
- #
72
- # LegacyUser.limit(1).to_sql => "SELECT * FROM `BDUser`.`UserData` LIMIT 1
73
- #
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? || self.name == "ActiveRecord::Base"
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
82
- self.table_name_prefix = opts[:table_name_prefix] unless opts[:table_name_prefix].blank?
83
- end
84
- alias :use_schema :use_database
85
-
86
- # Establishes and checks in a connection, normally for abstract classes AKA connection classes.
87
- #
88
- # Options:
89
- # * :abstract_class - used the set #abstract_class, default is true
90
- # * :readonly - force all instances to readonly
91
- # * :class_name - name of connection class name, default is current class name
92
- # * :table_name_prefix - prefix to append to table name for cross database joins,
93
- # default is the "#{self.database_name}."
94
- # EX:
95
- # class MyConnection < ActiveRecord::Base
96
- # establish_managed_connection :key_from_db_yml,{:readonly => true}
97
- # end
98
- #
99
- def establish_managed_connection(yml_key,opts={})
100
- @yml_key = yml_key
101
- opts = {:class_name => self.name,
102
- :abstract_class => true}.merge(opts)
103
- establish_connection(yml_key)
104
- self.abstract_class = opts[:abstract_class]
105
- set_to_readonly if (readonly? || opts[:readonly] || self.connection.readonly?)
106
- add_managed_connections(yml_key,opts[:class_name])
107
- use_database(self.current_database_name,opts)
108
- end
109
-
110
- # Override ActiveRecord::Base instance method readonly? to force
111
- # readonly connections.
112
- def set_to_readonly
113
- self.readonly = true
114
- define_method(:readonly?) do
115
- true
116
- end
117
- end
118
- end
119
- end
@@ -1,67 +0,0 @@
1
- module ActiveRecord
2
- class Base
3
- class << self
4
- # We want to make sure we get the full table name with schema
5
- def arel_table # :nodoc:
6
- begin
7
- @arel_table ||= Arel::Table.new(quoted_table_name.to_s.gsub('`',''), arel_engine)
8
- rescue ActiveRecord::ConnectionNotEstablished
9
- Arel::Table.new(table_name, arel_engine)
10
- end
11
- end
12
-
13
- private
14
-
15
- # In a schema schema environment we want to set table name prefix
16
- # to the schema_name + . if its not set already
17
- alias :base_compute_table_name :compute_table_name
18
- def compute_table_name
19
- result = base_compute_table_name
20
- if result.match(/^[^.]*$/) && connection.cross_schema_support?
21
- t_schema = connection.fetch_table_schema(undecorated_table_name(name))
22
- self.table_name_prefix = "#{t_schema}." if t_schema
23
- result = base_compute_table_name
24
- end
25
- result
26
- end
27
- end
28
- end
29
- end
30
-
31
- if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR <= 1
32
- require 'active_record/connection_adapters/mysql2_adapter'
33
- module ActiveRecord
34
- module ConnectionAdapters
35
- class Mysql2Adapter < AbstractAdapter
36
-
37
- # Force all tables to be cached for the life connection
38
- def cached_tables
39
- @cached_tables ||= {}
40
- end
41
-
42
- def tables(name = nil, database = nil, like =nil)
43
- return cached_tables[database] if cached_tables[database] && like.nil?
44
- cached_tables[database] ||= []
45
- return [like] if like && cached_tables[database].include?(like)
46
- sql = "SHOW TABLES "
47
- sql << "IN #{database} " if database
48
- sql << "LIKE #{quote(like)}" if like
49
- result = execute(sql, 'SCHEMA')
50
- cached_tables[database] = (cached_tables[database] | result.collect { |field| field[0] }).compact
51
- end
52
-
53
- # We have to clean the name of '`' and fetch table name with schema
54
- def table_exists?(name)
55
- return false unless name
56
- name = name.to_s
57
- schema, table = name.split('.', 2)
58
- unless table # A table was provided without a schema
59
- table = schema
60
- schema = nil
61
- end
62
- tables(nil, schema, table).include?(table)
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,50 +0,0 @@
1
- # Warning: The database defined as "test" will be erased and
2
- # re-generated from your development database when you run "rake".
3
- # Do not set this db to the same as development or production.
4
- common: &common
5
- adapter: jdbcmysql
6
- username: root
7
- password: omegared
8
- pool: 100
9
- timeout: 5000
10
- build_connection_class: true
11
-
12
- master: &master
13
- username: root
14
- password: omegared
15
-
16
- readonly: &readonly
17
- username: readonly
18
- password: omegared
19
-
20
- test:
21
- <<: *common
22
- <<: *master
23
- database: cm_test
24
- slaves: [slave_1_cm_test, slave_2_cm_test]
25
-
26
- cm_user_test:
27
- <<: *common
28
- <<: *master
29
- database: cm_user_test
30
- slaves: [slave_1_cm_user_test]
31
-
32
- slave_1_cm_test:
33
- <<: *common
34
- <<: *readonly
35
- database: cm_test
36
-
37
- slave_2_cm_test:
38
- <<: *common
39
- <<: *readonly
40
- database: cm_test
41
-
42
- shard_1_cm_test:
43
- <<: *common
44
- <<: *master
45
- database: legacy_cm_test
46
-
47
- slave_1_cm_user_test:
48
- <<: *common
49
- <<: *readonly
50
- database: cm_user_test
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
- describe ConnectionManager::ConnectionBuilder do
3
-
4
- describe '#connection_class_name' do
5
- it "should return a string for a class name appended with 'Connection' " do
6
- ActiveRecord::Base.send(:connection_class_name,"my_database").should eql("MyDatabaseConnection")
7
- end
8
- it "should return remove the appended rails env" do
9
- ActiveRecord::Base.send(:connection_class_name,"my_database_test").should eql("MyDatabaseConnection")
10
- end
11
- it "should use the database name from the database.yml if supplied string is only is only the Rails.env" do
12
- ActiveRecord::Base.send(:connection_class_name,"test").should eql("BaseConnection")
13
- end
14
- end
15
-
16
- describe '#build_connection_class' do
17
- before(:all) do
18
- ActiveRecord::Base.build_connection_class("MyConnectionClass", :test)
19
- end
20
- it "should add a class with supplied class name to ConnectionManager::ConnectionBuilder" do
21
- defined?(MyConnectionClass).should be_true
22
- MyConnectionClass.is_a?(Class).should be_true
23
- end
24
- it "should have a super class of ActiveRecord::Base" do
25
- MyConnectionClass.superclass.should eql(ActiveRecord::Base)
26
- end
27
- end
28
- end