activerecord 7.0.0 → 7.2.1
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 +515 -1268
- data/MIT-LICENSE +1 -1
- data/README.rdoc +31 -31
- data/examples/performance.rb +2 -2
- data/lib/active_record/aggregations.rb +16 -13
- data/lib/active_record/association_relation.rb +2 -2
- data/lib/active_record/associations/alias_tracker.rb +25 -19
- data/lib/active_record/associations/association.rb +35 -12
- data/lib/active_record/associations/association_scope.rb +16 -9
- data/lib/active_record/associations/belongs_to_association.rb +23 -8
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -2
- data/lib/active_record/associations/builder/association.rb +3 -3
- data/lib/active_record/associations/builder/belongs_to.rb +22 -8
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
- data/lib/active_record/associations/builder/has_many.rb +3 -4
- data/lib/active_record/associations/builder/has_one.rb +3 -4
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +28 -17
- data/lib/active_record/associations/collection_proxy.rb +36 -13
- data/lib/active_record/associations/errors.rb +265 -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 +10 -6
- data/lib/active_record/associations/has_one_association.rb +10 -3
- data/lib/active_record/associations/join_dependency/join_association.rb +27 -25
- data/lib/active_record/associations/join_dependency.rb +18 -14
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +33 -8
- data/lib/active_record/associations/preloader/branch.rb +7 -1
- data/lib/active_record/associations/preloader/through_association.rb +2 -4
- data/lib/active_record/associations/preloader.rb +13 -10
- data/lib/active_record/associations/singular_association.rb +7 -1
- data/lib/active_record/associations/through_association.rb +22 -11
- data/lib/active_record/associations.rb +378 -491
- data/lib/active_record/attribute_assignment.rb +1 -13
- data/lib/active_record/attribute_methods/before_type_cast.rb +17 -0
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +53 -35
- data/lib/active_record/attribute_methods/primary_key.rb +45 -25
- data/lib/active_record/attribute_methods/query.rb +28 -16
- data/lib/active_record/attribute_methods/read.rb +8 -7
- data/lib/active_record/attribute_methods/serialization.rb +153 -70
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +7 -6
- data/lib/active_record/attribute_methods/write.rb +6 -6
- data/lib/active_record/attribute_methods.rb +153 -40
- data/lib/active_record/attributes.rb +63 -48
- data/lib/active_record/autosave_association.rb +70 -38
- data/lib/active_record/base.rb +12 -8
- data/lib/active_record/callbacks.rb +16 -32
- 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 -34
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +124 -132
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +4 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +297 -88
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +160 -45
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +215 -63
- data/lib/active_record/connection_adapters/abstract/quoting.rb +83 -65
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +18 -4
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +163 -29
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +319 -135
- data/lib/active_record/connection_adapters/abstract/transaction.rb +367 -75
- data/lib/active_record/connection_adapters/abstract_adapter.rb +512 -126
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +282 -119
- data/lib/active_record/connection_adapters/column.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +27 -140
- data/lib/active_record/connection_adapters/mysql/quoting.rb +64 -52
- 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 +45 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +101 -68
- data/lib/active_record/connection_adapters/pool_config.rb +20 -10
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +16 -3
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +101 -48
- 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/hstore.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +11 -2
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +94 -61
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +6 -10
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -6
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +151 -2
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +53 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +379 -66
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +370 -203
- data/lib/active_record/connection_adapters/schema_cache.rb +302 -79
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +60 -43
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +61 -46
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +64 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +321 -110
- 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 +229 -0
- data/lib/active_record/connection_adapters.rb +124 -1
- data/lib/active_record/connection_handling.rb +98 -106
- data/lib/active_record/core.rb +220 -177
- data/lib/active_record/counter_cache.rb +68 -34
- data/lib/active_record/database_configurations/connection_url_resolver.rb +8 -2
- data/lib/active_record/database_configurations/database_config.rb +26 -5
- data/lib/active_record/database_configurations/hash_config.rb +52 -34
- data/lib/active_record/database_configurations/url_config.rb +37 -12
- data/lib/active_record/database_configurations.rb +88 -35
- data/lib/active_record/delegated_type.rb +40 -11
- 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 +1 -1
- data/lib/active_record/dynamic_matchers.rb +2 -2
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +4 -1
- data/lib/active_record/encryption/config.rb +25 -1
- data/lib/active_record/encryption/configurable.rb +13 -14
- data/lib/active_record/encryption/context.rb +10 -3
- data/lib/active_record/encryption/contexts.rb +8 -4
- data/lib/active_record/encryption/derived_secret_key_provider.rb +9 -3
- data/lib/active_record/encryption/deterministic_key_provider.rb +1 -1
- data/lib/active_record/encryption/encryptable_record.rb +47 -25
- data/lib/active_record/encryption/encrypted_attribute_type.rb +49 -14
- data/lib/active_record/encryption/encryptor.rb +25 -10
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +3 -3
- data/lib/active_record/encryption/extended_deterministic_queries.rb +83 -86
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +3 -3
- data/lib/active_record/encryption/key_generator.rb +12 -1
- data/lib/active_record/encryption/message.rb +1 -1
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +6 -0
- data/lib/active_record/encryption/null_encryptor.rb +4 -0
- data/lib/active_record/encryption/properties.rb +4 -4
- data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
- data/lib/active_record/encryption/scheme.rb +23 -22
- data/lib/active_record/encryption.rb +1 -0
- data/lib/active_record/enum.rb +131 -27
- data/lib/active_record/errors.rb +151 -31
- data/lib/active_record/explain.rb +21 -12
- data/lib/active_record/explain_subscriber.rb +1 -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 +29 -8
- data/lib/active_record/fixtures.rb +169 -99
- data/lib/active_record/future_result.rb +47 -8
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +34 -18
- data/lib/active_record/insert_all.rb +72 -22
- data/lib/active_record/integration.rb +13 -10
- data/lib/active_record/internal_metadata.rb +124 -20
- data/lib/active_record/locking/optimistic.rb +39 -24
- data/lib/active_record/locking/pessimistic.rb +8 -5
- data/lib/active_record/log_subscriber.rb +28 -27
- 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 +4 -0
- data/lib/active_record/middleware/database_selector.rb +18 -13
- data/lib/active_record/middleware/shard_selector.rb +7 -5
- data/lib/active_record/migration/command_recorder.rb +110 -13
- data/lib/active_record/migration/compatibility.rb +174 -64
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +292 -125
- data/lib/active_record/model_schema.rb +113 -112
- data/lib/active_record/nested_attributes.rb +35 -9
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +177 -345
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +19 -25
- data/lib/active_record/query_logs.rb +102 -51
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +34 -9
- data/lib/active_record/railtie.rb +153 -100
- data/lib/active_record/railties/controller_runtime.rb +24 -10
- data/lib/active_record/railties/databases.rake +148 -152
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +32 -5
- data/lib/active_record/reflection.rb +278 -69
- data/lib/active_record/relation/batches/batch_enumerator.rb +20 -5
- data/lib/active_record/relation/batches.rb +198 -63
- data/lib/active_record/relation/calculations.rb +293 -108
- data/lib/active_record/relation/delegation.rb +31 -20
- data/lib/active_record/relation/finder_methods.rb +93 -18
- data/lib/active_record/relation/merger.rb +6 -6
- data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
- 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 +28 -16
- data/lib/active_record/relation/query_attribute.rb +25 -1
- data/lib/active_record/relation/query_methods.rb +625 -107
- data/lib/active_record/relation/record_fetch_warning.rb +3 -0
- data/lib/active_record/relation/spawn_methods.rb +5 -4
- data/lib/active_record/relation/where_clause.rb +7 -19
- data/lib/active_record/relation.rb +602 -96
- data/lib/active_record/result.rb +55 -52
- data/lib/active_record/runtime_registry.rb +63 -1
- data/lib/active_record/sanitization.rb +76 -30
- data/lib/active_record/schema.rb +39 -23
- data/lib/active_record/schema_dumper.rb +82 -30
- data/lib/active_record/schema_migration.rb +75 -24
- data/lib/active_record/scoping/default.rb +20 -12
- data/lib/active_record/scoping/named.rb +3 -2
- data/lib/active_record/scoping.rb +2 -1
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/serialization.rb +5 -0
- data/lib/active_record/signed_id.rb +29 -8
- data/lib/active_record/statement_cache.rb +7 -7
- data/lib/active_record/store.rb +16 -11
- data/lib/active_record/suppressor.rb +3 -1
- data/lib/active_record/table_metadata.rb +7 -3
- data/lib/active_record/tasks/database_tasks.rb +191 -121
- data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
- data/lib/active_record/tasks/postgresql_database_tasks.rb +17 -15
- data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
- data/lib/active_record/test_fixtures.rb +174 -152
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +31 -17
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +12 -7
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +109 -27
- data/lib/active_record/translation.rb +1 -3
- data/lib/active_record/type/adapter_specific_registry.rb +1 -8
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +9 -7
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/type_caster/connection.rb +4 -4
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +12 -6
- 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 +63 -14
- data/lib/active_record/validations.rb +12 -5
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +266 -30
- data/lib/arel/alias_predication.rb +1 -1
- data/lib/arel/collectors/bind.rb +2 -0
- data/lib/arel/collectors/composite.rb +7 -0
- data/lib/arel/collectors/sql_string.rb +1 -1
- data/lib/arel/collectors/substitute_binds.rb +1 -1
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/filter_predications.rb +1 -1
- data/lib/arel/nodes/binary.rb +6 -7
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/filter.rb +1 -1
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/homogeneous_in.rb +1 -9
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
- data/lib/arel/nodes/node.rb +115 -5
- data/lib/arel/nodes/sql_literal.rb +13 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes.rb +6 -2
- data/lib/arel/predications.rb +3 -1
- data/lib/arel/select_manager.rb +1 -1
- data/lib/arel/table.rb +9 -5
- data/lib/arel/tree_manager.rb +8 -3
- data/lib/arel/update_manager.rb +2 -1
- data/lib/arel/visitors/dot.rb +1 -0
- data/lib/arel/visitors/mysql.rb +17 -5
- data/lib/arel/visitors/postgresql.rb +1 -12
- data/lib/arel/visitors/to_sql.rb +112 -34
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +21 -3
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -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
- metadata +59 -17
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -63
|
@@ -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')
|
|
@@ -60,20 +62,12 @@ module ActiveRecord
|
|
|
60
62
|
|
|
61
63
|
LOCAL_HOSTS = ["127.0.0.1", "localhost"]
|
|
62
64
|
|
|
63
|
-
def check_protected_environments!
|
|
64
|
-
|
|
65
|
-
current = ActiveRecord::Base.connection.migration_context.current_environment
|
|
66
|
-
stored = ActiveRecord::Base.connection.migration_context.last_stored_environment
|
|
67
|
-
|
|
68
|
-
if ActiveRecord::Base.connection.migration_context.protected_environment?
|
|
69
|
-
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
|
70
|
-
end
|
|
65
|
+
def check_protected_environments!(environment = env)
|
|
66
|
+
return if ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"]
|
|
71
67
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
end
|
|
68
|
+
configs_for(env_name: environment).each do |db_config|
|
|
69
|
+
check_current_protected_environment!(db_config)
|
|
75
70
|
end
|
|
76
|
-
rescue ActiveRecord::NoDatabaseError
|
|
77
71
|
end
|
|
78
72
|
|
|
79
73
|
def register_task(pattern, task)
|
|
@@ -82,6 +76,7 @@ module ActiveRecord
|
|
|
82
76
|
end
|
|
83
77
|
|
|
84
78
|
register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
|
79
|
+
register_task(/trilogy/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
|
85
80
|
register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
|
|
86
81
|
register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
|
|
87
82
|
|
|
@@ -130,28 +125,20 @@ module ActiveRecord
|
|
|
130
125
|
end
|
|
131
126
|
|
|
132
127
|
def create_all
|
|
133
|
-
|
|
128
|
+
db_config = migration_connection.pool.db_config
|
|
129
|
+
|
|
134
130
|
each_local_configuration { |db_config| create(db_config) }
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
end
|
|
131
|
+
|
|
132
|
+
migration_class.establish_connection(db_config)
|
|
138
133
|
end
|
|
139
134
|
|
|
140
|
-
def setup_initial_database_yaml
|
|
135
|
+
def setup_initial_database_yaml # :nodoc:
|
|
141
136
|
return {} unless defined?(Rails)
|
|
142
137
|
|
|
143
|
-
|
|
144
|
-
Rails.application.config.load_database_yaml
|
|
145
|
-
rescue
|
|
146
|
-
unless ActiveRecord.suppress_multiple_database_warning
|
|
147
|
-
$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."
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
{}
|
|
151
|
-
end
|
|
138
|
+
Rails.application.config.load_database_yaml
|
|
152
139
|
end
|
|
153
140
|
|
|
154
|
-
def for_each(databases)
|
|
141
|
+
def for_each(databases) # :nodoc:
|
|
155
142
|
return {} unless defined?(Rails)
|
|
156
143
|
|
|
157
144
|
database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
|
|
@@ -166,7 +153,7 @@ module ActiveRecord
|
|
|
166
153
|
end
|
|
167
154
|
end
|
|
168
155
|
|
|
169
|
-
def raise_for_multi_db(environment = env, command:)
|
|
156
|
+
def raise_for_multi_db(environment = env, command:) # :nodoc:
|
|
170
157
|
db_configs = configs_for(env_name: environment)
|
|
171
158
|
|
|
172
159
|
if db_configs.count > 1
|
|
@@ -182,38 +169,43 @@ module ActiveRecord
|
|
|
182
169
|
|
|
183
170
|
def create_current(environment = env, name = nil)
|
|
184
171
|
each_current_configuration(environment, name) { |db_config| create(db_config) }
|
|
185
|
-
|
|
172
|
+
|
|
173
|
+
migration_class.establish_connection(environment.to_sym)
|
|
186
174
|
end
|
|
187
175
|
|
|
188
176
|
def prepare_all
|
|
189
177
|
seed = false
|
|
190
178
|
|
|
191
|
-
|
|
192
|
-
|
|
179
|
+
each_current_configuration(env) do |db_config|
|
|
180
|
+
with_temporary_pool(db_config) do
|
|
181
|
+
begin
|
|
182
|
+
database_initialized = migration_connection_pool.schema_migration.table_exists?
|
|
183
|
+
rescue ActiveRecord::NoDatabaseError
|
|
184
|
+
create(db_config)
|
|
185
|
+
retry
|
|
186
|
+
end
|
|
193
187
|
|
|
194
|
-
|
|
195
|
-
|
|
188
|
+
unless database_initialized
|
|
189
|
+
if File.exist?(schema_dump_path(db_config))
|
|
190
|
+
load_schema(db_config, ActiveRecord.schema_format, nil)
|
|
191
|
+
end
|
|
196
192
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
end
|
|
200
|
-
rescue ActiveRecord::NoDatabaseError
|
|
201
|
-
create_current(db_config.env_name, db_config.name)
|
|
202
|
-
|
|
203
|
-
if File.exist?(schema_dump_path(db_config))
|
|
204
|
-
load_schema(
|
|
205
|
-
db_config,
|
|
206
|
-
ActiveRecord.schema_format,
|
|
207
|
-
nil
|
|
208
|
-
)
|
|
209
|
-
else
|
|
210
|
-
migrate
|
|
193
|
+
seed = true
|
|
194
|
+
end
|
|
211
195
|
end
|
|
196
|
+
end
|
|
212
197
|
|
|
213
|
-
|
|
198
|
+
each_current_environment(env) do |environment|
|
|
199
|
+
db_configs_with_versions(environment).sort.each do |version, db_configs|
|
|
200
|
+
db_configs.each do |db_config|
|
|
201
|
+
with_temporary_pool(db_config) do
|
|
202
|
+
migrate(version)
|
|
203
|
+
dump_schema(db_config) if ActiveRecord.dump_schema_after_migration
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
214
207
|
end
|
|
215
208
|
|
|
216
|
-
ActiveRecord::Base.establish_connection
|
|
217
209
|
load_seed if seed
|
|
218
210
|
end
|
|
219
211
|
|
|
@@ -238,10 +230,9 @@ module ActiveRecord
|
|
|
238
230
|
end
|
|
239
231
|
|
|
240
232
|
def truncate_tables(db_config)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
connection.truncate_tables(*connection.tables)
|
|
233
|
+
with_temporary_connection(db_config) do |conn|
|
|
234
|
+
conn.truncate_tables(*conn.tables)
|
|
235
|
+
end
|
|
245
236
|
end
|
|
246
237
|
private :truncate_tables
|
|
247
238
|
|
|
@@ -252,28 +243,32 @@ module ActiveRecord
|
|
|
252
243
|
end
|
|
253
244
|
|
|
254
245
|
def migrate(version = nil)
|
|
255
|
-
check_target_version
|
|
256
|
-
|
|
257
246
|
scope = ENV["SCOPE"]
|
|
258
247
|
verbose_was, Migration.verbose = Migration.verbose, verbose?
|
|
259
248
|
|
|
260
|
-
|
|
261
|
-
|
|
249
|
+
check_target_version
|
|
250
|
+
|
|
251
|
+
migration_connection_pool.migration_context.migrate(target_version) do |migration|
|
|
252
|
+
if version.blank?
|
|
253
|
+
scope.blank? || scope == migration.scope
|
|
254
|
+
else
|
|
255
|
+
migration.version == version
|
|
256
|
+
end
|
|
262
257
|
end.tap do |migrations_ran|
|
|
263
258
|
Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
|
|
264
259
|
end
|
|
265
260
|
|
|
266
|
-
|
|
261
|
+
migration_connection_pool.schema_cache.clear!
|
|
267
262
|
ensure
|
|
268
263
|
Migration.verbose = verbose_was
|
|
269
264
|
end
|
|
270
265
|
|
|
271
|
-
def db_configs_with_versions(
|
|
266
|
+
def db_configs_with_versions(environment = env) # :nodoc:
|
|
272
267
|
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
|
273
268
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
versions_to_run =
|
|
269
|
+
with_temporary_pool_for_each(env: environment) do |pool|
|
|
270
|
+
db_config = pool.db_config
|
|
271
|
+
versions_to_run = pool.migration_context.pending_migration_versions
|
|
277
272
|
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
|
278
273
|
|
|
279
274
|
versions_to_run.each do |version|
|
|
@@ -286,22 +281,22 @@ module ActiveRecord
|
|
|
286
281
|
end
|
|
287
282
|
|
|
288
283
|
def migrate_status
|
|
289
|
-
unless
|
|
284
|
+
unless migration_connection_pool.schema_migration.table_exists?
|
|
290
285
|
Kernel.abort "Schema migrations table does not exist yet."
|
|
291
286
|
end
|
|
292
287
|
|
|
293
288
|
# output
|
|
294
|
-
puts "\ndatabase: #{
|
|
289
|
+
puts "\ndatabase: #{migration_connection_pool.db_config.database}\n\n"
|
|
295
290
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
|
296
291
|
puts "-" * 50
|
|
297
|
-
|
|
292
|
+
migration_connection_pool.migration_context.migrations_status.each do |status, version, name|
|
|
298
293
|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
|
299
294
|
end
|
|
300
295
|
puts
|
|
301
296
|
end
|
|
302
297
|
|
|
303
298
|
def check_target_version
|
|
304
|
-
if target_version && !
|
|
299
|
+
if target_version && !Migration.valid_version_format?(ENV["VERSION"])
|
|
305
300
|
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
|
306
301
|
end
|
|
307
302
|
end
|
|
@@ -341,7 +336,8 @@ module ActiveRecord
|
|
|
341
336
|
|
|
342
337
|
def purge_current(environment = env)
|
|
343
338
|
each_current_configuration(environment) { |db_config| purge(db_config) }
|
|
344
|
-
|
|
339
|
+
|
|
340
|
+
migration_class.establish_connection(environment.to_sym)
|
|
345
341
|
end
|
|
346
342
|
|
|
347
343
|
def structure_dump(configuration, *arguments)
|
|
@@ -360,10 +356,10 @@ module ActiveRecord
|
|
|
360
356
|
|
|
361
357
|
def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
|
362
358
|
file ||= schema_dump_path(db_config, format)
|
|
359
|
+
return unless file
|
|
363
360
|
|
|
364
361
|
verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
|
|
365
362
|
check_schema_file(file)
|
|
366
|
-
ActiveRecord::Base.establish_connection(db_config)
|
|
367
363
|
|
|
368
364
|
case format
|
|
369
365
|
when :ruby
|
|
@@ -373,9 +369,8 @@ module ActiveRecord
|
|
|
373
369
|
else
|
|
374
370
|
raise ArgumentError, "unknown format #{format.inspect}"
|
|
375
371
|
end
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
|
372
|
+
|
|
373
|
+
migration_connection_pool.internal_metadata.create_table_and_set_flags(db_config.env_name, schema_sha1(file))
|
|
379
374
|
ensure
|
|
380
375
|
Migration.verbose = verbose_was
|
|
381
376
|
end
|
|
@@ -385,66 +380,59 @@ module ActiveRecord
|
|
|
385
380
|
|
|
386
381
|
file ||= schema_dump_path(db_config)
|
|
387
382
|
|
|
388
|
-
return true unless File.exist?(file)
|
|
389
|
-
|
|
390
|
-
ActiveRecord::Base.establish_connection(db_config)
|
|
383
|
+
return true unless file && File.exist?(file)
|
|
391
384
|
|
|
392
|
-
|
|
393
|
-
|
|
385
|
+
with_temporary_pool(db_config) do |pool|
|
|
386
|
+
internal_metadata = pool.internal_metadata
|
|
387
|
+
return false unless internal_metadata.enabled?
|
|
388
|
+
return false unless internal_metadata.table_exists?
|
|
394
389
|
|
|
395
|
-
|
|
390
|
+
internal_metadata[:schema_sha1] == schema_sha1(file)
|
|
391
|
+
end
|
|
396
392
|
end
|
|
397
393
|
|
|
398
394
|
def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
|
399
395
|
file ||= schema_dump_path(db_config, format)
|
|
400
396
|
|
|
401
|
-
check_schema_file(file)
|
|
402
|
-
|
|
403
|
-
ActiveRecord::Base.establish_connection(db_config)
|
|
397
|
+
check_schema_file(file) if file
|
|
404
398
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
399
|
+
with_temporary_pool(db_config, clobber: true) do
|
|
400
|
+
if schema_up_to_date?(db_config, format, file)
|
|
401
|
+
truncate_tables(db_config) unless ENV["SKIP_TEST_DATABASE_TRUNCATE"]
|
|
402
|
+
else
|
|
403
|
+
purge(db_config)
|
|
404
|
+
load_schema(db_config, format, file)
|
|
405
|
+
end
|
|
406
|
+
rescue ActiveRecord::NoDatabaseError
|
|
407
|
+
create(db_config)
|
|
409
408
|
load_schema(db_config, format, file)
|
|
410
409
|
end
|
|
411
|
-
rescue ActiveRecord::NoDatabaseError
|
|
412
|
-
create(db_config)
|
|
413
|
-
load_schema(db_config, format, file)
|
|
414
410
|
end
|
|
415
411
|
|
|
416
412
|
def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
|
|
413
|
+
return unless db_config.schema_dump
|
|
414
|
+
|
|
417
415
|
require "active_record/schema_dumper"
|
|
418
416
|
filename = schema_dump_path(db_config, format)
|
|
419
|
-
|
|
417
|
+
return unless filename
|
|
420
418
|
|
|
421
419
|
FileUtils.mkdir_p(db_dir)
|
|
422
420
|
case format
|
|
423
421
|
when :ruby
|
|
424
422
|
File.open(filename, "w:utf-8") do |file|
|
|
425
|
-
ActiveRecord::SchemaDumper.dump(
|
|
423
|
+
ActiveRecord::SchemaDumper.dump(migration_connection_pool, file)
|
|
426
424
|
end
|
|
427
425
|
when :sql
|
|
428
426
|
structure_dump(db_config, filename)
|
|
429
|
-
if
|
|
427
|
+
if migration_connection_pool.schema_migration.table_exists?
|
|
430
428
|
File.open(filename, "a") do |f|
|
|
431
|
-
f.puts
|
|
429
|
+
f.puts migration_connection.dump_schema_information
|
|
432
430
|
f.print "\n"
|
|
433
431
|
end
|
|
434
432
|
end
|
|
435
433
|
end
|
|
436
434
|
end
|
|
437
435
|
|
|
438
|
-
def schema_file_type(format = ActiveRecord.schema_format)
|
|
439
|
-
case format
|
|
440
|
-
when :ruby
|
|
441
|
-
"schema.rb"
|
|
442
|
-
when :sql
|
|
443
|
-
"structure.sql"
|
|
444
|
-
end
|
|
445
|
-
end
|
|
446
|
-
deprecate :schema_file_type
|
|
447
|
-
|
|
448
436
|
def schema_dump_path(db_config, format = ActiveRecord.schema_format)
|
|
449
437
|
return ENV["SCHEMA"] if ENV["SCHEMA"]
|
|
450
438
|
|
|
@@ -458,21 +446,34 @@ module ActiveRecord
|
|
|
458
446
|
end
|
|
459
447
|
end
|
|
460
448
|
|
|
461
|
-
def cache_dump_filename(
|
|
462
|
-
|
|
463
|
-
|
|
449
|
+
def cache_dump_filename(db_config_or_name, schema_cache_path: nil)
|
|
450
|
+
if db_config_or_name.is_a?(DatabaseConfigurations::DatabaseConfig)
|
|
451
|
+
schema_cache_path ||
|
|
452
|
+
db_config_or_name.schema_cache_path ||
|
|
453
|
+
schema_cache_env ||
|
|
454
|
+
db_config_or_name.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
|
|
464
455
|
else
|
|
465
|
-
|
|
466
|
-
|
|
456
|
+
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
|
457
|
+
Passing a database name to `cache_dump_filename` is deprecated and will be removed in Rails 8.0. Pass a
|
|
458
|
+
`ActiveRecord::DatabaseConfigurations::DatabaseConfig` object instead.
|
|
459
|
+
MSG
|
|
460
|
+
|
|
461
|
+
filename = if ActiveRecord::Base.configurations.primary?(db_config_or_name)
|
|
462
|
+
"schema_cache.yml"
|
|
463
|
+
else
|
|
464
|
+
"#{db_config_or_name}_schema_cache.yml"
|
|
465
|
+
end
|
|
467
466
|
|
|
468
|
-
|
|
467
|
+
schema_cache_path || schema_cache_env || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
|
468
|
+
end
|
|
469
469
|
end
|
|
470
470
|
|
|
471
471
|
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
|
472
472
|
each_current_configuration(environment) do |db_config|
|
|
473
|
-
|
|
473
|
+
with_temporary_connection(db_config) do
|
|
474
|
+
load_schema(db_config, format, file)
|
|
475
|
+
end
|
|
474
476
|
end
|
|
475
|
-
ActiveRecord::Base.establish_connection(environment.to_sym)
|
|
476
477
|
end
|
|
477
478
|
|
|
478
479
|
def check_schema_file(filename)
|
|
@@ -495,17 +496,66 @@ module ActiveRecord
|
|
|
495
496
|
|
|
496
497
|
# Dumps the schema cache in YAML format for the connection into the file
|
|
497
498
|
#
|
|
498
|
-
# ==== Examples
|
|
499
|
-
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.
|
|
500
|
-
def dump_schema_cache(
|
|
501
|
-
|
|
499
|
+
# ==== Examples
|
|
500
|
+
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.lease_connection, "tmp/schema_dump.yaml")
|
|
501
|
+
def dump_schema_cache(conn_or_pool, filename)
|
|
502
|
+
conn_or_pool.schema_cache.dump_to(filename)
|
|
502
503
|
end
|
|
503
504
|
|
|
504
505
|
def clear_schema_cache(filename)
|
|
505
506
|
FileUtils.rm_f filename, verbose: false
|
|
506
507
|
end
|
|
507
508
|
|
|
509
|
+
def with_temporary_pool_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, clobber: false, &block) # :nodoc:
|
|
510
|
+
if name
|
|
511
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
|
|
512
|
+
with_temporary_pool(db_config, clobber: clobber, &block)
|
|
513
|
+
else
|
|
514
|
+
ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
|
|
515
|
+
with_temporary_pool(db_config, clobber: clobber, &block)
|
|
516
|
+
end
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
def with_temporary_connection(db_config, clobber: false, &block) # :nodoc:
|
|
521
|
+
with_temporary_pool(db_config, clobber: clobber) do |pool|
|
|
522
|
+
pool.with_connection(&block)
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def migration_class # :nodoc:
|
|
527
|
+
ActiveRecord::Base
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
def migration_connection # :nodoc:
|
|
531
|
+
migration_class.lease_connection
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
def migration_connection_pool # :nodoc:
|
|
535
|
+
migration_class.connection_pool
|
|
536
|
+
end
|
|
537
|
+
|
|
508
538
|
private
|
|
539
|
+
def schema_cache_env
|
|
540
|
+
if ENV["SCHEMA_CACHE"]
|
|
541
|
+
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
|
542
|
+
Setting `ENV["SCHEMA_CACHE"]` is deprecated and will be removed in Rails 8.0.
|
|
543
|
+
Configure the `:schema_cache_path` in the database configuration instead.
|
|
544
|
+
MSG
|
|
545
|
+
|
|
546
|
+
nil
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
def with_temporary_pool(db_config, clobber: false)
|
|
551
|
+
original_db_config = migration_class.connection_db_config
|
|
552
|
+
pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
|
|
553
|
+
|
|
554
|
+
yield pool
|
|
555
|
+
ensure
|
|
556
|
+
migration_class.connection_handler.establish_connection(original_db_config, clobber: clobber)
|
|
557
|
+
end
|
|
558
|
+
|
|
509
559
|
def configs_for(**options)
|
|
510
560
|
Base.configurations.configs_for(**options)
|
|
511
561
|
end
|
|
@@ -538,10 +588,7 @@ module ActiveRecord
|
|
|
538
588
|
end
|
|
539
589
|
|
|
540
590
|
def each_current_configuration(environment, name = nil)
|
|
541
|
-
|
|
542
|
-
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
|
543
|
-
|
|
544
|
-
environments.each do |env|
|
|
591
|
+
each_current_environment(environment) do |env|
|
|
545
592
|
configs_for(env_name: env).each do |db_config|
|
|
546
593
|
next if name && name != db_config.name
|
|
547
594
|
|
|
@@ -550,6 +597,12 @@ module ActiveRecord
|
|
|
550
597
|
end
|
|
551
598
|
end
|
|
552
599
|
|
|
600
|
+
def each_current_environment(environment, &block)
|
|
601
|
+
environments = [environment]
|
|
602
|
+
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
|
603
|
+
environments.each(&block)
|
|
604
|
+
end
|
|
605
|
+
|
|
553
606
|
def each_local_configuration
|
|
554
607
|
configs_for.each do |db_config|
|
|
555
608
|
next unless db_config.database
|
|
@@ -586,6 +639,23 @@ module ActiveRecord
|
|
|
586
639
|
structure_load_flags
|
|
587
640
|
end
|
|
588
641
|
end
|
|
642
|
+
|
|
643
|
+
def check_current_protected_environment!(db_config)
|
|
644
|
+
with_temporary_pool(db_config) do |pool|
|
|
645
|
+
migration_context = pool.migration_context
|
|
646
|
+
current = migration_context.current_environment
|
|
647
|
+
stored = migration_context.last_stored_environment
|
|
648
|
+
|
|
649
|
+
if migration_context.protected_environment?
|
|
650
|
+
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
if stored && stored != current
|
|
654
|
+
raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
|
|
655
|
+
end
|
|
656
|
+
rescue ActiveRecord::NoDatabaseError
|
|
657
|
+
end
|
|
658
|
+
end
|
|
589
659
|
end
|
|
590
660
|
end
|
|
591
661
|
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.lease_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,7 +101,8 @@ module ActiveRecord
|
|
|
93
101
|
sslcert: "--ssl-cert",
|
|
94
102
|
sslcapath: "--ssl-capath",
|
|
95
103
|
sslcipher: "--ssl-cipher",
|
|
96
|
-
sslkey: "--ssl-key"
|
|
104
|
+
sslkey: "--ssl-key",
|
|
105
|
+
ssl_mode: "--ssl-mode"
|
|
97
106
|
}.filter_map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }
|
|
98
107
|
|
|
99
108
|
args
|
|
@@ -9,9 +9,6 @@ module ActiveRecord
|
|
|
9
9
|
ON_ERROR_STOP_1 = "ON_ERROR_STOP=1"
|
|
10
10
|
SQL_COMMENT_BEGIN = "--"
|
|
11
11
|
|
|
12
|
-
delegate :connection, :establish_connection, :clear_active_connections!,
|
|
13
|
-
to: ActiveRecord::Base
|
|
14
|
-
|
|
15
12
|
def self.using_database_configurations?
|
|
16
13
|
true
|
|
17
14
|
end
|
|
@@ -21,14 +18,14 @@ module ActiveRecord
|
|
|
21
18
|
@configuration_hash = db_config.configuration_hash
|
|
22
19
|
end
|
|
23
20
|
|
|
24
|
-
def create(
|
|
25
|
-
|
|
21
|
+
def create(connection_already_established = false)
|
|
22
|
+
establish_connection(public_schema_config) unless connection_already_established
|
|
26
23
|
connection.create_database(db_config.database, configuration_hash.merge(encoding: encoding))
|
|
27
|
-
establish_connection
|
|
24
|
+
establish_connection
|
|
28
25
|
end
|
|
29
26
|
|
|
30
27
|
def drop
|
|
31
|
-
|
|
28
|
+
establish_connection(public_schema_config)
|
|
32
29
|
connection.drop_database(db_config.database)
|
|
33
30
|
end
|
|
34
31
|
|
|
@@ -41,7 +38,7 @@ module ActiveRecord
|
|
|
41
38
|
end
|
|
42
39
|
|
|
43
40
|
def purge
|
|
44
|
-
clear_active_connections!
|
|
41
|
+
ActiveRecord::Base.connection_handler.clear_active_connections!(:all)
|
|
45
42
|
drop
|
|
46
43
|
create true
|
|
47
44
|
end
|
|
@@ -58,7 +55,6 @@ module ActiveRecord
|
|
|
58
55
|
end
|
|
59
56
|
|
|
60
57
|
args = ["--schema-only", "--no-privileges", "--no-owner"]
|
|
61
|
-
args << "--no-comment" if connection.database_version >= 110_000
|
|
62
58
|
args.concat(["--file", filename])
|
|
63
59
|
|
|
64
60
|
args.concat(Array(extra_flags)) if extra_flags
|
|
@@ -71,6 +67,7 @@ module ActiveRecord
|
|
|
71
67
|
|
|
72
68
|
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
|
73
69
|
if ignore_tables.any?
|
|
70
|
+
ignore_tables = connection.data_sources.select { |table| ignore_tables.any? { |pattern| pattern === table } }
|
|
74
71
|
args += ignore_tables.flat_map { |table| ["-T", table] }
|
|
75
72
|
end
|
|
76
73
|
|
|
@@ -81,7 +78,7 @@ module ActiveRecord
|
|
|
81
78
|
end
|
|
82
79
|
|
|
83
80
|
def structure_load(filename, extra_flags)
|
|
84
|
-
args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--file", filename]
|
|
81
|
+
args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename]
|
|
85
82
|
args.concat(Array(extra_flags)) if extra_flags
|
|
86
83
|
args << db_config.database
|
|
87
84
|
run_cmd("psql", args, "loading")
|
|
@@ -90,15 +87,20 @@ module ActiveRecord
|
|
|
90
87
|
private
|
|
91
88
|
attr_reader :db_config, :configuration_hash
|
|
92
89
|
|
|
90
|
+
def connection
|
|
91
|
+
ActiveRecord::Base.lease_connection
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def establish_connection(config = db_config)
|
|
95
|
+
ActiveRecord::Base.establish_connection(config)
|
|
96
|
+
end
|
|
97
|
+
|
|
93
98
|
def encoding
|
|
94
99
|
configuration_hash[:encoding] || DEFAULT_ENCODING
|
|
95
100
|
end
|
|
96
101
|
|
|
97
|
-
def
|
|
98
|
-
|
|
99
|
-
database: "postgres",
|
|
100
|
-
schema_search_path: "public"
|
|
101
|
-
)
|
|
102
|
+
def public_schema_config
|
|
103
|
+
configuration_hash.merge(database: "postgres", schema_search_path: "public")
|
|
102
104
|
end
|
|
103
105
|
|
|
104
106
|
def psql_env
|