activerecord 7.0.8 → 7.2.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 +530 -2004
- data/MIT-LICENSE +1 -1
- data/README.rdoc +29 -29
- 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 +26 -14
- data/lib/active_record/associations/collection_proxy.rb +29 -11
- 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 +21 -14
- 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 +5 -5
- 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 +1 -3
- 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 +328 -471
- 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 +131 -32
- 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 +148 -33
- data/lib/active_record/attributes.rb +58 -45
- data/lib/active_record/autosave_association.rb +69 -37
- data/lib/active_record/base.rb +9 -5
- data/lib/active_record/callbacks.rb +10 -24
- 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 -42
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +123 -131
- 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 +317 -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 +188 -63
- data/lib/active_record/connection_adapters/abstract/quoting.rb +72 -63
- 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 +137 -11
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +306 -128
- data/lib/active_record/connection_adapters/abstract/transaction.rb +367 -75
- data/lib/active_record/connection_adapters/abstract_adapter.rb +510 -111
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +274 -125
- 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 +26 -139
- data/lib/active_record/connection_adapters/mysql/quoting.rb +53 -54
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +6 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +25 -13
- 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 +14 -3
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +100 -43
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
- 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 +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +65 -61
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +3 -9
- 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 +368 -63
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +364 -198
- 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 +45 -46
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +14 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +50 -8
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +290 -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 +96 -104
- data/lib/active_record/core.rb +217 -174
- data/lib/active_record/counter_cache.rb +68 -34
- data/lib/active_record/database_configurations/connection_url_resolver.rb +7 -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 +87 -34
- data/lib/active_record/delegated_type.rb +39 -10
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +3 -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 +12 -19
- data/lib/active_record/encryption/context.rb +10 -3
- data/lib/active_record/encryption/contexts.rb +5 -1
- data/lib/active_record/encryption/derived_secret_key_provider.rb +8 -2
- data/lib/active_record/encryption/encryptable_record.rb +44 -20
- data/lib/active_record/encryption/encrypted_attribute_type.rb +45 -10
- data/lib/active_record/encryption/encryptor.rb +17 -2
- data/lib/active_record/encryption/extended_deterministic_queries.rb +66 -69
- 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_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 +3 -3
- data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
- data/lib/active_record/encryption/scheme.rb +22 -21
- data/lib/active_record/encryption.rb +1 -0
- data/lib/active_record/enum.rb +122 -29
- data/lib/active_record/errors.rb +151 -31
- data/lib/active_record/explain.rb +21 -12
- 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 +167 -97
- 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 +11 -8
- data/lib/active_record/internal_metadata.rb +124 -20
- data/lib/active_record/locking/optimistic.rb +8 -7
- data/lib/active_record/locking/pessimistic.rb +5 -2
- data/lib/active_record/log_subscriber.rb +18 -22
- 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 +6 -8
- data/lib/active_record/middleware/shard_selector.rb +3 -1
- data/lib/active_record/migration/command_recorder.rb +106 -8
- data/lib/active_record/migration/compatibility.rb +147 -5
- 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 +234 -117
- data/lib/active_record/model_schema.rb +88 -103
- data/lib/active_record/nested_attributes.rb +35 -9
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +168 -339
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +19 -25
- data/lib/active_record/query_logs.rb +92 -52
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +33 -8
- data/lib/active_record/railtie.rb +135 -86
- data/lib/active_record/railties/controller_runtime.rb +22 -7
- data/lib/active_record/railties/databases.rake +145 -154
- 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 +259 -68
- data/lib/active_record/relation/batches/batch_enumerator.rb +20 -5
- data/lib/active_record/relation/batches.rb +196 -61
- data/lib/active_record/relation/calculations.rb +249 -92
- data/lib/active_record/relation/delegation.rb +30 -19
- 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 +18 -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 +28 -16
- data/lib/active_record/relation/query_attribute.rb +2 -1
- data/lib/active_record/relation/query_methods.rb +548 -94
- 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 +580 -90
- data/lib/active_record/result.rb +49 -48
- data/lib/active_record/runtime_registry.rb +63 -1
- data/lib/active_record/sanitization.rb +70 -25
- data/lib/active_record/schema.rb +8 -7
- data/lib/active_record/schema_dumper.rb +63 -14
- data/lib/active_record/schema_migration.rb +75 -24
- data/lib/active_record/scoping/default.rb +15 -5
- data/lib/active_record/scoping/named.rb +2 -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/signed_id.rb +27 -6
- data/lib/active_record/statement_cache.rb +7 -7
- data/lib/active_record/store.rb +8 -8
- data/lib/active_record/suppressor.rb +3 -1
- data/lib/active_record/table_metadata.rb +1 -1
- data/lib/active_record/tasks/database_tasks.rb +180 -119
- data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
- data/lib/active_record/tasks/postgresql_database_tasks.rb +16 -13
- data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
- data/lib/active_record/test_fixtures.rb +170 -155
- 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 +106 -24
- data/lib/active_record/translation.rb +0 -2
- 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 +1 -3
- 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 +9 -3
- 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 +60 -11
- data/lib/active_record/validations.rb +12 -5
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +247 -33
- 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/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/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} +5 -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 +56 -14
- 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,40 +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
179
|
each_current_configuration(env) do |db_config|
|
|
192
|
-
|
|
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
|
-
|
|
196
|
-
|
|
188
|
+
unless database_initialized
|
|
189
|
+
if File.exist?(schema_dump_path(db_config))
|
|
190
|
+
load_schema(db_config, ActiveRecord.schema_format, nil)
|
|
191
|
+
end
|
|
197
192
|
|
|
198
|
-
|
|
199
|
-
dump_schema(db_config, ActiveRecord.schema_format)
|
|
200
|
-
end
|
|
201
|
-
rescue ActiveRecord::NoDatabaseError
|
|
202
|
-
create(db_config)
|
|
203
|
-
|
|
204
|
-
if File.exist?(schema_dump_path(db_config))
|
|
205
|
-
load_schema(
|
|
206
|
-
db_config,
|
|
207
|
-
ActiveRecord.schema_format,
|
|
208
|
-
nil
|
|
209
|
-
)
|
|
210
|
-
else
|
|
211
|
-
migrate
|
|
193
|
+
seed = true
|
|
212
194
|
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
213
197
|
|
|
214
|
-
|
|
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
|
|
215
206
|
end
|
|
216
207
|
end
|
|
217
208
|
|
|
218
|
-
ActiveRecord::Base.establish_connection
|
|
219
209
|
load_seed if seed
|
|
220
210
|
end
|
|
221
211
|
|
|
@@ -240,10 +230,9 @@ module ActiveRecord
|
|
|
240
230
|
end
|
|
241
231
|
|
|
242
232
|
def truncate_tables(db_config)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
connection.truncate_tables(*connection.tables)
|
|
233
|
+
with_temporary_connection(db_config) do |conn|
|
|
234
|
+
conn.truncate_tables(*conn.tables)
|
|
235
|
+
end
|
|
247
236
|
end
|
|
248
237
|
private :truncate_tables
|
|
249
238
|
|
|
@@ -254,12 +243,12 @@ module ActiveRecord
|
|
|
254
243
|
end
|
|
255
244
|
|
|
256
245
|
def migrate(version = nil)
|
|
257
|
-
check_target_version
|
|
258
|
-
|
|
259
246
|
scope = ENV["SCOPE"]
|
|
260
247
|
verbose_was, Migration.verbose = Migration.verbose, verbose?
|
|
261
248
|
|
|
262
|
-
|
|
249
|
+
check_target_version
|
|
250
|
+
|
|
251
|
+
migration_connection_pool.migration_context.migrate(target_version) do |migration|
|
|
263
252
|
if version.blank?
|
|
264
253
|
scope.blank? || scope == migration.scope
|
|
265
254
|
else
|
|
@@ -269,17 +258,17 @@ module ActiveRecord
|
|
|
269
258
|
Migration.write("No migrations ran. (using #{scope} scope)") if scope.present? && migrations_ran.empty?
|
|
270
259
|
end
|
|
271
260
|
|
|
272
|
-
|
|
261
|
+
migration_connection_pool.schema_cache.clear!
|
|
273
262
|
ensure
|
|
274
263
|
Migration.verbose = verbose_was
|
|
275
264
|
end
|
|
276
265
|
|
|
277
|
-
def db_configs_with_versions(
|
|
266
|
+
def db_configs_with_versions(environment = env) # :nodoc:
|
|
278
267
|
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
|
279
268
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
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
|
|
283
272
|
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
|
284
273
|
|
|
285
274
|
versions_to_run.each do |version|
|
|
@@ -292,22 +281,22 @@ module ActiveRecord
|
|
|
292
281
|
end
|
|
293
282
|
|
|
294
283
|
def migrate_status
|
|
295
|
-
unless
|
|
284
|
+
unless migration_connection_pool.schema_migration.table_exists?
|
|
296
285
|
Kernel.abort "Schema migrations table does not exist yet."
|
|
297
286
|
end
|
|
298
287
|
|
|
299
288
|
# output
|
|
300
|
-
puts "\ndatabase: #{
|
|
289
|
+
puts "\ndatabase: #{migration_connection_pool.db_config.database}\n\n"
|
|
301
290
|
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
|
|
302
291
|
puts "-" * 50
|
|
303
|
-
|
|
292
|
+
migration_connection_pool.migration_context.migrations_status.each do |status, version, name|
|
|
304
293
|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
|
|
305
294
|
end
|
|
306
295
|
puts
|
|
307
296
|
end
|
|
308
297
|
|
|
309
298
|
def check_target_version
|
|
310
|
-
if target_version && !
|
|
299
|
+
if target_version && !Migration.valid_version_format?(ENV["VERSION"])
|
|
311
300
|
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
|
312
301
|
end
|
|
313
302
|
end
|
|
@@ -347,7 +336,8 @@ module ActiveRecord
|
|
|
347
336
|
|
|
348
337
|
def purge_current(environment = env)
|
|
349
338
|
each_current_configuration(environment) { |db_config| purge(db_config) }
|
|
350
|
-
|
|
339
|
+
|
|
340
|
+
migration_class.establish_connection(environment.to_sym)
|
|
351
341
|
end
|
|
352
342
|
|
|
353
343
|
def structure_dump(configuration, *arguments)
|
|
@@ -370,7 +360,6 @@ module ActiveRecord
|
|
|
370
360
|
|
|
371
361
|
verbose_was, Migration.verbose = Migration.verbose, verbose? && ENV["VERBOSE"]
|
|
372
362
|
check_schema_file(file)
|
|
373
|
-
ActiveRecord::Base.establish_connection(db_config)
|
|
374
363
|
|
|
375
364
|
case format
|
|
376
365
|
when :ruby
|
|
@@ -380,9 +369,8 @@ module ActiveRecord
|
|
|
380
369
|
else
|
|
381
370
|
raise ArgumentError, "unknown format #{format.inspect}"
|
|
382
371
|
end
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
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))
|
|
386
374
|
ensure
|
|
387
375
|
Migration.verbose = verbose_was
|
|
388
376
|
end
|
|
@@ -394,12 +382,13 @@ module ActiveRecord
|
|
|
394
382
|
|
|
395
383
|
return true unless file && File.exist?(file)
|
|
396
384
|
|
|
397
|
-
|
|
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?
|
|
398
389
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
|
390
|
+
internal_metadata[:schema_sha1] == schema_sha1(file)
|
|
391
|
+
end
|
|
403
392
|
end
|
|
404
393
|
|
|
405
394
|
def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
|
|
@@ -407,53 +396,43 @@ module ActiveRecord
|
|
|
407
396
|
|
|
408
397
|
check_schema_file(file) if file
|
|
409
398
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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)
|
|
416
408
|
load_schema(db_config, format, file)
|
|
417
409
|
end
|
|
418
|
-
rescue ActiveRecord::NoDatabaseError
|
|
419
|
-
create(db_config)
|
|
420
|
-
load_schema(db_config, format, file)
|
|
421
410
|
end
|
|
422
411
|
|
|
423
412
|
def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
|
|
413
|
+
return unless db_config.schema_dump
|
|
414
|
+
|
|
424
415
|
require "active_record/schema_dumper"
|
|
425
416
|
filename = schema_dump_path(db_config, format)
|
|
426
417
|
return unless filename
|
|
427
418
|
|
|
428
|
-
connection = ActiveRecord::Base.connection
|
|
429
|
-
|
|
430
419
|
FileUtils.mkdir_p(db_dir)
|
|
431
420
|
case format
|
|
432
421
|
when :ruby
|
|
433
422
|
File.open(filename, "w:utf-8") do |file|
|
|
434
|
-
ActiveRecord::SchemaDumper.dump(
|
|
423
|
+
ActiveRecord::SchemaDumper.dump(migration_connection_pool, file)
|
|
435
424
|
end
|
|
436
425
|
when :sql
|
|
437
426
|
structure_dump(db_config, filename)
|
|
438
|
-
if
|
|
427
|
+
if migration_connection_pool.schema_migration.table_exists?
|
|
439
428
|
File.open(filename, "a") do |f|
|
|
440
|
-
f.puts
|
|
429
|
+
f.puts migration_connection.dump_schema_information
|
|
441
430
|
f.print "\n"
|
|
442
431
|
end
|
|
443
432
|
end
|
|
444
433
|
end
|
|
445
434
|
end
|
|
446
435
|
|
|
447
|
-
def schema_file_type(format = ActiveRecord.schema_format)
|
|
448
|
-
case format
|
|
449
|
-
when :ruby
|
|
450
|
-
"schema.rb"
|
|
451
|
-
when :sql
|
|
452
|
-
"structure.sql"
|
|
453
|
-
end
|
|
454
|
-
end
|
|
455
|
-
deprecate :schema_file_type
|
|
456
|
-
|
|
457
436
|
def schema_dump_path(db_config, format = ActiveRecord.schema_format)
|
|
458
437
|
return ENV["SCHEMA"] if ENV["SCHEMA"]
|
|
459
438
|
|
|
@@ -467,21 +446,34 @@ module ActiveRecord
|
|
|
467
446
|
end
|
|
468
447
|
end
|
|
469
448
|
|
|
470
|
-
def cache_dump_filename(
|
|
471
|
-
|
|
472
|
-
|
|
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)
|
|
473
455
|
else
|
|
474
|
-
|
|
475
|
-
|
|
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
|
|
476
466
|
|
|
477
|
-
|
|
467
|
+
schema_cache_path || schema_cache_env || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
|
468
|
+
end
|
|
478
469
|
end
|
|
479
470
|
|
|
480
471
|
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
|
481
472
|
each_current_configuration(environment) do |db_config|
|
|
482
|
-
|
|
473
|
+
with_temporary_connection(db_config) do
|
|
474
|
+
load_schema(db_config, format, file)
|
|
475
|
+
end
|
|
483
476
|
end
|
|
484
|
-
ActiveRecord::Base.establish_connection(environment.to_sym)
|
|
485
477
|
end
|
|
486
478
|
|
|
487
479
|
def check_schema_file(filename)
|
|
@@ -504,17 +496,66 @@ module ActiveRecord
|
|
|
504
496
|
|
|
505
497
|
# Dumps the schema cache in YAML format for the connection into the file
|
|
506
498
|
#
|
|
507
|
-
# ==== Examples
|
|
508
|
-
# ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.
|
|
509
|
-
def dump_schema_cache(
|
|
510
|
-
|
|
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)
|
|
511
503
|
end
|
|
512
504
|
|
|
513
505
|
def clear_schema_cache(filename)
|
|
514
506
|
FileUtils.rm_f filename, verbose: false
|
|
515
507
|
end
|
|
516
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
|
+
|
|
517
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
|
+
|
|
518
559
|
def configs_for(**options)
|
|
519
560
|
Base.configurations.configs_for(**options)
|
|
520
561
|
end
|
|
@@ -547,10 +588,7 @@ module ActiveRecord
|
|
|
547
588
|
end
|
|
548
589
|
|
|
549
590
|
def each_current_configuration(environment, name = nil)
|
|
550
|
-
|
|
551
|
-
environments << "test" if environment == "development" && !ENV["SKIP_TEST_DATABASE"] && !ENV["DATABASE_URL"]
|
|
552
|
-
|
|
553
|
-
environments.each do |env|
|
|
591
|
+
each_current_environment(environment) do |env|
|
|
554
592
|
configs_for(env_name: env).each do |db_config|
|
|
555
593
|
next if name && name != db_config.name
|
|
556
594
|
|
|
@@ -559,6 +597,12 @@ module ActiveRecord
|
|
|
559
597
|
end
|
|
560
598
|
end
|
|
561
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
|
+
|
|
562
606
|
def each_local_configuration
|
|
563
607
|
configs_for.each do |db_config|
|
|
564
608
|
next unless db_config.database
|
|
@@ -595,6 +639,23 @@ module ActiveRecord
|
|
|
595
639
|
structure_load_flags
|
|
596
640
|
end
|
|
597
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
|
|
598
659
|
end
|
|
599
660
|
end
|
|
600
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
|
|
@@ -70,6 +67,7 @@ module ActiveRecord
|
|
|
70
67
|
|
|
71
68
|
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
|
72
69
|
if ignore_tables.any?
|
|
70
|
+
ignore_tables = connection.data_sources.select { |table| ignore_tables.any? { |pattern| pattern === table } }
|
|
73
71
|
args += ignore_tables.flat_map { |table| ["-T", table] }
|
|
74
72
|
end
|
|
75
73
|
|
|
@@ -89,15 +87,20 @@ module ActiveRecord
|
|
|
89
87
|
private
|
|
90
88
|
attr_reader :db_config, :configuration_hash
|
|
91
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
|
+
|
|
92
98
|
def encoding
|
|
93
99
|
configuration_hash[:encoding] || DEFAULT_ENCODING
|
|
94
100
|
end
|
|
95
101
|
|
|
96
|
-
def
|
|
97
|
-
|
|
98
|
-
database: "postgres",
|
|
99
|
-
schema_search_path: "public"
|
|
100
|
-
)
|
|
102
|
+
def public_schema_config
|
|
103
|
+
configuration_hash.merge(database: "postgres", schema_search_path: "public")
|
|
101
104
|
end
|
|
102
105
|
|
|
103
106
|
def psql_env
|