activerecord 6.1.7 → 7.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1516 -1019
- data/MIT-LICENSE +1 -1
- data/README.rdoc +17 -18
- data/lib/active_record/aggregations.rb +17 -14
- data/lib/active_record/association_relation.rb +1 -11
- data/lib/active_record/associations/association.rb +50 -19
- data/lib/active_record/associations/association_scope.rb +17 -12
- data/lib/active_record/associations/belongs_to_association.rb +28 -9
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +10 -2
- data/lib/active_record/associations/builder/association.rb +11 -5
- data/lib/active_record/associations/builder/belongs_to.rb +40 -14
- data/lib/active_record/associations/builder/collection_association.rb +10 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
- data/lib/active_record/associations/builder/has_many.rb +3 -2
- data/lib/active_record/associations/builder/has_one.rb +2 -1
- data/lib/active_record/associations/builder/singular_association.rb +6 -2
- data/lib/active_record/associations/collection_association.rb +35 -31
- data/lib/active_record/associations/collection_proxy.rb +30 -15
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +28 -18
- data/lib/active_record/associations/has_many_through_association.rb +12 -7
- data/lib/active_record/associations/has_one_association.rb +20 -10
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +26 -16
- data/lib/active_record/associations/preloader/association.rb +207 -52
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +147 -0
- data/lib/active_record/associations/preloader/through_association.rb +50 -14
- data/lib/active_record/associations/preloader.rb +50 -121
- data/lib/active_record/associations/singular_association.rb +9 -3
- data/lib/active_record/associations/through_association.rb +25 -14
- data/lib/active_record/associations.rb +423 -289
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +1 -3
- data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
- data/lib/active_record/attribute_methods/dirty.rb +61 -14
- data/lib/active_record/attribute_methods/primary_key.rb +78 -26
- data/lib/active_record/attribute_methods/query.rb +31 -19
- data/lib/active_record/attribute_methods/read.rb +25 -10
- data/lib/active_record/attribute_methods/serialization.rb +194 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +4 -3
- data/lib/active_record/attribute_methods/write.rb +10 -13
- data/lib/active_record/attribute_methods.rb +121 -40
- data/lib/active_record/attributes.rb +27 -38
- data/lib/active_record/autosave_association.rb +61 -30
- data/lib/active_record/base.rb +25 -2
- data/lib/active_record/callbacks.rb +18 -34
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +70 -46
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +367 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +96 -590
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +171 -51
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +77 -27
- data/lib/active_record/connection_adapters/abstract/quoting.rb +87 -73
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +360 -136
- data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
- data/lib/active_record/connection_adapters/abstract_adapter.rb +622 -149
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +285 -156
- data/lib/active_record/connection_adapters/column.rb +13 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +25 -134
- data/lib/active_record/connection_adapters/mysql/quoting.rb +56 -25
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +38 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +148 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +104 -53
- data/lib/active_record/connection_adapters/pool_config.rb +20 -11
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +18 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +86 -52
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -56
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +153 -3
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +381 -69
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +492 -230
- data/lib/active_record/connection_adapters/schema_cache.rb +319 -90
- data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +65 -53
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +37 -21
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +7 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +43 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +294 -102
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +98 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +254 -0
- data/lib/active_record/connection_adapters.rb +9 -6
- data/lib/active_record/connection_handling.rb +107 -136
- data/lib/active_record/core.rb +194 -224
- data/lib/active_record/counter_cache.rb +46 -25
- data/lib/active_record/database_configurations/connection_url_resolver.rb +2 -1
- data/lib/active_record/database_configurations/database_config.rb +21 -12
- data/lib/active_record/database_configurations/hash_config.rb +84 -16
- data/lib/active_record/database_configurations/url_config.rb +18 -12
- data/lib/active_record/database_configurations.rb +95 -59
- data/lib/active_record/delegated_type.rb +61 -15
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +3 -1
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +1 -1
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +68 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +224 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +151 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +155 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +172 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_serializer.rb +92 -0
- data/lib/active_record/encryption/null_encryptor.rb +21 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
- data/lib/active_record/encryption/scheme.rb +96 -0
- data/lib/active_record/encryption.rb +56 -0
- data/lib/active_record/enum.rb +156 -62
- data/lib/active_record/errors.rb +171 -15
- data/lib/active_record/explain.rb +23 -3
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +15 -1
- data/lib/active_record/fixture_set/model_metadata.rb +14 -4
- data/lib/active_record/fixture_set/render_context.rb +2 -0
- data/lib/active_record/fixture_set/table_row.rb +70 -14
- data/lib/active_record/fixture_set/table_rows.rb +4 -4
- data/lib/active_record/fixtures.rb +131 -86
- data/lib/active_record/future_result.rb +164 -0
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +81 -29
- data/lib/active_record/insert_all.rb +133 -20
- data/lib/active_record/integration.rb +11 -10
- data/lib/active_record/internal_metadata.rb +117 -33
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +36 -21
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +52 -19
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
- data/lib/active_record/middleware/database_selector.rb +23 -13
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +108 -13
- data/lib/active_record/migration/compatibility.rb +221 -48
- data/lib/active_record/migration/default_strategy.rb +23 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration.rb +355 -171
- data/lib/active_record/model_schema.rb +116 -97
- data/lib/active_record/nested_attributes.rb +36 -15
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +159 -0
- data/lib/active_record/persistence.rb +405 -85
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +3 -21
- data/lib/active_record/query_logs.rb +174 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +29 -6
- data/lib/active_record/railtie.rb +219 -43
- data/lib/active_record/railties/controller_runtime.rb +13 -9
- data/lib/active_record/railties/databases.rake +185 -249
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +41 -3
- data/lib/active_record/reflection.rb +229 -80
- data/lib/active_record/relation/batches/batch_enumerator.rb +23 -7
- data/lib/active_record/relation/batches.rb +192 -63
- data/lib/active_record/relation/calculations.rb +211 -90
- data/lib/active_record/relation/delegation.rb +27 -13
- data/lib/active_record/relation/finder_methods.rb +108 -51
- data/lib/active_record/relation/merger.rb +22 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +31 -3
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +4 -6
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +27 -20
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +654 -127
- data/lib/active_record/relation/record_fetch_warning.rb +7 -9
- data/lib/active_record/relation/spawn_methods.rb +20 -3
- data/lib/active_record/relation/where_clause.rb +10 -19
- data/lib/active_record/relation.rb +262 -120
- data/lib/active_record/result.rb +37 -11
- data/lib/active_record/runtime_registry.rb +18 -13
- data/lib/active_record/sanitization.rb +65 -20
- data/lib/active_record/schema.rb +36 -22
- data/lib/active_record/schema_dumper.rb +73 -24
- data/lib/active_record/schema_migration.rb +68 -33
- data/lib/active_record/scoping/default.rb +72 -15
- data/lib/active_record/scoping/named.rb +5 -13
- data/lib/active_record/scoping.rb +65 -34
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/serialization.rb +6 -1
- data/lib/active_record/signed_id.rb +10 -8
- data/lib/active_record/store.rb +10 -10
- data/lib/active_record/suppressor.rb +13 -15
- data/lib/active_record/table_metadata.rb +16 -3
- data/lib/active_record/tasks/database_tasks.rb +225 -136
- data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
- data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +15 -7
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +116 -96
- data/lib/active_record/timestamp.rb +28 -17
- data/lib/active_record/token_for.rb +113 -0
- data/lib/active_record/touch_later.rb +11 -6
- data/lib/active_record/transactions.rb +48 -27
- data/lib/active_record/translation.rb +3 -3
- data/lib/active_record/type/adapter_specific_registry.rb +32 -14
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +9 -5
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/type/type_map.rb +17 -20
- data/lib/active_record/type.rb +1 -2
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +4 -4
- data/lib/active_record/validations/numericality.rb +5 -4
- data/lib/active_record/validations/presence.rb +5 -28
- data/lib/active_record/validations/uniqueness.rb +51 -6
- data/lib/active_record/validations.rb +8 -4
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +335 -32
- data/lib/arel/attributes/attribute.rb +0 -8
- data/lib/arel/crud.rb +28 -22
- data/lib/arel/delete_manager.rb +18 -4
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +2 -3
- data/lib/arel/nodes/and.rb +4 -0
- data/lib/arel/nodes/binary.rb +6 -1
- data/lib/arel/nodes/bound_sql_literal.rb +61 -0
- data/lib/arel/nodes/casted.rb +1 -1
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +12 -13
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/function.rb +1 -0
- data/lib/arel/nodes/homogeneous_in.rb +0 -8
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/node.rb +111 -2
- data/lib/arel/nodes/select_core.rb +2 -2
- data/lib/arel/nodes/select_statement.rb +2 -2
- data/lib/arel/nodes/sql_literal.rb +6 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes/update_statement.rb +8 -3
- data/lib/arel/nodes.rb +5 -0
- data/lib/arel/predications.rb +13 -3
- data/lib/arel/select_manager.rb +10 -4
- data/lib/arel/table.rb +9 -6
- data/lib/arel/tree_manager.rb +0 -12
- data/lib/arel/update_manager.rb +18 -4
- data/lib/arel/visitors/dot.rb +80 -90
- data/lib/arel/visitors/mysql.rb +16 -3
- data/lib/arel/visitors/postgresql.rb +0 -10
- data/lib/arel/visitors/to_sql.rb +139 -19
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +18 -3
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration.rb +3 -1
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +92 -13
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -67
@@ -6,14 +6,16 @@ module ActiveRecord
|
|
6
6
|
module Tasks # :nodoc:
|
7
7
|
class DatabaseNotSupported < StandardError; end # :nodoc:
|
8
8
|
|
9
|
+
# = Active Record \DatabaseTasks
|
10
|
+
#
|
9
11
|
# ActiveRecord::Tasks::DatabaseTasks is a utility class, which encapsulates
|
10
12
|
# logic behind common tasks used to manage database and migrations.
|
11
13
|
#
|
12
|
-
# The tasks defined here are used with Rails commands provided by Active Record.
|
14
|
+
# The tasks defined here are used with \Rails commands provided by Active Record.
|
13
15
|
#
|
14
16
|
# In order to use DatabaseTasks, a few config values need to be set. All the needed
|
15
|
-
# config values are set by Rails already, so it's necessary to do it only if you
|
16
|
-
# want to change the defaults or when you want to use Active Record outside of Rails
|
17
|
+
# config values are set by \Rails already, so it's necessary to do it only if you
|
18
|
+
# want to change the defaults or when you want to use Active Record outside of \Rails
|
17
19
|
# (in such case after configuring the database tasks, you can also use the rake tasks
|
18
20
|
# defined in Active Record).
|
19
21
|
#
|
@@ -27,7 +29,7 @@ module ActiveRecord
|
|
27
29
|
# * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
|
28
30
|
# * +root+: a path to the root of the application.
|
29
31
|
#
|
30
|
-
# Example usage of DatabaseTasks outside Rails could look as such:
|
32
|
+
# Example usage of DatabaseTasks outside \Rails could look as such:
|
31
33
|
#
|
32
34
|
# include ActiveRecord::Tasks
|
33
35
|
# DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
|
@@ -39,35 +41,33 @@ module ActiveRecord
|
|
39
41
|
##
|
40
42
|
# :singleton-method:
|
41
43
|
# Extra flags passed to database CLI tool (mysqldump/pg_dump) when calling db:schema:dump
|
44
|
+
# It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
|
45
|
+
# Example:
|
46
|
+
# ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = {
|
47
|
+
# mysql2: ['--no-defaults', '--skip-add-drop-table'],
|
48
|
+
# postgres: '--no-tablespaces'
|
49
|
+
# }
|
42
50
|
mattr_accessor :structure_dump_flags, instance_accessor: false
|
43
51
|
|
44
52
|
##
|
45
53
|
# :singleton-method:
|
46
54
|
# Extra flags passed to database CLI tool when calling db:schema:load
|
55
|
+
# It can be used as a string/array (the typical case) or a hash (when you use multiple adapters)
|
47
56
|
mattr_accessor :structure_load_flags, instance_accessor: false
|
48
57
|
|
49
58
|
extend self
|
50
59
|
|
51
|
-
attr_writer :
|
52
|
-
deprecate :current_config=
|
60
|
+
attr_writer :db_dir, :migrations_paths, :fixtures_path, :root, :env, :seed_loader
|
53
61
|
attr_accessor :database_configuration
|
54
62
|
|
55
63
|
LOCAL_HOSTS = ["127.0.0.1", "localhost"]
|
56
64
|
|
57
|
-
def check_protected_environments!
|
58
|
-
|
59
|
-
current = ActiveRecord::Base.connection.migration_context.current_environment
|
60
|
-
stored = ActiveRecord::Base.connection.migration_context.last_stored_environment
|
61
|
-
|
62
|
-
if ActiveRecord::Base.connection.migration_context.protected_environment?
|
63
|
-
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
64
|
-
end
|
65
|
+
def check_protected_environments!(environment = env)
|
66
|
+
return if ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
end
|
68
|
+
configs_for(env_name: environment).each do |db_config|
|
69
|
+
check_current_protected_environment!(db_config)
|
69
70
|
end
|
70
|
-
rescue ActiveRecord::NoDatabaseError
|
71
71
|
end
|
72
72
|
|
73
73
|
def register_task(pattern, task)
|
@@ -76,6 +76,7 @@ module ActiveRecord
|
|
76
76
|
end
|
77
77
|
|
78
78
|
register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
79
|
+
register_task(/trilogy/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
79
80
|
register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
|
80
81
|
register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
|
81
82
|
|
@@ -103,11 +104,6 @@ module ActiveRecord
|
|
103
104
|
@env ||= Rails.env
|
104
105
|
end
|
105
106
|
|
106
|
-
def spec
|
107
|
-
@spec ||= "primary"
|
108
|
-
end
|
109
|
-
deprecate spec: "please use name instead"
|
110
|
-
|
111
107
|
def name
|
112
108
|
@name ||= "primary"
|
113
109
|
end
|
@@ -116,18 +112,6 @@ module ActiveRecord
|
|
116
112
|
@seed_loader ||= Rails.application
|
117
113
|
end
|
118
114
|
|
119
|
-
def current_config(options = {})
|
120
|
-
if options.has_key?(:config)
|
121
|
-
@current_config = options[:config]
|
122
|
-
else
|
123
|
-
env_name = options[:env] || env
|
124
|
-
name = options[:spec] || "primary"
|
125
|
-
|
126
|
-
@current_config ||= ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)&.configuration_hash
|
127
|
-
end
|
128
|
-
end
|
129
|
-
deprecate :current_config
|
130
|
-
|
131
115
|
def create(configuration, *arguments)
|
132
116
|
db_config = resolve_configuration(configuration)
|
133
117
|
database_adapter_for(db_config, *arguments).create
|
@@ -141,28 +125,20 @@ module ActiveRecord
|
|
141
125
|
end
|
142
126
|
|
143
127
|
def create_all
|
144
|
-
|
128
|
+
db_config = migration_connection.pool.db_config
|
129
|
+
|
145
130
|
each_local_configuration { |db_config| create(db_config) }
|
146
|
-
|
147
|
-
|
148
|
-
end
|
131
|
+
|
132
|
+
migration_class.establish_connection(db_config)
|
149
133
|
end
|
150
134
|
|
151
|
-
def setup_initial_database_yaml
|
135
|
+
def setup_initial_database_yaml # :nodoc:
|
152
136
|
return {} unless defined?(Rails)
|
153
137
|
|
154
|
-
|
155
|
-
Rails.application.config.load_database_yaml
|
156
|
-
rescue
|
157
|
-
unless ActiveRecord::Base.suppress_multiple_database_warning
|
158
|
-
$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."
|
159
|
-
end
|
160
|
-
|
161
|
-
{}
|
162
|
-
end
|
138
|
+
Rails.application.config.load_database_yaml
|
163
139
|
end
|
164
140
|
|
165
|
-
def for_each(databases)
|
141
|
+
def for_each(databases) # :nodoc:
|
166
142
|
return {} unless defined?(Rails)
|
167
143
|
|
168
144
|
database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
|
@@ -171,12 +147,14 @@ module ActiveRecord
|
|
171
147
|
return if database_configs.count == 1
|
172
148
|
|
173
149
|
database_configs.each do |db_config|
|
150
|
+
next unless db_config.database_tasks?
|
151
|
+
|
174
152
|
yield db_config.name
|
175
153
|
end
|
176
154
|
end
|
177
155
|
|
178
|
-
def raise_for_multi_db(environment = env, command:)
|
179
|
-
db_configs =
|
156
|
+
def raise_for_multi_db(environment = env, command:) # :nodoc:
|
157
|
+
db_configs = configs_for(env_name: environment)
|
180
158
|
|
181
159
|
if db_configs.count > 1
|
182
160
|
dbs_list = []
|
@@ -191,7 +169,36 @@ module ActiveRecord
|
|
191
169
|
|
192
170
|
def create_current(environment = env, name = nil)
|
193
171
|
each_current_configuration(environment, name) { |db_config| create(db_config) }
|
194
|
-
|
172
|
+
|
173
|
+
migration_class.establish_connection(environment.to_sym)
|
174
|
+
end
|
175
|
+
|
176
|
+
def prepare_all
|
177
|
+
seed = false
|
178
|
+
|
179
|
+
each_current_configuration(env) do |db_config|
|
180
|
+
with_temporary_pool(db_config) do
|
181
|
+
begin
|
182
|
+
database_initialized = migration_connection.schema_migration.table_exists?
|
183
|
+
rescue ActiveRecord::NoDatabaseError
|
184
|
+
create(db_config)
|
185
|
+
retry
|
186
|
+
end
|
187
|
+
|
188
|
+
unless database_initialized
|
189
|
+
if File.exist?(schema_dump_path(db_config))
|
190
|
+
load_schema(db_config, ActiveRecord.schema_format, nil)
|
191
|
+
end
|
192
|
+
|
193
|
+
seed = true
|
194
|
+
end
|
195
|
+
|
196
|
+
migrate
|
197
|
+
dump_schema(db_config) if ActiveRecord.dump_schema_after_migration
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
load_seed if seed
|
195
202
|
end
|
196
203
|
|
197
204
|
def drop(configuration, *arguments)
|
@@ -215,51 +222,73 @@ module ActiveRecord
|
|
215
222
|
end
|
216
223
|
|
217
224
|
def truncate_tables(db_config)
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
connection.truncate_tables(*connection.tables)
|
225
|
+
with_temporary_connection(db_config) do |conn|
|
226
|
+
conn.truncate_tables(*conn.tables)
|
227
|
+
end
|
222
228
|
end
|
223
229
|
private :truncate_tables
|
224
230
|
|
225
231
|
def truncate_all(environment = env)
|
226
|
-
|
232
|
+
configs_for(env_name: environment).each do |db_config|
|
227
233
|
truncate_tables(db_config)
|
228
234
|
end
|
229
235
|
end
|
230
236
|
|
231
|
-
def migrate
|
232
|
-
check_target_version
|
233
|
-
|
237
|
+
def migrate(version = nil)
|
234
238
|
scope = ENV["SCOPE"]
|
235
239
|
verbose_was, Migration.verbose = Migration.verbose, verbose?
|
236
240
|
|
237
|
-
|
238
|
-
|
241
|
+
check_target_version
|
242
|
+
|
243
|
+
migration_connection.migration_context.migrate(target_version) do |migration|
|
244
|
+
if version.blank?
|
245
|
+
scope.blank? || scope == migration.scope
|
246
|
+
else
|
247
|
+
migration.version == version
|
248
|
+
end
|
249
|
+
end.tap do |migrations_ran|
|
250
|
+
Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
|
239
251
|
end
|
240
252
|
|
241
|
-
|
253
|
+
migration_connection.schema_cache.clear!
|
242
254
|
ensure
|
243
255
|
Migration.verbose = verbose_was
|
244
256
|
end
|
245
257
|
|
258
|
+
def db_configs_with_versions(db_configs) # :nodoc:
|
259
|
+
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
260
|
+
|
261
|
+
with_temporary_connection_for_each do |conn|
|
262
|
+
db_config = conn.pool.db_config
|
263
|
+
versions_to_run = conn.migration_context.pending_migration_versions
|
264
|
+
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
265
|
+
|
266
|
+
versions_to_run.each do |version|
|
267
|
+
next if target_version && target_version != version
|
268
|
+
db_configs_with_versions[version] << db_config
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
db_configs_with_versions
|
273
|
+
end
|
274
|
+
|
246
275
|
def migrate_status
|
247
|
-
unless
|
276
|
+
unless migration_connection.schema_migration.table_exists?
|
248
277
|
Kernel.abort "Schema migrations table does not exist yet."
|
249
278
|
end
|
250
279
|
|
251
280
|
# output
|
252
|
-
puts "\ndatabase: #{
|
281
|
+
puts "\ndatabase: #{migration_connection.pool.db_config.database}\n\n"
|
253
282
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
254
283
|
puts "-" * 50
|
255
|
-
|
284
|
+
migration_connection.migration_context.migrations_status.each do |status, version, name|
|
256
285
|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
257
286
|
end
|
258
287
|
puts
|
259
288
|
end
|
260
289
|
|
261
290
|
def check_target_version
|
262
|
-
if target_version && !
|
291
|
+
if target_version && !Migration.valid_version_format?(ENV["VERSION"])
|
263
292
|
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
264
293
|
end
|
265
294
|
end
|
@@ -269,7 +298,7 @@ module ActiveRecord
|
|
269
298
|
end
|
270
299
|
|
271
300
|
def charset_current(env_name = env, db_name = name)
|
272
|
-
db_config =
|
301
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
273
302
|
charset(db_config)
|
274
303
|
end
|
275
304
|
|
@@ -279,7 +308,7 @@ module ActiveRecord
|
|
279
308
|
end
|
280
309
|
|
281
310
|
def collation_current(env_name = env, db_name = name)
|
282
|
-
db_config =
|
311
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
283
312
|
collation(db_config)
|
284
313
|
end
|
285
314
|
|
@@ -299,27 +328,30 @@ module ActiveRecord
|
|
299
328
|
|
300
329
|
def purge_current(environment = env)
|
301
330
|
each_current_configuration(environment) { |db_config| purge(db_config) }
|
302
|
-
|
331
|
+
|
332
|
+
migration_class.establish_connection(environment.to_sym)
|
303
333
|
end
|
304
334
|
|
305
335
|
def structure_dump(configuration, *arguments)
|
306
336
|
db_config = resolve_configuration(configuration)
|
307
337
|
filename = arguments.delete_at(0)
|
308
|
-
|
338
|
+
flags = structure_dump_flags_for(db_config.adapter)
|
339
|
+
database_adapter_for(db_config, *arguments).structure_dump(filename, flags)
|
309
340
|
end
|
310
341
|
|
311
342
|
def structure_load(configuration, *arguments)
|
312
343
|
db_config = resolve_configuration(configuration)
|
313
344
|
filename = arguments.delete_at(0)
|
314
|
-
|
345
|
+
flags = structure_load_flags_for(db_config.adapter)
|
346
|
+
database_adapter_for(db_config, *arguments).structure_load(filename, flags)
|
315
347
|
end
|
316
348
|
|
317
|
-
def load_schema(db_config, format = ActiveRecord
|
318
|
-
file ||=
|
349
|
+
def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
350
|
+
file ||= schema_dump_path(db_config, format)
|
351
|
+
return unless file
|
319
352
|
|
320
353
|
verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
|
321
354
|
check_schema_file(file)
|
322
|
-
ActiveRecord::Base.establish_connection(db_config)
|
323
355
|
|
324
356
|
case format
|
325
357
|
when :ruby
|
@@ -329,95 +361,80 @@ module ActiveRecord
|
|
329
361
|
else
|
330
362
|
raise ArgumentError, "unknown format #{format.inspect}"
|
331
363
|
end
|
332
|
-
|
333
|
-
|
334
|
-
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
364
|
+
|
365
|
+
migration_connection.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
|
335
366
|
ensure
|
336
367
|
Migration.verbose = verbose_was
|
337
368
|
end
|
338
369
|
|
339
|
-
def schema_up_to_date?(configuration, format = ActiveRecord
|
370
|
+
def schema_up_to_date?(configuration, format = ActiveRecord.schema_format, file = nil)
|
340
371
|
db_config = resolve_configuration(configuration)
|
341
372
|
|
342
|
-
|
343
|
-
ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 7.0.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
|
344
|
-
end
|
345
|
-
|
346
|
-
name ||= db_config.name
|
347
|
-
|
348
|
-
file ||= dump_filename(name, format)
|
373
|
+
file ||= schema_dump_path(db_config)
|
349
374
|
|
350
|
-
return true unless File.exist?(file)
|
375
|
+
return true unless file && File.exist?(file)
|
351
376
|
|
352
|
-
|
377
|
+
with_temporary_connection(db_config) do |connection|
|
378
|
+
return false unless connection.internal_metadata.enabled?
|
379
|
+
return false unless connection.internal_metadata.table_exists?
|
353
380
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
381
|
+
connection.internal_metadata[:schema_sha1] == schema_sha1(file)
|
382
|
+
end
|
358
383
|
end
|
359
384
|
|
360
|
-
def reconstruct_from_schema(db_config, format = ActiveRecord
|
361
|
-
file ||=
|
362
|
-
|
363
|
-
check_schema_file(file)
|
385
|
+
def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
386
|
+
file ||= schema_dump_path(db_config, format)
|
364
387
|
|
365
|
-
|
388
|
+
check_schema_file(file) if file
|
366
389
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
390
|
+
with_temporary_pool(db_config, clobber: true) do
|
391
|
+
if schema_up_to_date?(db_config, format, file)
|
392
|
+
truncate_tables(db_config)
|
393
|
+
else
|
394
|
+
purge(db_config)
|
395
|
+
load_schema(db_config, format, file)
|
396
|
+
end
|
397
|
+
rescue ActiveRecord::NoDatabaseError
|
398
|
+
create(db_config)
|
371
399
|
load_schema(db_config, format, file)
|
372
400
|
end
|
373
|
-
rescue ActiveRecord::NoDatabaseError
|
374
|
-
create(db_config)
|
375
|
-
load_schema(db_config, format, file)
|
376
401
|
end
|
377
402
|
|
378
|
-
def dump_schema(db_config, format = ActiveRecord
|
403
|
+
def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
|
404
|
+
return unless db_config.schema_dump
|
405
|
+
|
379
406
|
require "active_record/schema_dumper"
|
380
|
-
filename =
|
381
|
-
|
407
|
+
filename = schema_dump_path(db_config, format)
|
408
|
+
return unless filename
|
382
409
|
|
383
410
|
FileUtils.mkdir_p(db_dir)
|
384
411
|
case format
|
385
412
|
when :ruby
|
386
413
|
File.open(filename, "w:utf-8") do |file|
|
387
|
-
ActiveRecord::SchemaDumper.dump(
|
414
|
+
ActiveRecord::SchemaDumper.dump(migration_connection, file)
|
388
415
|
end
|
389
416
|
when :sql
|
390
417
|
structure_dump(db_config, filename)
|
391
|
-
if
|
418
|
+
if migration_connection.schema_migration.table_exists?
|
392
419
|
File.open(filename, "a") do |f|
|
393
|
-
f.puts
|
420
|
+
f.puts migration_connection.dump_schema_information
|
394
421
|
f.print "\n"
|
395
422
|
end
|
396
423
|
end
|
397
424
|
end
|
398
425
|
end
|
399
426
|
|
400
|
-
def
|
401
|
-
|
402
|
-
end
|
427
|
+
def schema_dump_path(db_config, format = ActiveRecord.schema_format)
|
428
|
+
return ENV["SCHEMA"] if ENV["SCHEMA"]
|
403
429
|
|
404
|
-
|
405
|
-
|
406
|
-
when :ruby
|
407
|
-
"schema.rb"
|
408
|
-
when :sql
|
409
|
-
"structure.sql"
|
410
|
-
end
|
411
|
-
end
|
430
|
+
filename = db_config.schema_dump(format)
|
431
|
+
return unless filename
|
412
432
|
|
413
|
-
|
414
|
-
|
415
|
-
schema_file_type(format)
|
433
|
+
if File.dirname(filename) == ActiveRecord::Tasks::DatabaseTasks.db_dir
|
434
|
+
filename
|
416
435
|
else
|
417
|
-
|
436
|
+
File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
418
437
|
end
|
419
|
-
|
420
|
-
ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
421
438
|
end
|
422
439
|
|
423
440
|
def cache_dump_filename(db_config_name, schema_cache_path: nil)
|
@@ -430,11 +447,12 @@ module ActiveRecord
|
|
430
447
|
schema_cache_path || ENV["SCHEMA_CACHE"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
431
448
|
end
|
432
449
|
|
433
|
-
def load_schema_current(format = ActiveRecord
|
450
|
+
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
434
451
|
each_current_configuration(environment) do |db_config|
|
435
|
-
|
452
|
+
with_temporary_connection(db_config) do
|
453
|
+
load_schema(db_config, format, file)
|
454
|
+
end
|
436
455
|
end
|
437
|
-
ActiveRecord::Base.establish_connection(environment.to_sym)
|
438
456
|
end
|
439
457
|
|
440
458
|
def check_schema_file(filename)
|
@@ -457,7 +475,7 @@ module ActiveRecord
|
|
457
475
|
|
458
476
|
# Dumps the schema cache in YAML format for the connection into the file
|
459
477
|
#
|
460
|
-
# ==== Examples
|
478
|
+
# ==== Examples
|
461
479
|
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.connection, "tmp/schema_dump.yaml")
|
462
480
|
def dump_schema_cache(conn, filename)
|
463
481
|
conn.schema_cache.dump_to(filename)
|
@@ -467,7 +485,45 @@ module ActiveRecord
|
|
467
485
|
FileUtils.rm_f filename, verbose: false
|
468
486
|
end
|
469
487
|
|
488
|
+
def with_temporary_connection_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
|
489
|
+
if name
|
490
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
|
491
|
+
with_temporary_connection(db_config, clobber: clobber, &block)
|
492
|
+
else
|
493
|
+
ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
|
494
|
+
with_temporary_connection(db_config, clobber: clobber, &block)
|
495
|
+
end
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
def with_temporary_connection(db_config, clobber: false) # :nodoc:
|
500
|
+
with_temporary_pool(db_config, clobber: clobber) do |pool|
|
501
|
+
yield pool.connection
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
def migration_class # :nodoc:
|
506
|
+
ActiveRecord::Base
|
507
|
+
end
|
508
|
+
|
509
|
+
def migration_connection # :nodoc:
|
510
|
+
migration_class.connection
|
511
|
+
end
|
512
|
+
|
470
513
|
private
|
514
|
+
def with_temporary_pool(db_config, clobber: false)
|
515
|
+
original_db_config = migration_class.connection_db_config
|
516
|
+
pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
|
517
|
+
|
518
|
+
yield pool
|
519
|
+
ensure
|
520
|
+
migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
|
521
|
+
end
|
522
|
+
|
523
|
+
def configs_for(**options)
|
524
|
+
Base.configurations.configs_for(**options)
|
525
|
+
end
|
526
|
+
|
471
527
|
def resolve_configuration(configuration)
|
472
528
|
Base.configurations.resolve(configuration)
|
473
529
|
end
|
@@ -488,7 +544,7 @@ module ActiveRecord
|
|
488
544
|
end
|
489
545
|
|
490
546
|
def class_for_adapter(adapter)
|
491
|
-
_key, task = @tasks.
|
547
|
+
_key, task = @tasks.reverse_each.detect { |pattern, _task| adapter[pattern] }
|
492
548
|
unless task
|
493
549
|
raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
|
494
550
|
end
|
@@ -500,7 +556,7 @@ module ActiveRecord
|
|
500
556
|
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
501
557
|
|
502
558
|
environments.each do |env|
|
503
|
-
|
559
|
+
configs_for(env_name: env).each do |db_config|
|
504
560
|
next if name && name != db_config.name
|
505
561
|
|
506
562
|
yield db_config
|
@@ -509,7 +565,7 @@ module ActiveRecord
|
|
509
565
|
end
|
510
566
|
|
511
567
|
def each_local_configuration
|
512
|
-
|
568
|
+
configs_for.each do |db_config|
|
513
569
|
next unless db_config.database
|
514
570
|
|
515
571
|
if local_database?(db_config)
|
@@ -526,7 +582,40 @@ module ActiveRecord
|
|
526
582
|
end
|
527
583
|
|
528
584
|
def schema_sha1(file)
|
529
|
-
Digest::SHA1.hexdigest(File.read(file))
|
585
|
+
OpenSSL::Digest::SHA1.hexdigest(File.read(file))
|
586
|
+
end
|
587
|
+
|
588
|
+
def structure_dump_flags_for(adapter)
|
589
|
+
if structure_dump_flags.is_a?(Hash)
|
590
|
+
structure_dump_flags[adapter.to_sym]
|
591
|
+
else
|
592
|
+
structure_dump_flags
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
596
|
+
def structure_load_flags_for(adapter)
|
597
|
+
if structure_load_flags.is_a?(Hash)
|
598
|
+
structure_load_flags[adapter.to_sym]
|
599
|
+
else
|
600
|
+
structure_load_flags
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
604
|
+
def check_current_protected_environment!(db_config)
|
605
|
+
with_temporary_pool(db_config) do |pool|
|
606
|
+
connection = pool.connection
|
607
|
+
current = connection.migration_context.current_environment
|
608
|
+
stored = connection.migration_context.last_stored_environment
|
609
|
+
|
610
|
+
if connection.migration_context.protected_environment?
|
611
|
+
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
612
|
+
end
|
613
|
+
|
614
|
+
if stored && stored != current
|
615
|
+
raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
|
616
|
+
end
|
617
|
+
rescue ActiveRecord::NoDatabaseError
|
618
|
+
end
|
530
619
|
end
|
531
620
|
end
|
532
621
|
end
|
@@ -5,8 +5,6 @@ module ActiveRecord
|
|
5
5
|
class MySQLDatabaseTasks # :nodoc:
|
6
6
|
ER_DB_CREATE_EXISTS = 1007
|
7
7
|
|
8
|
-
delegate :connection, :establish_connection, to: ActiveRecord::Base
|
9
|
-
|
10
8
|
def self.using_database_configurations?
|
11
9
|
true
|
12
10
|
end
|
@@ -19,17 +17,18 @@ module ActiveRecord
|
|
19
17
|
def create
|
20
18
|
establish_connection(configuration_hash_without_database)
|
21
19
|
connection.create_database(db_config.database, creation_options)
|
22
|
-
establish_connection
|
20
|
+
establish_connection
|
23
21
|
end
|
24
22
|
|
25
23
|
def drop
|
26
|
-
establish_connection
|
24
|
+
establish_connection
|
27
25
|
connection.drop_database(db_config.database)
|
28
26
|
end
|
29
27
|
|
30
28
|
def purge
|
31
|
-
establish_connection(
|
29
|
+
establish_connection(configuration_hash_without_database)
|
32
30
|
connection.recreate_database(db_config.database, creation_options)
|
31
|
+
establish_connection
|
33
32
|
end
|
34
33
|
|
35
34
|
def charset
|
@@ -49,6 +48,7 @@ module ActiveRecord
|
|
49
48
|
|
50
49
|
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
51
50
|
if ignore_tables.any?
|
51
|
+
ignore_tables = connection.data_sources.select { |table| ignore_tables.any? { |pattern| pattern === table } }
|
52
52
|
args += ignore_tables.map { |table| "--ignore-table=#{db_config.database}.#{table}" }
|
53
53
|
end
|
54
54
|
|
@@ -70,6 +70,14 @@ module ActiveRecord
|
|
70
70
|
private
|
71
71
|
attr_reader :db_config, :configuration_hash
|
72
72
|
|
73
|
+
def connection
|
74
|
+
ActiveRecord::Base.connection
|
75
|
+
end
|
76
|
+
|
77
|
+
def establish_connection(config = db_config)
|
78
|
+
ActiveRecord::Base.establish_connection(config)
|
79
|
+
end
|
80
|
+
|
73
81
|
def configuration_hash_without_database
|
74
82
|
configuration_hash.merge(database: nil)
|
75
83
|
end
|
@@ -93,8 +101,9 @@ module ActiveRecord
|
|
93
101
|
sslcert: "--ssl-cert",
|
94
102
|
sslcapath: "--ssl-capath",
|
95
103
|
sslcipher: "--ssl-cipher",
|
96
|
-
sslkey: "--ssl-key"
|
97
|
-
|
104
|
+
sslkey: "--ssl-key",
|
105
|
+
ssl_mode: "--ssl-mode"
|
106
|
+
}.filter_map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }
|
98
107
|
|
99
108
|
args
|
100
109
|
end
|