activerecord 6.0.0.rc1 → 6.0.3.rc1
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.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +251 -3
- data/README.rdoc +1 -1
- data/lib/active_record.rb +1 -0
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +0 -1
- data/lib/active_record/association_relation.rb +10 -8
- data/lib/active_record/associations.rb +2 -2
- data/lib/active_record/associations/alias_tracker.rb +0 -1
- data/lib/active_record/associations/association.rb +5 -1
- data/lib/active_record/associations/builder/collection_association.rb +2 -2
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -3
- data/lib/active_record/associations/collection_association.rb +6 -2
- data/lib/active_record/associations/collection_proxy.rb +2 -3
- data/lib/active_record/associations/has_many_association.rb +0 -1
- data/lib/active_record/associations/join_dependency.rb +23 -9
- data/lib/active_record/associations/join_dependency/join_association.rb +12 -3
- data/lib/active_record/associations/preloader.rb +2 -3
- data/lib/active_record/associations/preloader/association.rb +3 -1
- data/lib/active_record/attribute_assignment.rb +0 -1
- data/lib/active_record/attribute_decorators.rb +0 -2
- data/lib/active_record/attribute_methods.rb +0 -51
- data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
- data/lib/active_record/attribute_methods/dirty.rb +8 -3
- data/lib/active_record/attribute_methods/primary_key.rb +0 -2
- data/lib/active_record/attribute_methods/read.rb +0 -1
- data/lib/active_record/attribute_methods/serialization.rb +0 -1
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
- data/lib/active_record/attribute_methods/write.rb +0 -1
- data/lib/active_record/attributes.rb +0 -1
- data/lib/active_record/autosave_association.rb +11 -7
- data/lib/active_record/callbacks.rb +1 -2
- data/lib/active_record/coders/yaml_column.rb +0 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +107 -13
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +21 -15
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +53 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +55 -37
- data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -7
- data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -25
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +25 -32
- data/lib/active_record/connection_adapters/connection_specification.rb +3 -4
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -2
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +8 -12
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -4
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +39 -2
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +17 -3
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +8 -7
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -3
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +23 -8
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_handling.rb +17 -22
- data/lib/active_record/core.rb +8 -6
- data/lib/active_record/counter_cache.rb +4 -1
- data/lib/active_record/database_configurations.rb +60 -31
- data/lib/active_record/database_configurations/url_config.rb +0 -1
- data/lib/active_record/dynamic_matchers.rb +2 -3
- data/lib/active_record/enum.rb +9 -0
- data/lib/active_record/explain.rb +0 -1
- data/lib/active_record/fixture_set/table_row.rb +0 -1
- data/lib/active_record/fixture_set/table_rows.rb +0 -1
- data/lib/active_record/fixtures.rb +11 -9
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/inheritance.rb +0 -3
- data/lib/active_record/insert_all.rb +5 -6
- data/lib/active_record/internal_metadata.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +0 -1
- data/lib/active_record/log_subscriber.rb +1 -1
- data/lib/active_record/middleware/database_selector.rb +3 -4
- data/lib/active_record/middleware/database_selector/resolver.rb +5 -8
- data/lib/active_record/migration.rb +43 -32
- data/lib/active_record/migration/command_recorder.rb +6 -18
- data/lib/active_record/migration/compatibility.rb +3 -3
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/model_schema.rb +3 -2
- data/lib/active_record/nested_attributes.rb +0 -2
- data/lib/active_record/no_touching.rb +2 -2
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +4 -5
- data/lib/active_record/querying.rb +1 -1
- data/lib/active_record/railtie.rb +1 -2
- data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
- data/lib/active_record/railties/databases.rake +63 -23
- data/lib/active_record/reflection.rb +9 -9
- data/lib/active_record/relation.rb +13 -1
- data/lib/active_record/relation/batches.rb +0 -1
- data/lib/active_record/relation/calculations.rb +3 -5
- data/lib/active_record/relation/delegation.rb +7 -6
- data/lib/active_record/relation/finder_methods.rb +14 -4
- data/lib/active_record/relation/from_clause.rb +4 -0
- data/lib/active_record/relation/merger.rb +6 -3
- data/lib/active_record/relation/predicate_builder.rb +1 -5
- data/lib/active_record/relation/query_methods.rb +94 -55
- data/lib/active_record/relation/spawn_methods.rb +0 -1
- data/lib/active_record/relation/where_clause.rb +0 -1
- data/lib/active_record/result.rb +0 -1
- data/lib/active_record/sanitization.rb +30 -2
- data/lib/active_record/schema.rb +1 -1
- data/lib/active_record/schema_dumper.rb +5 -1
- data/lib/active_record/schema_migration.rb +1 -1
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/scoping/default.rb +0 -1
- data/lib/active_record/scoping/named.rb +3 -3
- data/lib/active_record/store.rb +1 -1
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +21 -10
- data/lib/active_record/tasks/database_tasks.rb +76 -8
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -2
- data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
- data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
- data/lib/active_record/test_databases.rb +1 -16
- data/lib/active_record/test_fixtures.rb +2 -1
- data/lib/active_record/timestamp.rb +26 -17
- data/lib/active_record/touch_later.rb +3 -2
- data/lib/active_record/transactions.rb +18 -19
- data/lib/active_record/type.rb +0 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -5
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +0 -1
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type_caster/connection.rb +16 -10
- data/lib/active_record/validations.rb +3 -3
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/arel.rb +17 -6
- data/lib/arel/predications.rb +5 -6
- data/lib/arel/visitors/depth_first.rb +1 -2
- data/lib/arel/visitors/dot.rb +0 -1
- data/lib/arel/visitors/mssql.rb +0 -1
- data/lib/arel/visitors/oracle.rb +1 -2
- data/lib/arel/visitors/oracle12.rb +0 -1
- data/lib/arel/visitors/postgresql.rb +0 -1
- data/lib/arel/visitors/sqlite.rb +0 -1
- data/lib/arel/visitors/to_sql.rb +23 -27
- data/lib/arel/visitors/visitor.rb +9 -6
- data/lib/arel/visitors/where_sql.rb +0 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration.rb +0 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
- metadata +13 -9
@@ -95,7 +95,6 @@ module ActiveRecord
|
|
95
95
|
end
|
96
96
|
|
97
97
|
private
|
98
|
-
|
99
98
|
def raise_invalid_scope_type!(scope_type)
|
100
99
|
if !VALID_SCOPE_TYPES.include?(scope_type)
|
101
100
|
raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. Scope types must be included in VALID_SCOPE_TYPES"
|
@@ -31,7 +31,7 @@ module ActiveRecord
|
|
31
31
|
ActiveSupport::Deprecation.warn(<<~MSG.squish)
|
32
32
|
Class level methods will no longer inherit scoping from `#{scope._deprecated_scope_source}`
|
33
33
|
in Rails 6.1. To continue using the scoped relation, pass it into the block directly.
|
34
|
-
To instead access the full set of models, as Rails 6.1 will, use `#{name}.
|
34
|
+
To instead access the full set of models, as Rails 6.1 will, use `#{name}.default_scoped`.
|
35
35
|
MSG
|
36
36
|
end
|
37
37
|
|
@@ -53,7 +53,8 @@ module ActiveRecord
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
# Returns a scope for the model with default scopes.
|
57
|
+
def default_scoped(scope = relation)
|
57
58
|
build_default_scope(scope) || scope
|
58
59
|
end
|
59
60
|
|
@@ -204,7 +205,6 @@ module ActiveRecord
|
|
204
205
|
end
|
205
206
|
|
206
207
|
private
|
207
|
-
|
208
208
|
def valid_scope_name?(name)
|
209
209
|
if respond_to?(name, true) && logger
|
210
210
|
logger.warn "Creating scope :#{name}. " \
|
data/lib/active_record/store.rb
CHANGED
@@ -103,7 +103,7 @@ module ActiveRecord
|
|
103
103
|
module ClassMethods
|
104
104
|
def store(store_attribute, options = {})
|
105
105
|
serialize store_attribute, IndifferentCoder.new(store_attribute, options[:coder])
|
106
|
-
store_accessor(store_attribute, options[:accessors], options.slice(:prefix, :suffix)) if options.has_key? :accessors
|
106
|
+
store_accessor(store_attribute, options[:accessors], **options.slice(:prefix, :suffix)) if options.has_key? :accessors
|
107
107
|
end
|
108
108
|
|
109
109
|
def store_accessor(store_attribute, *keys, prefix: nil, suffix: nil)
|
@@ -40,11 +40,11 @@ module ActiveRecord
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def save(
|
43
|
+
def save(*, **) # :nodoc:
|
44
44
|
SuppressorRegistry.suppressed[self.class.name] ? true : super
|
45
45
|
end
|
46
46
|
|
47
|
-
def save!(
|
47
|
+
def save!(*, **) # :nodoc:
|
48
48
|
SuppressorRegistry.suppressed[self.class.name] ? true : super
|
49
49
|
end
|
50
50
|
end
|
@@ -4,8 +4,9 @@ module ActiveRecord
|
|
4
4
|
class TableMetadata # :nodoc:
|
5
5
|
delegate :foreign_type, :foreign_key, :join_primary_key, :join_foreign_key, to: :association, prefix: true
|
6
6
|
|
7
|
-
def initialize(klass, arel_table, association = nil)
|
7
|
+
def initialize(klass, arel_table, association = nil, types = klass)
|
8
8
|
@klass = klass
|
9
|
+
@types = types
|
9
10
|
@arel_table = arel_table
|
10
11
|
@association = association
|
11
12
|
end
|
@@ -29,11 +30,7 @@ module ActiveRecord
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def type(column_name)
|
32
|
-
|
33
|
-
klass.type_for_attribute(column_name)
|
34
|
-
else
|
35
|
-
Type.default_value
|
36
|
-
end
|
33
|
+
types.type_for_attribute(column_name)
|
37
34
|
end
|
38
35
|
|
39
36
|
def has_column?(column_name)
|
@@ -48,17 +45,20 @@ module ActiveRecord
|
|
48
45
|
association = klass._reflect_on_association(table_name) || klass._reflect_on_association(table_name.to_s.singularize)
|
49
46
|
|
50
47
|
if !association && table_name == arel_table.name
|
51
|
-
|
48
|
+
self
|
52
49
|
elsif association && !association.polymorphic?
|
53
50
|
association_klass = association.klass
|
54
51
|
arel_table = association_klass.arel_table.alias(table_name)
|
52
|
+
TableMetadata.new(association_klass, arel_table, association)
|
55
53
|
else
|
56
54
|
type_caster = TypeCaster::Connection.new(klass, table_name)
|
57
|
-
association_klass = nil
|
58
55
|
arel_table = Arel::Table.new(table_name, type_caster: type_caster)
|
56
|
+
TableMetadata.new(nil, arel_table, association, type_caster)
|
59
57
|
end
|
58
|
+
end
|
60
59
|
|
61
|
-
|
60
|
+
def associated_predicate_builder(table_name)
|
61
|
+
associated_table(table_name).predicate_builder
|
62
62
|
end
|
63
63
|
|
64
64
|
def polymorphic_association?
|
@@ -73,7 +73,18 @@ module ActiveRecord
|
|
73
73
|
klass.reflect_on_aggregation(aggregation_name)
|
74
74
|
end
|
75
75
|
|
76
|
+
protected
|
77
|
+
def predicate_builder
|
78
|
+
if klass
|
79
|
+
predicate_builder = klass.predicate_builder.dup
|
80
|
+
predicate_builder.instance_variable_set(:@table, self)
|
81
|
+
predicate_builder
|
82
|
+
else
|
83
|
+
PredicateBuilder.new(self)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
76
87
|
private
|
77
|
-
attr_reader :klass, :arel_table, :association
|
88
|
+
attr_reader :klass, :types, :arel_table, :association
|
78
89
|
end
|
79
90
|
end
|
@@ -141,10 +141,21 @@ module ActiveRecord
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
def
|
144
|
+
def setup_initial_database_yaml
|
145
|
+
return {} unless defined?(Rails)
|
146
|
+
|
147
|
+
begin
|
148
|
+
Rails.application.config.load_database_yaml
|
149
|
+
rescue
|
150
|
+
$stderr.puts "Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB."
|
151
|
+
|
152
|
+
{}
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def for_each(databases)
|
145
157
|
return {} unless defined?(Rails)
|
146
158
|
|
147
|
-
databases = Rails.application.config.load_database_yaml
|
148
159
|
database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
|
149
160
|
|
150
161
|
# if this is a single database application we don't want tasks for each primary database
|
@@ -169,8 +180,8 @@ module ActiveRecord
|
|
169
180
|
end
|
170
181
|
end
|
171
182
|
|
172
|
-
def create_current(environment = env)
|
173
|
-
each_current_configuration(environment) { |configuration|
|
183
|
+
def create_current(environment = env, spec_name = nil)
|
184
|
+
each_current_configuration(environment, spec_name) { |configuration|
|
174
185
|
create configuration
|
175
186
|
}
|
176
187
|
ActiveRecord::Base.establish_connection(environment.to_sym)
|
@@ -200,9 +211,10 @@ module ActiveRecord
|
|
200
211
|
|
201
212
|
def truncate_tables(configuration)
|
202
213
|
ActiveRecord::Base.connected_to(database: { truncation: configuration }) do
|
203
|
-
|
214
|
+
conn = ActiveRecord::Base.connection
|
215
|
+
table_names = conn.tables
|
204
216
|
table_names -= [
|
205
|
-
|
217
|
+
conn.schema_migration.table_name,
|
206
218
|
InternalMetadata.table_name
|
207
219
|
]
|
208
220
|
|
@@ -233,7 +245,7 @@ module ActiveRecord
|
|
233
245
|
end
|
234
246
|
|
235
247
|
def migrate_status
|
236
|
-
unless ActiveRecord::
|
248
|
+
unless ActiveRecord::Base.connection.schema_migration.table_exists?
|
237
249
|
Kernel.abort "Schema migrations table does not exist yet."
|
238
250
|
end
|
239
251
|
|
@@ -321,10 +333,60 @@ module ActiveRecord
|
|
321
333
|
end
|
322
334
|
ActiveRecord::InternalMetadata.create_table
|
323
335
|
ActiveRecord::InternalMetadata[:environment] = environment
|
336
|
+
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
324
337
|
ensure
|
325
338
|
Migration.verbose = verbose_was
|
326
339
|
end
|
327
340
|
|
341
|
+
def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary")
|
342
|
+
file ||= dump_filename(spec_name, format)
|
343
|
+
|
344
|
+
return true unless File.exist?(file)
|
345
|
+
|
346
|
+
ActiveRecord::Base.establish_connection(configuration)
|
347
|
+
return false unless ActiveRecord::InternalMetadata.table_exists?
|
348
|
+
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
349
|
+
end
|
350
|
+
|
351
|
+
def reconstruct_from_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary") # :nodoc:
|
352
|
+
file ||= dump_filename(spec_name, format)
|
353
|
+
|
354
|
+
check_schema_file(file)
|
355
|
+
|
356
|
+
ActiveRecord::Base.establish_connection(configuration)
|
357
|
+
|
358
|
+
if schema_up_to_date?(configuration, format, file, environment, spec_name)
|
359
|
+
truncate_tables(configuration)
|
360
|
+
else
|
361
|
+
purge(configuration)
|
362
|
+
load_schema(configuration, format, file, environment, spec_name)
|
363
|
+
end
|
364
|
+
rescue ActiveRecord::NoDatabaseError
|
365
|
+
create(configuration)
|
366
|
+
load_schema(configuration, format, file, environment, spec_name)
|
367
|
+
end
|
368
|
+
|
369
|
+
def dump_schema(configuration, format = ActiveRecord::Base.schema_format, spec_name = "primary") # :nodoc:
|
370
|
+
require "active_record/schema_dumper"
|
371
|
+
filename = dump_filename(spec_name, format)
|
372
|
+
connection = ActiveRecord::Base.connection
|
373
|
+
|
374
|
+
case format
|
375
|
+
when :ruby
|
376
|
+
File.open(filename, "w:utf-8") do |file|
|
377
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
378
|
+
end
|
379
|
+
when :sql
|
380
|
+
structure_dump(configuration, filename)
|
381
|
+
if connection.schema_migration.table_exists?
|
382
|
+
File.open(filename, "a") do |f|
|
383
|
+
f.puts connection.dump_schema_information
|
384
|
+
f.print "\n"
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
328
390
|
def schema_file(format = ActiveRecord::Base.schema_format)
|
329
391
|
File.join(db_dir, schema_file_type(format))
|
330
392
|
end
|
@@ -406,12 +468,14 @@ module ActiveRecord
|
|
406
468
|
task.is_a?(String) ? task.constantize : task
|
407
469
|
end
|
408
470
|
|
409
|
-
def each_current_configuration(environment)
|
471
|
+
def each_current_configuration(environment, spec_name = nil)
|
410
472
|
environments = [environment]
|
411
473
|
environments << "test" if environment == "development"
|
412
474
|
|
413
475
|
environments.each do |env|
|
414
476
|
ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
|
477
|
+
next if spec_name && spec_name != db_config.spec_name
|
478
|
+
|
415
479
|
yield db_config.config, db_config.spec_name, env
|
416
480
|
end
|
417
481
|
end
|
@@ -433,6 +497,10 @@ module ActiveRecord
|
|
433
497
|
def local_database?(configuration)
|
434
498
|
configuration["host"].blank? || LOCAL_HOSTS.include?(configuration["host"])
|
435
499
|
end
|
500
|
+
|
501
|
+
def schema_sha1(file)
|
502
|
+
Digest::SHA1.hexdigest(File.read(file))
|
503
|
+
end
|
436
504
|
end
|
437
505
|
end
|
438
506
|
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Tasks # :nodoc:
|
5
5
|
class MySQLDatabaseTasks # :nodoc:
|
6
|
+
ER_DB_CREATE_EXISTS = 1007
|
7
|
+
|
6
8
|
delegate :connection, :establish_connection, to: ActiveRecord::Base
|
7
9
|
|
8
10
|
def initialize(configuration)
|
@@ -14,7 +16,7 @@ module ActiveRecord
|
|
14
16
|
connection.create_database configuration["database"], creation_options
|
15
17
|
establish_connection configuration
|
16
18
|
rescue ActiveRecord::StatementInvalid => error
|
17
|
-
if error.
|
19
|
+
if connection.error_number(error.cause) == ER_DB_CREATE_EXISTS
|
18
20
|
raise DatabaseAlreadyExists
|
19
21
|
else
|
20
22
|
raise
|
@@ -67,7 +69,6 @@ module ActiveRecord
|
|
67
69
|
end
|
68
70
|
|
69
71
|
private
|
70
|
-
|
71
72
|
attr_reader :configuration
|
72
73
|
|
73
74
|
def configuration_without_database
|
@@ -8,31 +8,16 @@ module ActiveRecord
|
|
8
8
|
create_and_load_schema(i, env_name: Rails.env)
|
9
9
|
end
|
10
10
|
|
11
|
-
ActiveSupport::Testing::Parallelization.run_cleanup_hook do
|
12
|
-
drop(env_name: Rails.env)
|
13
|
-
end
|
14
|
-
|
15
11
|
def self.create_and_load_schema(i, env_name:)
|
16
12
|
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
|
17
13
|
|
18
14
|
ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
|
19
15
|
db_config.config["database"] += "-#{i}"
|
20
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
21
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
|
16
|
+
ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
|
22
17
|
end
|
23
18
|
ensure
|
24
19
|
ActiveRecord::Base.establish_connection(Rails.env.to_sym)
|
25
20
|
ENV["VERBOSE"] = old
|
26
21
|
end
|
27
|
-
|
28
|
-
def self.drop(env_name:)
|
29
|
-
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
|
30
|
-
|
31
|
-
ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
|
32
|
-
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
|
33
|
-
end
|
34
|
-
ensure
|
35
|
-
ENV["VERBOSE"] = old
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
@@ -129,6 +129,7 @@ module ActiveRecord
|
|
129
129
|
# When connections are established in the future, begin a transaction too
|
130
130
|
@connection_subscriber = ActiveSupport::Notifications.subscribe("!connection.active_record") do |_, _, _, _, payload|
|
131
131
|
spec_name = payload[:spec_name] if payload.key?(:spec_name)
|
132
|
+
setup_shared_connection_pool
|
132
133
|
|
133
134
|
if spec_name
|
134
135
|
begin
|
@@ -179,7 +180,6 @@ module ActiveRecord
|
|
179
180
|
end
|
180
181
|
|
181
182
|
private
|
182
|
-
|
183
183
|
# Shares the writing connection pool with connections on
|
184
184
|
# other handlers.
|
185
185
|
#
|
@@ -194,6 +194,7 @@ module ActiveRecord
|
|
194
194
|
handler.connection_pool_list.each do |pool|
|
195
195
|
name = pool.spec.name
|
196
196
|
writing_connection = writing_handler.retrieve_connection_pool(name)
|
197
|
+
return unless writing_connection
|
197
198
|
handler.send(:owner_to_pool)[name] = writing_connection
|
198
199
|
end
|
199
200
|
end
|
@@ -59,19 +59,26 @@ module ActiveRecord
|
|
59
59
|
attribute_names.index_with(time || current_time_from_proper_timezone)
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
timestamp_attributes_for_create
|
65
|
-
|
62
|
+
def timestamp_attributes_for_create_in_model
|
63
|
+
@timestamp_attributes_for_create_in_model ||=
|
64
|
+
(timestamp_attributes_for_create & column_names).freeze
|
65
|
+
end
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
def timestamp_attributes_for_update_in_model
|
68
|
+
@timestamp_attributes_for_update_in_model ||=
|
69
|
+
(timestamp_attributes_for_update & column_names).freeze
|
70
|
+
end
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
def all_timestamp_attributes_in_model
|
73
|
+
@all_timestamp_attributes_in_model ||=
|
74
|
+
(timestamp_attributes_for_create_in_model + timestamp_attributes_for_update_in_model).freeze
|
75
|
+
end
|
76
|
+
|
77
|
+
def current_time_from_proper_timezone
|
78
|
+
default_timezone == :utc ? Time.now.utc : Time.now
|
79
|
+
end
|
74
80
|
|
81
|
+
private
|
75
82
|
def timestamp_attributes_for_create
|
76
83
|
["created_at", "created_on"]
|
77
84
|
end
|
@@ -80,13 +87,15 @@ module ActiveRecord
|
|
80
87
|
["updated_at", "updated_on"]
|
81
88
|
end
|
82
89
|
|
83
|
-
def
|
84
|
-
|
90
|
+
def reload_schema_from_cache
|
91
|
+
@timestamp_attributes_for_create_in_model = nil
|
92
|
+
@timestamp_attributes_for_update_in_model = nil
|
93
|
+
@all_timestamp_attributes_in_model = nil
|
94
|
+
super
|
85
95
|
end
|
86
96
|
end
|
87
97
|
|
88
98
|
private
|
89
|
-
|
90
99
|
def _create_record
|
91
100
|
if record_timestamps
|
92
101
|
current_time = current_time_from_proper_timezone
|
@@ -124,19 +133,19 @@ module ActiveRecord
|
|
124
133
|
end
|
125
134
|
|
126
135
|
def timestamp_attributes_for_create_in_model
|
127
|
-
self.class.
|
136
|
+
self.class.timestamp_attributes_for_create_in_model
|
128
137
|
end
|
129
138
|
|
130
139
|
def timestamp_attributes_for_update_in_model
|
131
|
-
self.class.
|
140
|
+
self.class.timestamp_attributes_for_update_in_model
|
132
141
|
end
|
133
142
|
|
134
143
|
def all_timestamp_attributes_in_model
|
135
|
-
self.class.
|
144
|
+
self.class.all_timestamp_attributes_in_model
|
136
145
|
end
|
137
146
|
|
138
147
|
def current_time_from_proper_timezone
|
139
|
-
self.class.
|
148
|
+
self.class.current_time_from_proper_timezone
|
140
149
|
end
|
141
150
|
|
142
151
|
def max_updated_column_timestamp
|