activerecord 5.0.7.2 → 6.1.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +829 -2015
- data/MIT-LICENSE +3 -1
- data/README.rdoc +11 -9
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record.rb +37 -29
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +30 -18
- data/lib/active_record/associations.rb +1714 -1596
- data/lib/active_record/associations/alias_tracker.rb +36 -42
- data/lib/active_record/associations/association.rb +143 -68
- data/lib/active_record/associations/association_scope.rb +98 -94
- data/lib/active_record/associations/belongs_to_association.rb +76 -46
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +27 -28
- data/lib/active_record/associations/builder/belongs_to.rb +52 -60
- data/lib/active_record/associations/builder/collection_association.rb +12 -22
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
- data/lib/active_record/associations/builder/has_many.rb +10 -2
- data/lib/active_record/associations/builder/has_one.rb +35 -2
- data/lib/active_record/associations/builder/singular_association.rb +5 -1
- data/lib/active_record/associations/collection_association.rb +104 -259
- data/lib/active_record/associations/collection_proxy.rb +169 -125
- data/lib/active_record/associations/foreign_association.rb +22 -0
- data/lib/active_record/associations/has_many_association.rb +46 -31
- data/lib/active_record/associations/has_many_through_association.rb +66 -46
- data/lib/active_record/associations/has_one_association.rb +71 -52
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +169 -180
- data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
- 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/preloader.rb +97 -104
- data/lib/active_record/associations/preloader/association.rb +109 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/attribute_assignment.rb +55 -60
- data/lib/active_record/attribute_methods.rb +111 -141
- data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
- data/lib/active_record/attribute_methods/dirty.rb +172 -112
- data/lib/active_record/attribute_methods/primary_key.rb +88 -91
- data/lib/active_record/attribute_methods/query.rb +6 -8
- data/lib/active_record/attribute_methods/read.rb +18 -50
- data/lib/active_record/attribute_methods/serialization.rb +38 -10
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
- data/lib/active_record/attribute_methods/write.rb +25 -32
- data/lib/active_record/attributes.rb +69 -31
- data/lib/active_record/autosave_association.rb +102 -66
- data/lib/active_record/base.rb +16 -25
- data/lib/active_record/callbacks.rb +202 -43
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -12
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
- data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
- data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
- data/lib/active_record/connection_adapters/column.rb +55 -13
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -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 +79 -49
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -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 +20 -12
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
- 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 +6 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
- 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/interval.rb +49 -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/macaddr.rb +25 -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 +18 -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/quoting.rb +98 -38
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -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 +426 -324
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
- data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -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 +5 -6
- 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 +170 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +287 -45
- data/lib/active_record/core.rb +385 -181
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations.rb +272 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +122 -47
- data/lib/active_record/errors.rb +153 -22
- data/lib/active_record/explain.rb +13 -8
- 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 +20 -22
- data/lib/active_record/fixture_set/model_metadata.rb +32 -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 +246 -507
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +168 -95
- data/lib/active_record/insert_all.rb +208 -0
- data/lib/active_record/integration.rb +114 -25
- data/lib/active_record/internal_metadata.rb +30 -24
- data/lib/active_record/legacy_yaml_adapter.rb +11 -5
- data/lib/active_record/locking/optimistic.rb +81 -85
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +68 -31
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/migration.rb +439 -342
- data/lib/active_record/migration/command_recorder.rb +152 -98
- data/lib/active_record/migration/compatibility.rb +229 -60
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/model_schema.rb +230 -122
- data/lib/active_record/nested_attributes.rb +213 -203
- data/lib/active_record/no_touching.rb +11 -2
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +471 -97
- data/lib/active_record/query_cache.rb +23 -12
- data/lib/active_record/querying.rb +43 -25
- data/lib/active_record/railtie.rb +155 -43
- 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 +507 -195
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +245 -269
- data/lib/active_record/relation.rb +475 -324
- data/lib/active_record/relation/batches.rb +125 -72
- data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
- data/lib/active_record/relation/calculations.rb +267 -171
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +238 -248
- data/lib/active_record/relation/from_clause.rb +7 -9
- data/lib/active_record/relation/merger.rb +95 -77
- data/lib/active_record/relation/predicate_builder.rb +109 -110
- data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +654 -374
- data/lib/active_record/relation/record_fetch_warning.rb +8 -6
- data/lib/active_record/relation/spawn_methods.rb +15 -14
- data/lib/active_record/relation/where_clause.rb +171 -109
- data/lib/active_record/result.rb +88 -51
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +73 -100
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +101 -69
- data/lib/active_record/schema_migration.rb +16 -12
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +39 -30
- data/lib/active_record/secure_token.rb +19 -9
- data/lib/active_record/serialization.rb +7 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +80 -29
- data/lib/active_record/store.rb +122 -42
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +51 -39
- data/lib/active_record/tasks/database_tasks.rb +332 -115
- data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
- data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
- data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +246 -0
- data/lib/active_record/timestamp.rb +70 -38
- data/lib/active_record/touch_later.rb +26 -24
- data/lib/active_record/transactions.rb +121 -184
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +29 -17
- 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 +20 -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_caster.rb +4 -2
- data/lib/active_record/type_caster/connection.rb +17 -13
- data/lib/active_record/type_caster/map.rb +10 -6
- data/lib/active_record/validations.rb +8 -5
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +4 -3
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +52 -45
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +54 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -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.rb +70 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -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 +15 -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 +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -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 +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -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 +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -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/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record.rb +7 -5
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- 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/migration.rb +22 -3
- data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
- data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +141 -57
- 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.rb +0 -213
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute_decorators.rb +0 -67
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
- 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/base_handler.rb +0 -17
- 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/relation/where_clause_factory.rb +0 -38
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# See ActiveRecord::Transactions::ClassMethods for documentation.
|
3
5
|
module Transactions
|
@@ -8,10 +10,6 @@ module ActiveRecord
|
|
8
10
|
included do
|
9
11
|
define_callbacks :commit, :rollback,
|
10
12
|
:before_commit,
|
11
|
-
:before_commit_without_transaction_enrollment,
|
12
|
-
:commit_without_transaction_enrollment,
|
13
|
-
:rollback_without_transaction_enrollment,
|
14
|
-
terminator: deprecated_false_terminator,
|
15
13
|
scope: [:kind, :name]
|
16
14
|
end
|
17
15
|
|
@@ -163,13 +161,13 @@ module ActiveRecord
|
|
163
161
|
# end
|
164
162
|
# end
|
165
163
|
#
|
166
|
-
# only "Kotori" is created.
|
164
|
+
# only "Kotori" is created.
|
167
165
|
#
|
168
166
|
# Most databases don't support true nested transactions. At the time of
|
169
167
|
# writing, the only database that we're aware of that supports true nested
|
170
168
|
# transactions, is MS-SQL. Because of this, Active Record emulates nested
|
171
|
-
# transactions by using savepoints
|
172
|
-
#
|
169
|
+
# transactions by using savepoints. See
|
170
|
+
# https://dev.mysql.com/doc/refman/en/savepoint.html
|
173
171
|
# for more information about savepoints.
|
174
172
|
#
|
175
173
|
# === \Callbacks
|
@@ -189,8 +187,8 @@ module ActiveRecord
|
|
189
187
|
#
|
190
188
|
# === Caveats
|
191
189
|
#
|
192
|
-
# If you're on MySQL, then do not use DDL operations in nested
|
193
|
-
# blocks that are emulated with savepoints. That is, do not execute statements
|
190
|
+
# If you're on MySQL, then do not use Data Definition Language (DDL) operations in nested
|
191
|
+
# transactions blocks that are emulated with savepoints. That is, do not execute statements
|
194
192
|
# like 'CREATE TABLE' inside such blocks. This is because MySQL automatically
|
195
193
|
# releases all savepoints upon executing a DDL operation. When +transaction+
|
196
194
|
# is finished and tries to release the savepoint it created earlier, a
|
@@ -207,8 +205,8 @@ module ActiveRecord
|
|
207
205
|
# Note that "TRUNCATE" is also a MySQL DDL statement!
|
208
206
|
module ClassMethods
|
209
207
|
# See the ConnectionAdapters::DatabaseStatements#transaction API docs.
|
210
|
-
def transaction(options
|
211
|
-
connection.transaction(options, &block)
|
208
|
+
def transaction(**options, &block)
|
209
|
+
connection.transaction(**options, &block)
|
212
210
|
end
|
213
211
|
|
214
212
|
def before_commit(*args, &block) # :nodoc:
|
@@ -233,6 +231,12 @@ module ActiveRecord
|
|
233
231
|
set_callback(:commit, :after, *args, &block)
|
234
232
|
end
|
235
233
|
|
234
|
+
# Shortcut for <tt>after_commit :hook, on: [ :create, :update ]</tt>.
|
235
|
+
def after_save_commit(*args, &block)
|
236
|
+
set_options_for_callbacks!(args, on: [ :create, :update ])
|
237
|
+
set_callback(:commit, :after, *args, &block)
|
238
|
+
end
|
239
|
+
|
236
240
|
# Shortcut for <tt>after_commit :hook, on: :create</tt>.
|
237
241
|
def after_create_commit(*args, &block)
|
238
242
|
set_options_for_callbacks!(args, on: :create)
|
@@ -259,88 +263,50 @@ module ActiveRecord
|
|
259
263
|
set_callback(:rollback, :after, *args, &block)
|
260
264
|
end
|
261
265
|
|
262
|
-
def before_commit_without_transaction_enrollment(*args, &block) # :nodoc:
|
263
|
-
set_options_for_callbacks!(args)
|
264
|
-
set_callback(:before_commit_without_transaction_enrollment, :before, *args, &block)
|
265
|
-
end
|
266
|
-
|
267
|
-
def after_commit_without_transaction_enrollment(*args, &block) # :nodoc:
|
268
|
-
set_options_for_callbacks!(args)
|
269
|
-
set_callback(:commit_without_transaction_enrollment, :after, *args, &block)
|
270
|
-
end
|
271
|
-
|
272
|
-
def after_rollback_without_transaction_enrollment(*args, &block) # :nodoc:
|
273
|
-
set_options_for_callbacks!(args)
|
274
|
-
set_callback(:rollback_without_transaction_enrollment, :after, *args, &block)
|
275
|
-
end
|
276
|
-
|
277
|
-
def raise_in_transactional_callbacks
|
278
|
-
ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks is deprecated and will be removed without replacement.')
|
279
|
-
true
|
280
|
-
end
|
281
|
-
|
282
|
-
def raise_in_transactional_callbacks=(value)
|
283
|
-
ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks= is deprecated, has no effect and will be removed without replacement.')
|
284
|
-
value
|
285
|
-
end
|
286
|
-
|
287
266
|
private
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
267
|
+
def set_options_for_callbacks!(args, enforced_options = {})
|
268
|
+
options = args.extract_options!.merge!(enforced_options)
|
269
|
+
args << options
|
270
|
+
|
271
|
+
if options[:on]
|
272
|
+
fire_on = Array(options[:on])
|
273
|
+
assert_valid_transaction_action(fire_on)
|
274
|
+
options[:if] = [
|
275
|
+
-> { transaction_include_any_action?(fire_on) },
|
276
|
+
*options[:if]
|
277
|
+
]
|
278
|
+
end
|
298
279
|
end
|
299
|
-
end
|
300
280
|
|
301
|
-
|
302
|
-
|
303
|
-
|
281
|
+
def assert_valid_transaction_action(actions)
|
282
|
+
if (actions - ACTIONS).any?
|
283
|
+
raise ArgumentError, ":on conditions for after_commit and after_rollback callbacks have to be one of #{ACTIONS}"
|
284
|
+
end
|
304
285
|
end
|
305
|
-
end
|
306
286
|
end
|
307
287
|
|
308
288
|
# See ActiveRecord::Transactions::ClassMethods for detailed documentation.
|
309
|
-
def transaction(options
|
310
|
-
self.class.transaction(options, &block)
|
289
|
+
def transaction(**options, &block)
|
290
|
+
self.class.transaction(**options, &block)
|
311
291
|
end
|
312
292
|
|
313
293
|
def destroy #:nodoc:
|
314
294
|
with_transaction_returning_status { super }
|
315
295
|
end
|
316
296
|
|
317
|
-
def save(
|
318
|
-
rollback_active_record_state! do
|
319
|
-
with_transaction_returning_status { super }
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
|
-
def save!(*) #:nodoc:
|
297
|
+
def save(**) #:nodoc:
|
324
298
|
with_transaction_returning_status { super }
|
325
299
|
end
|
326
300
|
|
327
|
-
def
|
301
|
+
def save!(**) #:nodoc:
|
328
302
|
with_transaction_returning_status { super }
|
329
303
|
end
|
330
304
|
|
331
|
-
|
332
|
-
|
333
|
-
remember_transaction_record_state
|
334
|
-
yield
|
335
|
-
rescue Exception
|
336
|
-
restore_transaction_record_state
|
337
|
-
raise
|
338
|
-
ensure
|
339
|
-
clear_transaction_record_state
|
305
|
+
def touch(*, **) #:nodoc:
|
306
|
+
with_transaction_returning_status { super }
|
340
307
|
end
|
341
308
|
|
342
309
|
def before_committed! # :nodoc:
|
343
|
-
_run_before_commit_without_transaction_enrollment_callbacks
|
344
310
|
_run_before_commit_callbacks
|
345
311
|
end
|
346
312
|
|
@@ -349,12 +315,13 @@ module ActiveRecord
|
|
349
315
|
# Ensure that it is not called if the object was never persisted (failed create),
|
350
316
|
# but call it after the commit of a destroyed object.
|
351
317
|
def committed!(should_run_callbacks: true) #:nodoc:
|
352
|
-
|
353
|
-
|
318
|
+
force_clear_transaction_record_state
|
319
|
+
if should_run_callbacks
|
320
|
+
@_committed_already_called = true
|
354
321
|
_run_commit_callbacks
|
355
322
|
end
|
356
323
|
ensure
|
357
|
-
|
324
|
+
@_committed_already_called = @_trigger_update_callback = @_trigger_destroy_callback = false
|
358
325
|
end
|
359
326
|
|
360
327
|
# Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
|
@@ -362,23 +329,11 @@ module ActiveRecord
|
|
362
329
|
def rolledback!(force_restore_state: false, should_run_callbacks: true) #:nodoc:
|
363
330
|
if should_run_callbacks
|
364
331
|
_run_rollback_callbacks
|
365
|
-
_run_rollback_without_transaction_enrollment_callbacks
|
366
332
|
end
|
367
333
|
ensure
|
368
334
|
restore_transaction_record_state(force_restore_state)
|
369
335
|
clear_transaction_record_state
|
370
|
-
|
371
|
-
|
372
|
-
# Add the record to the current transaction so that the #after_rollback and #after_commit callbacks
|
373
|
-
# can be called.
|
374
|
-
def add_to_transaction
|
375
|
-
if has_transactional_callbacks?
|
376
|
-
self.class.connection.add_transaction_record(self)
|
377
|
-
else
|
378
|
-
sync_with_transaction_state
|
379
|
-
set_transaction_state(self.class.connection.transaction_state)
|
380
|
-
end
|
381
|
-
remember_transaction_record_state
|
336
|
+
@_trigger_update_callback = @_trigger_destroy_callback = false if force_restore_state
|
382
337
|
end
|
383
338
|
|
384
339
|
# Executes +method+ within a transaction and captures its return value as a
|
@@ -389,121 +344,103 @@ module ActiveRecord
|
|
389
344
|
# instance.
|
390
345
|
def with_transaction_returning_status
|
391
346
|
status = nil
|
392
|
-
self.class.
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
status = nil
|
399
|
-
end
|
347
|
+
connection = self.class.connection
|
348
|
+
ensure_finalize = !connection.transaction_open?
|
349
|
+
|
350
|
+
connection.transaction do
|
351
|
+
add_to_transaction(ensure_finalize || has_transactional_callbacks?)
|
352
|
+
remember_transaction_record_state
|
400
353
|
|
354
|
+
status = yield
|
401
355
|
raise ActiveRecord::Rollback unless status
|
402
356
|
end
|
403
357
|
status
|
404
|
-
ensure
|
405
|
-
if @transaction_state && @transaction_state.committed?
|
406
|
-
clear_transaction_record_state
|
407
|
-
end
|
408
358
|
end
|
409
359
|
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
def remember_transaction_record_state #:nodoc:
|
414
|
-
@_start_transaction_state[:id] = id
|
415
|
-
@_start_transaction_state.reverse_merge!(
|
416
|
-
new_record: @new_record,
|
417
|
-
destroyed: @destroyed,
|
418
|
-
frozen?: frozen?,
|
419
|
-
)
|
420
|
-
@_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) + 1
|
360
|
+
def trigger_transactional_callbacks? # :nodoc:
|
361
|
+
(@_new_record_before_last_commit || _trigger_update_callback) && persisted? ||
|
362
|
+
_trigger_destroy_callback && destroyed?
|
421
363
|
end
|
422
364
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
365
|
+
private
|
366
|
+
attr_reader :_committed_already_called, :_trigger_update_callback, :_trigger_destroy_callback
|
367
|
+
|
368
|
+
# Save the new record state and id of a record so it can be restored later if a transaction fails.
|
369
|
+
def remember_transaction_record_state
|
370
|
+
@_start_transaction_state ||= {
|
371
|
+
id: id,
|
372
|
+
new_record: @new_record,
|
373
|
+
previously_new_record: @previously_new_record,
|
374
|
+
destroyed: @destroyed,
|
375
|
+
attributes: @attributes,
|
376
|
+
frozen?: frozen?,
|
377
|
+
level: 0
|
378
|
+
}
|
379
|
+
@_start_transaction_state[:level] += 1
|
380
|
+
|
381
|
+
if _committed_already_called
|
382
|
+
@_new_record_before_last_commit = false
|
383
|
+
else
|
384
|
+
@_new_record_before_last_commit = @_start_transaction_state[:new_record]
|
385
|
+
end
|
386
|
+
end
|
428
387
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
388
|
+
# Clear the new record state and id of a record.
|
389
|
+
def clear_transaction_record_state
|
390
|
+
return unless @_start_transaction_state
|
391
|
+
@_start_transaction_state[:level] -= 1
|
392
|
+
force_clear_transaction_record_state if @_start_transaction_state[:level] < 1
|
393
|
+
end
|
394
|
+
|
395
|
+
# Force to clear the transaction record state.
|
396
|
+
def force_clear_transaction_record_state
|
397
|
+
@_start_transaction_state = nil
|
398
|
+
end
|
433
399
|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
400
|
+
# Restore the new record state and id of a record that was previously saved by a call to save_record_state.
|
401
|
+
def restore_transaction_record_state(force_restore_state = false)
|
402
|
+
if restore_state = @_start_transaction_state
|
403
|
+
if force_restore_state || restore_state[:level] <= 1
|
404
|
+
@new_record = restore_state[:new_record]
|
405
|
+
@previously_new_record = restore_state[:previously_new_record]
|
406
|
+
@destroyed = restore_state[:destroyed]
|
407
|
+
@attributes = restore_state[:attributes].map do |attr|
|
408
|
+
value = @attributes.fetch_value(attr.name)
|
409
|
+
attr = attr.with_value_from_user(value) if attr.value != value
|
410
|
+
attr
|
411
|
+
end
|
412
|
+
@mutations_from_database = nil
|
413
|
+
@mutations_before_last_save = nil
|
414
|
+
if @attributes.fetch_value(@primary_key) != restore_state[:id]
|
415
|
+
@attributes.write_from_user(@primary_key, restore_state[:id])
|
416
|
+
end
|
417
|
+
freeze if restore_state[:frozen?]
|
446
418
|
end
|
447
|
-
freeze if restore_state[:frozen?]
|
448
419
|
end
|
449
420
|
end
|
450
|
-
end
|
451
|
-
|
452
|
-
# Determine if a record was created or destroyed in a transaction. State should be one of :new_record or :destroyed.
|
453
|
-
def transaction_record_state(state) #:nodoc:
|
454
|
-
@_start_transaction_state[state]
|
455
|
-
end
|
456
421
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
422
|
+
# Determine if a transaction included an action for :create, :update, or :destroy. Used in filtering callbacks.
|
423
|
+
def transaction_include_any_action?(actions)
|
424
|
+
actions.any? do |action|
|
425
|
+
case action
|
426
|
+
when :create
|
427
|
+
persisted? && @_new_record_before_last_commit
|
428
|
+
when :update
|
429
|
+
!(@_new_record_before_last_commit || destroyed?) && _trigger_update_callback
|
430
|
+
when :destroy
|
431
|
+
_trigger_destroy_callback
|
432
|
+
end
|
467
433
|
end
|
468
434
|
end
|
469
|
-
end
|
470
|
-
|
471
|
-
private
|
472
435
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
!_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
|
479
|
-
end
|
480
|
-
|
481
|
-
# Updates the attributes on this particular Active Record object so that
|
482
|
-
# if it's associated with a transaction, then the state of the Active Record
|
483
|
-
# object will be updated to reflect the current state of the transaction
|
484
|
-
#
|
485
|
-
# The +@transaction_state+ variable stores the states of the associated
|
486
|
-
# transaction. This relies on the fact that a transaction can only be in
|
487
|
-
# one rollback or commit (otherwise a list of states would be required)
|
488
|
-
# Each Active Record object inside of a transaction carries that transaction's
|
489
|
-
# TransactionState.
|
490
|
-
#
|
491
|
-
# This method checks to see if the ActiveRecord object's state reflects
|
492
|
-
# the TransactionState, and rolls back or commits the Active Record object
|
493
|
-
# as appropriate.
|
494
|
-
#
|
495
|
-
# Since Active Record objects can be inside multiple transactions, this
|
496
|
-
# method recursively goes through the parent of the TransactionState and
|
497
|
-
# checks if the Active Record object reflects the state of the object.
|
498
|
-
def sync_with_transaction_state
|
499
|
-
update_attributes_from_transaction_state(@transaction_state)
|
500
|
-
end
|
436
|
+
# Add the record to the current transaction so that the #after_rollback and #after_commit
|
437
|
+
# callbacks can be called.
|
438
|
+
def add_to_transaction(ensure_finalize = true)
|
439
|
+
self.class.connection.add_transaction_record(self, ensure_finalize)
|
440
|
+
end
|
501
441
|
|
502
|
-
|
503
|
-
|
504
|
-
restore_transaction_record_state if transaction_state.rolledback?
|
505
|
-
clear_transaction_record_state
|
442
|
+
def has_transactional_callbacks?
|
443
|
+
!_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
|
506
444
|
end
|
507
|
-
end
|
508
445
|
end
|
509
446
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Translation
|
3
5
|
include ActiveModel::Translation
|
@@ -8,7 +10,7 @@ module ActiveRecord
|
|
8
10
|
classes = [klass]
|
9
11
|
return classes if klass == ActiveRecord::Base
|
10
12
|
|
11
|
-
while klass
|
13
|
+
while !klass.base_class?
|
12
14
|
classes << klass = klass.superclass
|
13
15
|
end
|
14
16
|
classes
|
data/lib/active_record/type.rb
CHANGED
@@ -1,17 +1,22 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require 'active_record/type/internal/timezone'
|
3
|
+
require "active_model/type"
|
5
4
|
|
6
|
-
require
|
7
|
-
require 'active_record/type/date_time'
|
8
|
-
require 'active_record/type/time'
|
5
|
+
require "active_record/type/internal/timezone"
|
9
6
|
|
10
|
-
require
|
11
|
-
require
|
7
|
+
require "active_record/type/date"
|
8
|
+
require "active_record/type/date_time"
|
9
|
+
require "active_record/type/decimal_without_scale"
|
10
|
+
require "active_record/type/json"
|
11
|
+
require "active_record/type/time"
|
12
|
+
require "active_record/type/text"
|
13
|
+
require "active_record/type/unsigned_integer"
|
12
14
|
|
13
|
-
require
|
14
|
-
require
|
15
|
+
require "active_record/type/serialized"
|
16
|
+
require "active_record/type/adapter_specific_registry"
|
17
|
+
|
18
|
+
require "active_record/type/type_map"
|
19
|
+
require "active_record/type/hash_lookup_type_map"
|
15
20
|
|
16
21
|
module ActiveRecord
|
17
22
|
module Type
|
@@ -37,24 +42,29 @@ module ActiveRecord
|
|
37
42
|
registry.lookup(*args, adapter: adapter, **kwargs)
|
38
43
|
end
|
39
44
|
|
40
|
-
|
45
|
+
def default_value # :nodoc:
|
46
|
+
@default_value ||= Value.new
|
47
|
+
end
|
41
48
|
|
42
|
-
def
|
43
|
-
|
49
|
+
def adapter_name_from(model) # :nodoc:
|
50
|
+
# TODO: this shouldn't depend on a connection to the database
|
51
|
+
model.connection.adapter_name.downcase.to_sym
|
44
52
|
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def current_adapter_name
|
56
|
+
adapter_name_from(ActiveRecord::Base)
|
57
|
+
end
|
45
58
|
end
|
46
59
|
|
47
|
-
Helpers = ActiveModel::Type::Helpers
|
48
60
|
BigInteger = ActiveModel::Type::BigInteger
|
49
61
|
Binary = ActiveModel::Type::Binary
|
50
62
|
Boolean = ActiveModel::Type::Boolean
|
51
63
|
Decimal = ActiveModel::Type::Decimal
|
52
|
-
DecimalWithoutScale = ActiveModel::Type::DecimalWithoutScale
|
53
64
|
Float = ActiveModel::Type::Float
|
54
65
|
Integer = ActiveModel::Type::Integer
|
66
|
+
ImmutableString = ActiveModel::Type::ImmutableString
|
55
67
|
String = ActiveModel::Type::String
|
56
|
-
Text = ActiveModel::Type::Text
|
57
|
-
UnsignedInteger = ActiveModel::Type::UnsignedInteger
|
58
68
|
Value = ActiveModel::Type::Value
|
59
69
|
|
60
70
|
register(:big_integer, Type::BigInteger, override: false)
|
@@ -65,6 +75,8 @@ module ActiveRecord
|
|
65
75
|
register(:decimal, Type::Decimal, override: false)
|
66
76
|
register(:float, Type::Float, override: false)
|
67
77
|
register(:integer, Type::Integer, override: false)
|
78
|
+
register(:immutable_string, Type::ImmutableString, override: false)
|
79
|
+
register(:json, Type::Json, override: false)
|
68
80
|
register(:string, Type::String, override: false)
|
69
81
|
register(:text, Type::Text, override: false)
|
70
82
|
register(:time, Type::Time, override: false)
|