activerecord 5.0.7.2 → 6.0.6.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.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +844 -1944
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +113 -55
- data/lib/active_record/associations/association_scope.rb +102 -96
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +93 -254
- data/lib/active_record/associations/collection_proxy.rb +159 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +152 -177
- data/lib/active_record/associations/preloader/association.rb +101 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/preloader.rb +94 -103
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +58 -39
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +207 -160
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +67 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +85 -86
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/model_schema.rb +160 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -254
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +82 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +488 -332
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +443 -318
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +51 -26
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +243 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +12 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +23 -18
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -2
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +37 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +138 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
- /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Tasks # :nodoc:
|
3
5
|
class MySQLDatabaseTasks # :nodoc:
|
4
|
-
|
6
|
+
ER_DB_CREATE_EXISTS = 1007
|
5
7
|
|
6
8
|
delegate :connection, :establish_connection, to: ActiveRecord::Base
|
7
9
|
|
@@ -11,38 +13,24 @@ module ActiveRecord
|
|
11
13
|
|
12
14
|
def create
|
13
15
|
establish_connection configuration_without_database
|
14
|
-
connection.create_database configuration[
|
16
|
+
connection.create_database configuration["database"], creation_options
|
15
17
|
establish_connection configuration
|
16
18
|
rescue ActiveRecord::StatementInvalid => error
|
17
|
-
if
|
19
|
+
if connection.error_number(error.cause) == ER_DB_CREATE_EXISTS
|
18
20
|
raise DatabaseAlreadyExists
|
19
21
|
else
|
20
22
|
raise
|
21
23
|
end
|
22
|
-
rescue error_class => error
|
23
|
-
if error.respond_to?(:errno) && error.errno == ACCESS_DENIED_ERROR
|
24
|
-
$stdout.print error.message
|
25
|
-
establish_connection root_configuration_without_database
|
26
|
-
connection.create_database configuration['database'], creation_options
|
27
|
-
if configuration['username'] != 'root'
|
28
|
-
connection.execute grant_statement.gsub(/\s+/, ' ').strip
|
29
|
-
end
|
30
|
-
establish_connection configuration
|
31
|
-
else
|
32
|
-
$stderr.puts error.inspect
|
33
|
-
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
|
34
|
-
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['encoding']
|
35
|
-
end
|
36
24
|
end
|
37
25
|
|
38
26
|
def drop
|
39
27
|
establish_connection configuration
|
40
|
-
connection.drop_database configuration[
|
28
|
+
connection.drop_database configuration["database"]
|
41
29
|
end
|
42
30
|
|
43
31
|
def purge
|
44
32
|
establish_connection configuration
|
45
|
-
connection.recreate_database configuration[
|
33
|
+
connection.recreate_database configuration["database"], creation_options
|
46
34
|
end
|
47
35
|
|
48
36
|
def charset
|
@@ -53,99 +41,74 @@ module ActiveRecord
|
|
53
41
|
connection.collation
|
54
42
|
end
|
55
43
|
|
56
|
-
def structure_dump(filename)
|
44
|
+
def structure_dump(filename, extra_flags)
|
57
45
|
args = prepare_command_options
|
58
46
|
args.concat(["--result-file", "#{filename}"])
|
59
47
|
args.concat(["--no-data"])
|
60
48
|
args.concat(["--routines"])
|
49
|
+
args.concat(["--skip-comments"])
|
50
|
+
|
51
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
52
|
+
if ignore_tables.any?
|
53
|
+
args += ignore_tables.map { |table| "--ignore-table=#{configuration['database']}.#{table}" }
|
54
|
+
end
|
55
|
+
|
61
56
|
args.concat(["#{configuration['database']}"])
|
57
|
+
args.unshift(*extra_flags) if extra_flags
|
62
58
|
|
63
|
-
run_cmd(
|
59
|
+
run_cmd("mysqldump", args, "dumping")
|
64
60
|
end
|
65
61
|
|
66
|
-
def structure_load(filename)
|
62
|
+
def structure_load(filename, extra_flags)
|
67
63
|
args = prepare_command_options
|
68
|
-
args.concat([
|
64
|
+
args.concat(["--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}])
|
69
65
|
args.concat(["--database", "#{configuration['database']}"])
|
66
|
+
args.unshift(*extra_flags) if extra_flags
|
70
67
|
|
71
|
-
run_cmd(
|
68
|
+
run_cmd("mysql", args, "loading")
|
72
69
|
end
|
73
70
|
|
74
71
|
private
|
72
|
+
attr_reader :configuration
|
75
73
|
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
def configuration_without_database
|
81
|
-
configuration.merge('database' => nil)
|
82
|
-
end
|
83
|
-
|
84
|
-
def creation_options
|
85
|
-
Hash.new.tap do |options|
|
86
|
-
options[:charset] = configuration['encoding'] if configuration.include? 'encoding'
|
87
|
-
options[:collation] = configuration['collation'] if configuration.include? 'collation'
|
74
|
+
def configuration_without_database
|
75
|
+
configuration.merge("database" => nil)
|
88
76
|
end
|
89
|
-
end
|
90
77
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
Mysql2::Error
|
97
|
-
else
|
98
|
-
StandardError
|
78
|
+
def creation_options
|
79
|
+
Hash.new.tap do |options|
|
80
|
+
options[:charset] = configuration["encoding"] if configuration.include? "encoding"
|
81
|
+
options[:collation] = configuration["collation"] if configuration.include? "collation"
|
82
|
+
end
|
99
83
|
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def grant_statement
|
103
|
-
<<-SQL
|
104
|
-
GRANT ALL PRIVILEGES ON #{configuration['database']}.*
|
105
|
-
TO '#{configuration['username']}'@'localhost'
|
106
|
-
IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
107
|
-
SQL
|
108
|
-
end
|
109
|
-
|
110
|
-
def root_configuration_without_database
|
111
|
-
configuration_without_database.merge(
|
112
|
-
'username' => 'root',
|
113
|
-
'password' => root_password
|
114
|
-
)
|
115
|
-
end
|
116
|
-
|
117
|
-
def root_password
|
118
|
-
$stdout.print "Please provide the root password for your MySQL installation\n>"
|
119
|
-
$stdin.gets.strip
|
120
|
-
end
|
121
84
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
85
|
+
def prepare_command_options
|
86
|
+
args = {
|
87
|
+
"host" => "--host",
|
88
|
+
"port" => "--port",
|
89
|
+
"socket" => "--socket",
|
90
|
+
"username" => "--user",
|
91
|
+
"password" => "--password",
|
92
|
+
"encoding" => "--default-character-set",
|
93
|
+
"sslca" => "--ssl-ca",
|
94
|
+
"sslcert" => "--ssl-cert",
|
95
|
+
"sslcapath" => "--ssl-capath",
|
96
|
+
"sslcipher" => "--ssl-cipher",
|
97
|
+
"sslkey" => "--ssl-key"
|
98
|
+
}.map { |opt, arg| "#{arg}=#{configuration[opt]}" if configuration[opt] }.compact
|
99
|
+
|
100
|
+
args
|
101
|
+
end
|
139
102
|
|
140
|
-
|
141
|
-
|
142
|
-
|
103
|
+
def run_cmd(cmd, args, action)
|
104
|
+
fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
|
105
|
+
end
|
143
106
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
107
|
+
def run_cmd_error(cmd, args, action)
|
108
|
+
msg = +"failed to execute: `#{cmd}`\n"
|
109
|
+
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
110
|
+
msg
|
111
|
+
end
|
149
112
|
end
|
150
113
|
end
|
151
114
|
end
|
@@ -1,7 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tempfile"
|
4
|
+
|
1
5
|
module ActiveRecord
|
2
6
|
module Tasks # :nodoc:
|
3
7
|
class PostgreSQLDatabaseTasks # :nodoc:
|
4
|
-
DEFAULT_ENCODING = ENV[
|
8
|
+
DEFAULT_ENCODING = ENV["CHARSET"] || "utf8"
|
9
|
+
ON_ERROR_STOP_1 = "ON_ERROR_STOP=1"
|
10
|
+
SQL_COMMENT_BEGIN = "--"
|
5
11
|
|
6
12
|
delegate :connection, :establish_connection, :clear_active_connections!,
|
7
13
|
to: ActiveRecord::Base
|
@@ -12,8 +18,8 @@ module ActiveRecord
|
|
12
18
|
|
13
19
|
def create(master_established = false)
|
14
20
|
establish_master_connection unless master_established
|
15
|
-
connection.create_database configuration[
|
16
|
-
configuration.merge(
|
21
|
+
connection.create_database configuration["database"],
|
22
|
+
configuration.merge("encoding" => encoding)
|
17
23
|
establish_connection configuration
|
18
24
|
rescue ActiveRecord::StatementInvalid => error
|
19
25
|
if error.cause.is_a?(PG::DuplicateDatabase)
|
@@ -25,7 +31,7 @@ module ActiveRecord
|
|
25
31
|
|
26
32
|
def drop
|
27
33
|
establish_master_connection
|
28
|
-
connection.drop_database configuration[
|
34
|
+
connection.drop_database configuration["database"]
|
29
35
|
end
|
30
36
|
|
31
37
|
def charset
|
@@ -42,69 +48,93 @@ module ActiveRecord
|
|
42
48
|
create true
|
43
49
|
end
|
44
50
|
|
45
|
-
def structure_dump(filename)
|
51
|
+
def structure_dump(filename, extra_flags)
|
46
52
|
set_psql_env
|
47
53
|
|
48
|
-
search_path =
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
54
|
+
search_path = \
|
55
|
+
case ActiveRecord::Base.dump_schemas
|
56
|
+
when :schema_search_path
|
57
|
+
configuration["schema_search_path"]
|
58
|
+
when :all
|
59
|
+
nil
|
60
|
+
when String
|
61
|
+
ActiveRecord::Base.dump_schemas
|
62
|
+
end
|
56
63
|
|
57
|
-
args = [
|
64
|
+
args = ["-s", "-x", "-O", "-f", filename]
|
65
|
+
args.concat(Array(extra_flags)) if extra_flags
|
58
66
|
unless search_path.blank?
|
59
|
-
args += search_path.split(
|
67
|
+
args += search_path.split(",").map do |part|
|
60
68
|
"--schema=#{part.strip}"
|
61
69
|
end
|
62
70
|
end
|
63
|
-
|
64
|
-
|
71
|
+
|
72
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
73
|
+
if ignore_tables.any?
|
74
|
+
args += ignore_tables.flat_map { |table| ["-T", table] }
|
75
|
+
end
|
76
|
+
|
77
|
+
args << configuration["database"]
|
78
|
+
run_cmd("pg_dump", args, "dumping")
|
79
|
+
remove_sql_header_comments(filename)
|
65
80
|
File.open(filename, "a") { |f| f << "SET search_path TO #{connection.schema_search_path};\n\n" }
|
66
81
|
end
|
67
82
|
|
68
|
-
def structure_load(filename)
|
83
|
+
def structure_load(filename, extra_flags)
|
69
84
|
set_psql_env
|
70
|
-
args = [
|
71
|
-
|
85
|
+
args = ["-v", ON_ERROR_STOP_1, "-q", "-X", "-f", filename]
|
86
|
+
args.concat(Array(extra_flags)) if extra_flags
|
87
|
+
args << configuration["database"]
|
88
|
+
run_cmd("psql", args, "loading")
|
72
89
|
end
|
73
90
|
|
74
91
|
private
|
92
|
+
attr_reader :configuration
|
75
93
|
|
76
|
-
|
77
|
-
|
78
|
-
|
94
|
+
def encoding
|
95
|
+
configuration["encoding"] || DEFAULT_ENCODING
|
96
|
+
end
|
79
97
|
|
80
|
-
|
81
|
-
|
82
|
-
|
98
|
+
def establish_master_connection
|
99
|
+
establish_connection configuration.merge(
|
100
|
+
"database" => "postgres",
|
101
|
+
"schema_search_path" => "public"
|
102
|
+
)
|
103
|
+
end
|
83
104
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
105
|
+
def set_psql_env
|
106
|
+
ENV["PGHOST"] = configuration["host"] if configuration["host"]
|
107
|
+
ENV["PGPORT"] = configuration["port"].to_s if configuration["port"]
|
108
|
+
ENV["PGPASSWORD"] = configuration["password"].to_s if configuration["password"]
|
109
|
+
ENV["PGUSER"] = configuration["username"].to_s if configuration["username"]
|
110
|
+
end
|
90
111
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
ENV['PGPASSWORD'] = configuration['password'].to_s if configuration['password']
|
95
|
-
ENV['PGUSER'] = configuration['username'].to_s if configuration['username']
|
96
|
-
end
|
112
|
+
def run_cmd(cmd, args, action)
|
113
|
+
fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
|
114
|
+
end
|
97
115
|
|
98
|
-
|
99
|
-
|
100
|
-
|
116
|
+
def run_cmd_error(cmd, args, action)
|
117
|
+
msg = +"failed to execute:\n"
|
118
|
+
msg << "#{cmd} #{args.join(' ')}\n\n"
|
119
|
+
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
120
|
+
msg
|
121
|
+
end
|
101
122
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
123
|
+
def remove_sql_header_comments(filename)
|
124
|
+
removing_comments = true
|
125
|
+
tempfile = Tempfile.open("uncommented_structure.sql")
|
126
|
+
begin
|
127
|
+
File.foreach(filename) do |line|
|
128
|
+
unless removing_comments && (line.start_with?(SQL_COMMENT_BEGIN) || line.blank?)
|
129
|
+
tempfile << line
|
130
|
+
removing_comments = false
|
131
|
+
end
|
132
|
+
end
|
133
|
+
ensure
|
134
|
+
tempfile.close
|
135
|
+
end
|
136
|
+
FileUtils.cp(tempfile.path, filename)
|
137
|
+
end
|
108
138
|
end
|
109
139
|
end
|
110
140
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Tasks # :nodoc:
|
3
5
|
class SQLiteDatabaseTasks # :nodoc:
|
@@ -8,20 +10,20 @@ module ActiveRecord
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def create
|
11
|
-
raise DatabaseAlreadyExists if File.exist?(configuration[
|
13
|
+
raise DatabaseAlreadyExists if File.exist?(configuration["database"])
|
12
14
|
|
13
15
|
establish_connection configuration
|
14
16
|
connection
|
15
17
|
end
|
16
18
|
|
17
19
|
def drop
|
18
|
-
require
|
19
|
-
path = Pathname.new configuration[
|
20
|
+
require "pathname"
|
21
|
+
path = Pathname.new configuration["database"]
|
20
22
|
file = path.absolute? ? path.to_s : File.join(root, path)
|
21
23
|
|
22
24
|
FileUtils.rm(file)
|
23
25
|
rescue Errno::ENOENT => error
|
24
|
-
raise NoDatabaseError.new(error.message
|
26
|
+
raise NoDatabaseError.new(error.message)
|
25
27
|
end
|
26
28
|
|
27
29
|
def purge
|
@@ -35,25 +37,40 @@ module ActiveRecord
|
|
35
37
|
connection.encoding
|
36
38
|
end
|
37
39
|
|
38
|
-
def structure_dump(filename)
|
39
|
-
|
40
|
-
|
40
|
+
def structure_dump(filename, extra_flags)
|
41
|
+
args = []
|
42
|
+
args.concat(Array(extra_flags)) if extra_flags
|
43
|
+
args << configuration["database"]
|
44
|
+
|
45
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
46
|
+
if ignore_tables.any?
|
47
|
+
condition = ignore_tables.map { |table| connection.quote(table) }.join(", ")
|
48
|
+
args << "SELECT sql FROM sqlite_master WHERE tbl_name NOT IN (#{condition}) ORDER BY tbl_name, type DESC, name"
|
49
|
+
else
|
50
|
+
args << ".schema"
|
51
|
+
end
|
52
|
+
run_cmd("sqlite3", args, filename)
|
41
53
|
end
|
42
54
|
|
43
|
-
def structure_load(filename)
|
44
|
-
dbfile = configuration[
|
45
|
-
|
55
|
+
def structure_load(filename, extra_flags)
|
56
|
+
dbfile = configuration["database"]
|
57
|
+
flags = extra_flags.join(" ") if extra_flags
|
58
|
+
`sqlite3 #{flags} #{dbfile} < "#{filename}"`
|
46
59
|
end
|
47
60
|
|
48
61
|
private
|
62
|
+
attr_reader :configuration, :root
|
49
63
|
|
50
|
-
|
51
|
-
|
52
|
-
|
64
|
+
def run_cmd(cmd, args, out)
|
65
|
+
fail run_cmd_error(cmd, args) unless Kernel.system(cmd, *args, out: out)
|
66
|
+
end
|
53
67
|
|
54
|
-
|
55
|
-
|
56
|
-
|
68
|
+
def run_cmd_error(cmd, args)
|
69
|
+
msg = +"failed to execute:\n"
|
70
|
+
msg << "#{cmd} #{args.join(' ')}\n\n"
|
71
|
+
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
72
|
+
msg
|
73
|
+
end
|
57
74
|
end
|
58
75
|
end
|
59
76
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/testing/parallelization"
|
4
|
+
|
5
|
+
module ActiveRecord
|
6
|
+
module TestDatabases # :nodoc:
|
7
|
+
ActiveSupport::Testing::Parallelization.after_fork_hook do |i|
|
8
|
+
create_and_load_schema(i, env_name: Rails.env)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.create_and_load_schema(i, env_name:)
|
12
|
+
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
|
13
|
+
|
14
|
+
ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
|
15
|
+
db_config.config["database"] += "-#{i}"
|
16
|
+
ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
|
17
|
+
end
|
18
|
+
ensure
|
19
|
+
ActiveRecord::Base.establish_connection(Rails.env.to_sym)
|
20
|
+
ENV["VERBOSE"] = old
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|