activerecord 6.1.7 → 7.1.5
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 +2030 -1020
- data/MIT-LICENSE +1 -1
- data/README.rdoc +18 -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 +51 -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 +39 -35
- 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/join_association.rb +3 -2
- data/lib/active_record/associations/join_dependency.rb +28 -20
- data/lib/active_record/associations/preloader/association.rb +210 -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 +446 -306
- 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 +73 -22
- 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 +27 -12
- data/lib/active_record/attribute_methods/serialization.rb +194 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +8 -3
- data/lib/active_record/attribute_methods/write.rb +12 -15
- data/lib/active_record/attribute_methods.rb +161 -40
- data/lib/active_record/attributes.rb +27 -38
- data/lib/active_record/autosave_association.rb +65 -31
- 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 +113 -597
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +172 -50
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -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 +367 -141
- data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
- data/lib/active_record/connection_adapters/abstract_adapter.rb +631 -150
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +317 -164
- 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 +39 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +151 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +112 -55
- 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 +30 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +89 -52
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
- 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/money.rb +3 -2
- 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 +397 -75
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +508 -246
- 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 +72 -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 +296 -104
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +258 -0
- data/lib/active_record/connection_adapters.rb +9 -6
- data/lib/active_record/connection_handling.rb +108 -137
- data/lib/active_record/core.rb +242 -233
- data/lib/active_record/counter_cache.rb +52 -27
- data/lib/active_record/database_configurations/connection_url_resolver.rb +3 -2
- data/lib/active_record/database_configurations/database_config.rb +21 -12
- data/lib/active_record/database_configurations/hash_config.rb +88 -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 +66 -20
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +4 -2
- 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 +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +155 -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 +157 -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 +100 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +154 -63
- data/lib/active_record/errors.rb +172 -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 +147 -86
- data/lib/active_record/future_result.rb +174 -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 +135 -22
- data/lib/active_record/integration.rb +11 -10
- data/lib/active_record/internal_metadata.rb +119 -33
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +37 -22
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +52 -19
- data/lib/active_record/marshalling.rb +59 -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 +112 -14
- data/lib/active_record/migration/compatibility.rb +233 -46
- 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/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +361 -173
- data/lib/active_record/model_schema.rb +125 -101
- data/lib/active_record/nested_attributes.rb +50 -20
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +167 -0
- data/lib/active_record/persistence.rb +409 -88
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +4 -22
- 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 +220 -44
- data/lib/active_record/railties/controller_runtime.rb +15 -10
- data/lib/active_record/railties/databases.rake +188 -252
- 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 +248 -81
- 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 +246 -90
- data/lib/active_record/relation/delegation.rb +28 -14
- 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 +10 -7
- 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 +670 -129
- 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 +287 -120
- data/lib/active_record/result.rb +37 -11
- data/lib/active_record/runtime_registry.rb +32 -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 +251 -140
- 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 +117 -96
- data/lib/active_record/timestamp.rb +32 -19
- 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 +1 -9
- 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 +5 -13
- 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 +141 -20
- 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 +96 -16
- 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
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
128
|
+
each_local_configuration do |db_config|
|
129
|
+
with_temporary_connection(db_config) do
|
130
|
+
create(db_config)
|
131
|
+
end
|
148
132
|
end
|
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,55 @@ 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
|
+
dump_db_configs = []
|
179
|
+
|
180
|
+
each_current_configuration(env) do |db_config|
|
181
|
+
with_temporary_pool(db_config) do
|
182
|
+
begin
|
183
|
+
database_initialized = migration_connection.schema_migration.table_exists?
|
184
|
+
rescue ActiveRecord::NoDatabaseError
|
185
|
+
create(db_config)
|
186
|
+
retry
|
187
|
+
end
|
188
|
+
|
189
|
+
unless database_initialized
|
190
|
+
if File.exist?(schema_dump_path(db_config))
|
191
|
+
load_schema(db_config, ActiveRecord.schema_format, nil)
|
192
|
+
end
|
193
|
+
|
194
|
+
seed = true
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
each_current_environment(env) do |environment|
|
200
|
+
db_configs_with_versions(environment).sort.each do |version, db_configs|
|
201
|
+
dump_db_configs |= db_configs
|
202
|
+
|
203
|
+
db_configs.each do |db_config|
|
204
|
+
with_temporary_pool(db_config) do
|
205
|
+
migrate(version)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Dump schema for databases that were migrated.
|
212
|
+
if ActiveRecord.dump_schema_after_migration
|
213
|
+
dump_db_configs.each do |db_config|
|
214
|
+
with_temporary_pool(db_config) do
|
215
|
+
dump_schema(db_config)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
load_seed if seed
|
195
221
|
end
|
196
222
|
|
197
223
|
def drop(configuration, *arguments)
|
@@ -215,51 +241,73 @@ module ActiveRecord
|
|
215
241
|
end
|
216
242
|
|
217
243
|
def truncate_tables(db_config)
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
connection.truncate_tables(*connection.tables)
|
244
|
+
with_temporary_connection(db_config) do |conn|
|
245
|
+
conn.truncate_tables(*conn.tables)
|
246
|
+
end
|
222
247
|
end
|
223
248
|
private :truncate_tables
|
224
249
|
|
225
250
|
def truncate_all(environment = env)
|
226
|
-
|
251
|
+
configs_for(env_name: environment).each do |db_config|
|
227
252
|
truncate_tables(db_config)
|
228
253
|
end
|
229
254
|
end
|
230
255
|
|
231
|
-
def migrate
|
232
|
-
check_target_version
|
233
|
-
|
256
|
+
def migrate(version = nil)
|
234
257
|
scope = ENV["SCOPE"]
|
235
258
|
verbose_was, Migration.verbose = Migration.verbose, verbose?
|
236
259
|
|
237
|
-
|
238
|
-
|
260
|
+
check_target_version
|
261
|
+
|
262
|
+
migration_connection.migration_context.migrate(target_version) do |migration|
|
263
|
+
if version.blank?
|
264
|
+
scope.blank? || scope == migration.scope
|
265
|
+
else
|
266
|
+
migration.version == version
|
267
|
+
end
|
268
|
+
end.tap do |migrations_ran|
|
269
|
+
Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
|
239
270
|
end
|
240
271
|
|
241
|
-
|
272
|
+
migration_connection.schema_cache.clear!
|
242
273
|
ensure
|
243
274
|
Migration.verbose = verbose_was
|
244
275
|
end
|
245
276
|
|
277
|
+
def db_configs_with_versions(environment = env) # :nodoc:
|
278
|
+
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
279
|
+
|
280
|
+
with_temporary_connection_for_each(env: environment) do |conn|
|
281
|
+
db_config = conn.pool.db_config
|
282
|
+
versions_to_run = conn.migration_context.pending_migration_versions
|
283
|
+
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
284
|
+
|
285
|
+
versions_to_run.each do |version|
|
286
|
+
next if target_version && target_version != version
|
287
|
+
db_configs_with_versions[version] << db_config
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
db_configs_with_versions
|
292
|
+
end
|
293
|
+
|
246
294
|
def migrate_status
|
247
|
-
unless
|
295
|
+
unless migration_connection.schema_migration.table_exists?
|
248
296
|
Kernel.abort "Schema migrations table does not exist yet."
|
249
297
|
end
|
250
298
|
|
251
299
|
# output
|
252
|
-
puts "\ndatabase: #{
|
300
|
+
puts "\ndatabase: #{migration_connection.pool.db_config.database}\n\n"
|
253
301
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
254
302
|
puts "-" * 50
|
255
|
-
|
303
|
+
migration_connection.migration_context.migrations_status.each do |status, version, name|
|
256
304
|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
257
305
|
end
|
258
306
|
puts
|
259
307
|
end
|
260
308
|
|
261
309
|
def check_target_version
|
262
|
-
if target_version && !
|
310
|
+
if target_version && !Migration.valid_version_format?(ENV["VERSION"])
|
263
311
|
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
264
312
|
end
|
265
313
|
end
|
@@ -269,7 +317,7 @@ module ActiveRecord
|
|
269
317
|
end
|
270
318
|
|
271
319
|
def charset_current(env_name = env, db_name = name)
|
272
|
-
db_config =
|
320
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
273
321
|
charset(db_config)
|
274
322
|
end
|
275
323
|
|
@@ -279,7 +327,7 @@ module ActiveRecord
|
|
279
327
|
end
|
280
328
|
|
281
329
|
def collation_current(env_name = env, db_name = name)
|
282
|
-
db_config =
|
330
|
+
db_config = configs_for(env_name: env_name, name: db_name)
|
283
331
|
collation(db_config)
|
284
332
|
end
|
285
333
|
|
@@ -299,27 +347,30 @@ module ActiveRecord
|
|
299
347
|
|
300
348
|
def purge_current(environment = env)
|
301
349
|
each_current_configuration(environment) { |db_config| purge(db_config) }
|
302
|
-
|
350
|
+
|
351
|
+
migration_class.establish_connection(environment.to_sym)
|
303
352
|
end
|
304
353
|
|
305
354
|
def structure_dump(configuration, *arguments)
|
306
355
|
db_config = resolve_configuration(configuration)
|
307
356
|
filename = arguments.delete_at(0)
|
308
|
-
|
357
|
+
flags = structure_dump_flags_for(db_config.adapter)
|
358
|
+
database_adapter_for(db_config, *arguments).structure_dump(filename, flags)
|
309
359
|
end
|
310
360
|
|
311
361
|
def structure_load(configuration, *arguments)
|
312
362
|
db_config = resolve_configuration(configuration)
|
313
363
|
filename = arguments.delete_at(0)
|
314
|
-
|
364
|
+
flags = structure_load_flags_for(db_config.adapter)
|
365
|
+
database_adapter_for(db_config, *arguments).structure_load(filename, flags)
|
315
366
|
end
|
316
367
|
|
317
|
-
def load_schema(db_config, format = ActiveRecord
|
318
|
-
file ||=
|
368
|
+
def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
369
|
+
file ||= schema_dump_path(db_config, format)
|
370
|
+
return unless file
|
319
371
|
|
320
372
|
verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
|
321
373
|
check_schema_file(file)
|
322
|
-
ActiveRecord::Base.establish_connection(db_config)
|
323
374
|
|
324
375
|
case format
|
325
376
|
when :ruby
|
@@ -329,95 +380,80 @@ module ActiveRecord
|
|
329
380
|
else
|
330
381
|
raise ArgumentError, "unknown format #{format.inspect}"
|
331
382
|
end
|
332
|
-
|
333
|
-
|
334
|
-
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
383
|
+
|
384
|
+
migration_connection.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
|
335
385
|
ensure
|
336
386
|
Migration.verbose = verbose_was
|
337
387
|
end
|
338
388
|
|
339
|
-
def schema_up_to_date?(configuration, format = ActiveRecord
|
389
|
+
def schema_up_to_date?(configuration, format = ActiveRecord.schema_format, file = nil)
|
340
390
|
db_config = resolve_configuration(configuration)
|
341
391
|
|
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)
|
392
|
+
file ||= schema_dump_path(db_config)
|
349
393
|
|
350
|
-
return true unless File.exist?(file)
|
394
|
+
return true unless file && File.exist?(file)
|
351
395
|
|
352
|
-
|
396
|
+
with_temporary_connection(db_config) do |connection|
|
397
|
+
return false unless connection.internal_metadata.enabled?
|
398
|
+
return false unless connection.internal_metadata.table_exists?
|
353
399
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
400
|
+
connection.internal_metadata[:schema_sha1] == schema_sha1(file)
|
401
|
+
end
|
358
402
|
end
|
359
403
|
|
360
|
-
def reconstruct_from_schema(db_config, format = ActiveRecord
|
361
|
-
file ||=
|
362
|
-
|
363
|
-
check_schema_file(file)
|
404
|
+
def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
405
|
+
file ||= schema_dump_path(db_config, format)
|
364
406
|
|
365
|
-
|
407
|
+
check_schema_file(file) if file
|
366
408
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
409
|
+
with_temporary_pool(db_config, clobber: true) do
|
410
|
+
if schema_up_to_date?(db_config, format, file)
|
411
|
+
truncate_tables(db_config)
|
412
|
+
else
|
413
|
+
purge(db_config)
|
414
|
+
load_schema(db_config, format, file)
|
415
|
+
end
|
416
|
+
rescue ActiveRecord::NoDatabaseError
|
417
|
+
create(db_config)
|
371
418
|
load_schema(db_config, format, file)
|
372
419
|
end
|
373
|
-
rescue ActiveRecord::NoDatabaseError
|
374
|
-
create(db_config)
|
375
|
-
load_schema(db_config, format, file)
|
376
420
|
end
|
377
421
|
|
378
|
-
def dump_schema(db_config, format = ActiveRecord
|
422
|
+
def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
|
423
|
+
return unless db_config.schema_dump
|
424
|
+
|
379
425
|
require "active_record/schema_dumper"
|
380
|
-
filename =
|
381
|
-
|
426
|
+
filename = schema_dump_path(db_config, format)
|
427
|
+
return unless filename
|
382
428
|
|
383
429
|
FileUtils.mkdir_p(db_dir)
|
384
430
|
case format
|
385
431
|
when :ruby
|
386
432
|
File.open(filename, "w:utf-8") do |file|
|
387
|
-
ActiveRecord::SchemaDumper.dump(
|
433
|
+
ActiveRecord::SchemaDumper.dump(migration_connection, file)
|
388
434
|
end
|
389
435
|
when :sql
|
390
436
|
structure_dump(db_config, filename)
|
391
|
-
if
|
437
|
+
if migration_connection.schema_migration.table_exists?
|
392
438
|
File.open(filename, "a") do |f|
|
393
|
-
f.puts
|
439
|
+
f.puts migration_connection.dump_schema_information
|
394
440
|
f.print "\n"
|
395
441
|
end
|
396
442
|
end
|
397
443
|
end
|
398
444
|
end
|
399
445
|
|
400
|
-
def
|
401
|
-
|
402
|
-
end
|
446
|
+
def schema_dump_path(db_config, format = ActiveRecord.schema_format)
|
447
|
+
return ENV["SCHEMA"] if ENV["SCHEMA"]
|
403
448
|
|
404
|
-
|
405
|
-
|
406
|
-
when :ruby
|
407
|
-
"schema.rb"
|
408
|
-
when :sql
|
409
|
-
"structure.sql"
|
410
|
-
end
|
411
|
-
end
|
449
|
+
filename = db_config.schema_dump(format)
|
450
|
+
return unless filename
|
412
451
|
|
413
|
-
|
414
|
-
|
415
|
-
schema_file_type(format)
|
452
|
+
if File.dirname(filename) == ActiveRecord::Tasks::DatabaseTasks.db_dir
|
453
|
+
filename
|
416
454
|
else
|
417
|
-
|
455
|
+
File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
418
456
|
end
|
419
|
-
|
420
|
-
ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
421
457
|
end
|
422
458
|
|
423
459
|
def cache_dump_filename(db_config_name, schema_cache_path: nil)
|
@@ -430,11 +466,12 @@ module ActiveRecord
|
|
430
466
|
schema_cache_path || ENV["SCHEMA_CACHE"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
431
467
|
end
|
432
468
|
|
433
|
-
def load_schema_current(format = ActiveRecord
|
469
|
+
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
434
470
|
each_current_configuration(environment) do |db_config|
|
435
|
-
|
471
|
+
with_temporary_connection(db_config) do
|
472
|
+
load_schema(db_config, format, file)
|
473
|
+
end
|
436
474
|
end
|
437
|
-
ActiveRecord::Base.establish_connection(environment.to_sym)
|
438
475
|
end
|
439
476
|
|
440
477
|
def check_schema_file(filename)
|
@@ -457,7 +494,7 @@ module ActiveRecord
|
|
457
494
|
|
458
495
|
# Dumps the schema cache in YAML format for the connection into the file
|
459
496
|
#
|
460
|
-
# ==== Examples
|
497
|
+
# ==== Examples
|
461
498
|
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.connection, "tmp/schema_dump.yaml")
|
462
499
|
def dump_schema_cache(conn, filename)
|
463
500
|
conn.schema_cache.dump_to(filename)
|
@@ -467,7 +504,45 @@ module ActiveRecord
|
|
467
504
|
FileUtils.rm_f filename, verbose: false
|
468
505
|
end
|
469
506
|
|
507
|
+
def with_temporary_connection_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
|
508
|
+
if name
|
509
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
|
510
|
+
with_temporary_connection(db_config, clobber: clobber, &block)
|
511
|
+
else
|
512
|
+
ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
|
513
|
+
with_temporary_connection(db_config, clobber: clobber, &block)
|
514
|
+
end
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
518
|
+
def with_temporary_connection(db_config, clobber: false) # :nodoc:
|
519
|
+
with_temporary_pool(db_config, clobber: clobber) do |pool|
|
520
|
+
yield pool.connection
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
def migration_class # :nodoc:
|
525
|
+
ActiveRecord::Base
|
526
|
+
end
|
527
|
+
|
528
|
+
def migration_connection # :nodoc:
|
529
|
+
migration_class.connection
|
530
|
+
end
|
531
|
+
|
470
532
|
private
|
533
|
+
def with_temporary_pool(db_config, clobber: false)
|
534
|
+
original_db_config = migration_class.connection_db_config
|
535
|
+
pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
|
536
|
+
|
537
|
+
yield pool
|
538
|
+
ensure
|
539
|
+
migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
|
540
|
+
end
|
541
|
+
|
542
|
+
def configs_for(**options)
|
543
|
+
Base.configurations.configs_for(**options)
|
544
|
+
end
|
545
|
+
|
471
546
|
def resolve_configuration(configuration)
|
472
547
|
Base.configurations.resolve(configuration)
|
473
548
|
end
|
@@ -488,7 +563,7 @@ module ActiveRecord
|
|
488
563
|
end
|
489
564
|
|
490
565
|
def class_for_adapter(adapter)
|
491
|
-
_key, task = @tasks.
|
566
|
+
_key, task = @tasks.reverse_each.detect { |pattern, _task| adapter[pattern] }
|
492
567
|
unless task
|
493
568
|
raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
|
494
569
|
end
|
@@ -496,11 +571,8 @@ module ActiveRecord
|
|
496
571
|
end
|
497
572
|
|
498
573
|
def each_current_configuration(environment, name = nil)
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
environments.each do |env|
|
503
|
-
ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
|
574
|
+
each_current_environment(environment) do |env|
|
575
|
+
configs_for(env_name: env).each do |db_config|
|
504
576
|
next if name && name != db_config.name
|
505
577
|
|
506
578
|
yield db_config
|
@@ -508,8 +580,14 @@ module ActiveRecord
|
|
508
580
|
end
|
509
581
|
end
|
510
582
|
|
583
|
+
def each_current_environment(environment, &block)
|
584
|
+
environments = [environment]
|
585
|
+
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
586
|
+
environments.each(&block)
|
587
|
+
end
|
588
|
+
|
511
589
|
def each_local_configuration
|
512
|
-
|
590
|
+
configs_for.each do |db_config|
|
513
591
|
next unless db_config.database
|
514
592
|
|
515
593
|
if local_database?(db_config)
|
@@ -526,7 +604,40 @@ module ActiveRecord
|
|
526
604
|
end
|
527
605
|
|
528
606
|
def schema_sha1(file)
|
529
|
-
Digest::SHA1.hexdigest(File.read(file))
|
607
|
+
OpenSSL::Digest::SHA1.hexdigest(File.read(file))
|
608
|
+
end
|
609
|
+
|
610
|
+
def structure_dump_flags_for(adapter)
|
611
|
+
if structure_dump_flags.is_a?(Hash)
|
612
|
+
structure_dump_flags[adapter.to_sym]
|
613
|
+
else
|
614
|
+
structure_dump_flags
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
618
|
+
def structure_load_flags_for(adapter)
|
619
|
+
if structure_load_flags.is_a?(Hash)
|
620
|
+
structure_load_flags[adapter.to_sym]
|
621
|
+
else
|
622
|
+
structure_load_flags
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
626
|
+
def check_current_protected_environment!(db_config)
|
627
|
+
with_temporary_pool(db_config) do |pool|
|
628
|
+
connection = pool.connection
|
629
|
+
current = connection.migration_context.current_environment
|
630
|
+
stored = connection.migration_context.last_stored_environment
|
631
|
+
|
632
|
+
if connection.migration_context.protected_environment?
|
633
|
+
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
634
|
+
end
|
635
|
+
|
636
|
+
if stored && stored != current
|
637
|
+
raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
|
638
|
+
end
|
639
|
+
rescue ActiveRecord::NoDatabaseError
|
640
|
+
end
|
530
641
|
end
|
531
642
|
end
|
532
643
|
end
|