activerecord 4.2.9 → 6.1.4.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 +5 -5
- data/CHANGELOG.md +964 -1382
- data/MIT-LICENSE +4 -2
- data/README.rdoc +15 -14
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/aggregations.rb +266 -251
- data/lib/active_record/association_relation.rb +40 -15
- data/lib/active_record/associations/alias_tracker.rb +40 -43
- data/lib/active_record/associations/association.rb +162 -69
- data/lib/active_record/associations/association_scope.rb +105 -130
- data/lib/active_record/associations/belongs_to_association.rb +83 -65
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +57 -43
- data/lib/active_record/associations/builder/belongs_to.rb +74 -57
- data/lib/active_record/associations/builder/collection_association.rb +15 -37
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +49 -66
- data/lib/active_record/associations/builder/has_many.rb +13 -5
- data/lib/active_record/associations/builder/has_one.rb +44 -6
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +148 -287
- data/lib/active_record/associations/collection_proxy.rb +252 -150
- data/lib/active_record/associations/foreign_association.rb +23 -1
- data/lib/active_record/associations/has_many_association.rb +56 -98
- data/lib/active_record/associations/has_many_through_association.rb +68 -89
- data/lib/active_record/associations/has_one_association.rb +73 -47
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +54 -81
- 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 +174 -169
- data/lib/active_record/associations/preloader/association.rb +108 -115
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +97 -94
- data/lib/active_record/associations/singular_association.rb +18 -39
- data/lib/active_record/associations/through_association.rb +39 -19
- data/lib/active_record/associations.rb +1845 -1598
- data/lib/active_record/attribute_assignment.rb +59 -185
- data/lib/active_record/attribute_methods/before_type_cast.rb +18 -10
- data/lib/active_record/attribute_methods/dirty.rb +168 -148
- data/lib/active_record/attribute_methods/primary_key.rb +93 -83
- data/lib/active_record/attribute_methods/query.rb +8 -10
- data/lib/active_record/attribute_methods/read.rb +19 -79
- data/lib/active_record/attribute_methods/serialization.rb +49 -24
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +55 -36
- data/lib/active_record/attribute_methods/write.rb +24 -55
- data/lib/active_record/attribute_methods.rb +149 -154
- data/lib/active_record/attributes.rb +234 -78
- data/lib/active_record/autosave_association.rb +133 -60
- data/lib/active_record/base.rb +46 -46
- data/lib/active_record/callbacks.rb +234 -79
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +292 -124
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +177 -60
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +8 -6
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +473 -255
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +869 -286
- data/lib/active_record/connection_adapters/abstract/transaction.rb +257 -91
- data/lib/active_record/connection_adapters/abstract_adapter.rb +483 -230
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +557 -640
- data/lib/active_record/connection_adapters/column.rb +67 -40
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +194 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +80 -192
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +75 -160
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +8 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -19
- 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 +31 -20
- 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 -9
- data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
- 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 +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +25 -25
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +145 -48
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +496 -298
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +588 -375
- data/lib/active_record/connection_adapters/schema_cache.rb +167 -29
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +21 -0
- 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 +322 -373
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_adapters.rb +52 -0
- data/lib/active_record/connection_handling.rb +314 -41
- data/lib/active_record/core.rb +458 -241
- data/lib/active_record/counter_cache.rb +70 -49
- 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/database_configurations.rb +272 -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 -106
- data/lib/active_record/enum.rb +211 -92
- data/lib/active_record/errors.rb +224 -54
- data/lib/active_record/explain.rb +27 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +10 -5
- data/lib/active_record/fixture_set/file.rb +33 -14
- 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 +275 -500
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +175 -110
- data/lib/active_record/insert_all.rb +212 -0
- data/lib/active_record/integration.rb +121 -29
- data/lib/active_record/internal_metadata.rb +62 -0
- data/lib/active_record/legacy_yaml_adapter.rb +27 -5
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +98 -92
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +93 -31
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +185 -90
- data/lib/active_record/migration/compatibility.rb +295 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +673 -325
- data/lib/active_record/model_schema.rb +418 -113
- data/lib/active_record/nested_attributes.rb +263 -224
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +572 -136
- data/lib/active_record/query_cache.rb +29 -23
- data/lib/active_record/querying.rb +50 -31
- data/lib/active_record/railtie.rb +170 -51
- data/lib/active_record/railties/console_sandbox.rb +3 -3
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +523 -199
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +454 -291
- data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
- data/lib/active_record/relation/batches.rb +217 -59
- data/lib/active_record/relation/calculations.rb +324 -249
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +316 -242
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +95 -103
- data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -26
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/predicate_builder.rb +136 -122
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +757 -413
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +18 -20
- data/lib/active_record/relation/where_clause.rb +239 -0
- data/lib/active_record/relation.rb +554 -343
- data/lib/active_record/result.rb +91 -47
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +134 -122
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +141 -92
- data/lib/active_record/schema_migration.rb +24 -23
- data/lib/active_record/scoping/default.rb +96 -83
- data/lib/active_record/scoping/named.rb +78 -36
- data/lib/active_record/scoping.rb +45 -27
- data/lib/active_record/secure_token.rb +48 -0
- data/lib/active_record/serialization.rb +8 -6
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +89 -36
- data/lib/active_record/store.rb +128 -43
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +81 -0
- data/lib/active_record/tasks/database_tasks.rb +364 -130
- data/lib/active_record/tasks/mysql_database_tasks.rb +67 -113
- data/lib/active_record/tasks/postgresql_database_tasks.rb +86 -49
- data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +287 -0
- data/lib/active_record/timestamp.rb +86 -43
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +182 -163
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +126 -0
- data/lib/active_record/type/date.rb +4 -45
- data/lib/active_record/type/date_time.rb +4 -49
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +27 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +21 -16
- data/lib/active_record/type/type_map.rb +16 -19
- data/lib/active_record/type/unsigned_integer.rb +9 -8
- data/lib/active_record/type.rb +84 -23
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +12 -4
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +63 -56
- data/lib/active_record/validations.rb +39 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +42 -29
- 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/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 +76 -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/nodes.rb +70 -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/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/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -4
- data/lib/rails/generators/active_record/migration.rb +35 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
- 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.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +172 -65
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- 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 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -163
- data/lib/active_record/attribute_decorators.rb +0 -66
- data/lib/active_record/attribute_set/builder.rb +0 -106
- data/lib/active_record/attribute_set.rb +0 -81
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -275
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -110
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,163 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
class Attribute # :nodoc:
|
3
|
-
class << self
|
4
|
-
def from_database(name, value, type)
|
5
|
-
FromDatabase.new(name, value, type)
|
6
|
-
end
|
7
|
-
|
8
|
-
def from_user(name, value, type)
|
9
|
-
FromUser.new(name, value, type)
|
10
|
-
end
|
11
|
-
|
12
|
-
def with_cast_value(name, value, type)
|
13
|
-
WithCastValue.new(name, value, type)
|
14
|
-
end
|
15
|
-
|
16
|
-
def null(name)
|
17
|
-
Null.new(name)
|
18
|
-
end
|
19
|
-
|
20
|
-
def uninitialized(name, type)
|
21
|
-
Uninitialized.new(name, type)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
attr_reader :name, :value_before_type_cast, :type
|
26
|
-
|
27
|
-
# This method should not be called directly.
|
28
|
-
# Use #from_database or #from_user
|
29
|
-
def initialize(name, value_before_type_cast, type)
|
30
|
-
@name = name
|
31
|
-
@value_before_type_cast = value_before_type_cast
|
32
|
-
@type = type
|
33
|
-
end
|
34
|
-
|
35
|
-
def value
|
36
|
-
# `defined?` is cheaper than `||=` when we get back falsy values
|
37
|
-
@value = original_value unless defined?(@value)
|
38
|
-
@value
|
39
|
-
end
|
40
|
-
|
41
|
-
def original_value
|
42
|
-
type_cast(value_before_type_cast)
|
43
|
-
end
|
44
|
-
|
45
|
-
def value_for_database
|
46
|
-
type.type_cast_for_database(value)
|
47
|
-
end
|
48
|
-
|
49
|
-
def changed_from?(old_value)
|
50
|
-
type.changed?(old_value, value, value_before_type_cast)
|
51
|
-
end
|
52
|
-
|
53
|
-
def changed_in_place_from?(old_value)
|
54
|
-
has_been_read? && type.changed_in_place?(old_value, value)
|
55
|
-
end
|
56
|
-
|
57
|
-
def with_value_from_user(value)
|
58
|
-
self.class.from_user(name, value, type)
|
59
|
-
end
|
60
|
-
|
61
|
-
def with_value_from_database(value)
|
62
|
-
self.class.from_database(name, value, type)
|
63
|
-
end
|
64
|
-
|
65
|
-
def with_cast_value(value)
|
66
|
-
self.class.with_cast_value(name, value, type)
|
67
|
-
end
|
68
|
-
|
69
|
-
def type_cast(*)
|
70
|
-
raise NotImplementedError
|
71
|
-
end
|
72
|
-
|
73
|
-
def initialized?
|
74
|
-
true
|
75
|
-
end
|
76
|
-
|
77
|
-
def came_from_user?
|
78
|
-
false
|
79
|
-
end
|
80
|
-
|
81
|
-
def ==(other)
|
82
|
-
self.class == other.class &&
|
83
|
-
name == other.name &&
|
84
|
-
value_before_type_cast == other.value_before_type_cast &&
|
85
|
-
type == other.type
|
86
|
-
end
|
87
|
-
|
88
|
-
protected
|
89
|
-
|
90
|
-
def initialize_dup(other)
|
91
|
-
if defined?(@value) && @value.duplicable?
|
92
|
-
@value = @value.dup
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def has_been_read?
|
99
|
-
defined?(@value)
|
100
|
-
end
|
101
|
-
|
102
|
-
class FromDatabase < Attribute # :nodoc:
|
103
|
-
def type_cast(value)
|
104
|
-
type.type_cast_from_database(value)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
class FromUser < Attribute # :nodoc:
|
109
|
-
def type_cast(value)
|
110
|
-
type.type_cast_from_user(value)
|
111
|
-
end
|
112
|
-
|
113
|
-
def came_from_user?
|
114
|
-
true
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class WithCastValue < Attribute # :nodoc:
|
119
|
-
def type_cast(value)
|
120
|
-
value
|
121
|
-
end
|
122
|
-
|
123
|
-
def changed_in_place_from?(old_value)
|
124
|
-
false
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
class Null < Attribute # :nodoc:
|
129
|
-
def initialize(name)
|
130
|
-
super(name, nil, Type::Value.new)
|
131
|
-
end
|
132
|
-
|
133
|
-
def value
|
134
|
-
nil
|
135
|
-
end
|
136
|
-
|
137
|
-
def with_value_from_database(value)
|
138
|
-
raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{name}`"
|
139
|
-
end
|
140
|
-
alias_method :with_value_from_user, :with_value_from_database
|
141
|
-
end
|
142
|
-
|
143
|
-
class Uninitialized < Attribute # :nodoc:
|
144
|
-
def initialize(name, type)
|
145
|
-
super(name, nil, type)
|
146
|
-
end
|
147
|
-
|
148
|
-
def value
|
149
|
-
if block_given?
|
150
|
-
yield name
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def value_for_database
|
155
|
-
end
|
156
|
-
|
157
|
-
def initialized?
|
158
|
-
false
|
159
|
-
end
|
160
|
-
end
|
161
|
-
private_constant :FromDatabase, :FromUser, :Null, :Uninitialized
|
162
|
-
end
|
163
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module AttributeDecorators # :nodoc:
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
class_attribute :attribute_type_decorations, instance_accessor: false # :internal:
|
7
|
-
self.attribute_type_decorations = TypeDecorator.new
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods # :nodoc:
|
11
|
-
def decorate_attribute_type(column_name, decorator_name, &block)
|
12
|
-
matcher = ->(name, _) { name == column_name.to_s }
|
13
|
-
key = "_#{column_name}_#{decorator_name}"
|
14
|
-
decorate_matching_attribute_types(matcher, key, &block)
|
15
|
-
end
|
16
|
-
|
17
|
-
def decorate_matching_attribute_types(matcher, decorator_name, &block)
|
18
|
-
clear_caches_calculated_from_columns
|
19
|
-
decorator_name = decorator_name.to_s
|
20
|
-
|
21
|
-
# Create new hashes so we don't modify parent classes
|
22
|
-
self.attribute_type_decorations = attribute_type_decorations.merge(decorator_name => [matcher, block])
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def add_user_provided_columns(*)
|
28
|
-
super.map do |column|
|
29
|
-
decorated_type = attribute_type_decorations.apply(column.name, column.cast_type)
|
30
|
-
column.with_type(decorated_type)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class TypeDecorator # :nodoc:
|
36
|
-
delegate :clear, to: :@decorations
|
37
|
-
|
38
|
-
def initialize(decorations = {})
|
39
|
-
@decorations = decorations
|
40
|
-
end
|
41
|
-
|
42
|
-
def merge(*args)
|
43
|
-
TypeDecorator.new(@decorations.merge(*args))
|
44
|
-
end
|
45
|
-
|
46
|
-
def apply(name, type)
|
47
|
-
decorations = decorators_for(name, type)
|
48
|
-
decorations.inject(type) do |new_type, block|
|
49
|
-
block.call(new_type)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def decorators_for(name, type)
|
56
|
-
matching(name, type).map(&:last)
|
57
|
-
end
|
58
|
-
|
59
|
-
def matching(name, type)
|
60
|
-
@decorations.values.select do |(matcher, _)|
|
61
|
-
matcher.call(name, type)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'active_record/attribute'
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class AttributeSet # :nodoc:
|
5
|
-
class Builder # :nodoc:
|
6
|
-
attr_reader :types, :always_initialized
|
7
|
-
|
8
|
-
def initialize(types, always_initialized = nil)
|
9
|
-
@types = types
|
10
|
-
@always_initialized = always_initialized
|
11
|
-
end
|
12
|
-
|
13
|
-
def build_from_database(values = {}, additional_types = {})
|
14
|
-
if always_initialized && !values.key?(always_initialized)
|
15
|
-
values[always_initialized] = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
attributes = LazyAttributeHash.new(types, values, additional_types)
|
19
|
-
AttributeSet.new(attributes)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class LazyAttributeHash # :nodoc:
|
25
|
-
delegate :transform_values, to: :materialize
|
26
|
-
|
27
|
-
def initialize(types, values, additional_types)
|
28
|
-
@types = types
|
29
|
-
@values = values
|
30
|
-
@additional_types = additional_types
|
31
|
-
@materialized = false
|
32
|
-
@delegate_hash = {}
|
33
|
-
end
|
34
|
-
|
35
|
-
def key?(key)
|
36
|
-
delegate_hash.key?(key) || values.key?(key) || types.key?(key)
|
37
|
-
end
|
38
|
-
|
39
|
-
def [](key)
|
40
|
-
delegate_hash[key] || assign_default_value(key)
|
41
|
-
end
|
42
|
-
|
43
|
-
def []=(key, value)
|
44
|
-
if frozen?
|
45
|
-
raise RuntimeError, "Can't modify frozen hash"
|
46
|
-
end
|
47
|
-
delegate_hash[key] = value
|
48
|
-
end
|
49
|
-
|
50
|
-
def initialized_keys
|
51
|
-
delegate_hash.keys | values.keys
|
52
|
-
end
|
53
|
-
|
54
|
-
def initialize_dup(_)
|
55
|
-
@delegate_hash = delegate_hash.transform_values(&:dup)
|
56
|
-
super
|
57
|
-
end
|
58
|
-
|
59
|
-
def select
|
60
|
-
keys = types.keys | values.keys | delegate_hash.keys
|
61
|
-
keys.each_with_object({}) do |key, hash|
|
62
|
-
attribute = self[key]
|
63
|
-
if yield(key, attribute)
|
64
|
-
hash[key] = attribute
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def ==(other)
|
70
|
-
if other.is_a?(LazyAttributeHash)
|
71
|
-
materialize == other.materialize
|
72
|
-
else
|
73
|
-
materialize == other
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
protected
|
78
|
-
|
79
|
-
attr_reader :types, :values, :additional_types, :delegate_hash
|
80
|
-
|
81
|
-
def materialize
|
82
|
-
unless @materialized
|
83
|
-
values.each_key { |key| self[key] }
|
84
|
-
types.each_key { |key| self[key] }
|
85
|
-
unless frozen?
|
86
|
-
@materialized = true
|
87
|
-
end
|
88
|
-
end
|
89
|
-
delegate_hash
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
def assign_default_value(name)
|
95
|
-
type = additional_types.fetch(name, types[name])
|
96
|
-
value_present = true
|
97
|
-
value = values.fetch(name) { value_present = false }
|
98
|
-
|
99
|
-
if value_present
|
100
|
-
delegate_hash[name] = Attribute.from_database(name, value, type)
|
101
|
-
elsif types.key?(name)
|
102
|
-
delegate_hash[name] = Attribute.uninitialized(name, type)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'active_record/attribute_set/builder'
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class AttributeSet # :nodoc:
|
5
|
-
def initialize(attributes)
|
6
|
-
@attributes = attributes
|
7
|
-
end
|
8
|
-
|
9
|
-
def [](name)
|
10
|
-
attributes[name] || Attribute.null(name)
|
11
|
-
end
|
12
|
-
|
13
|
-
def values_before_type_cast
|
14
|
-
attributes.transform_values(&:value_before_type_cast)
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_hash
|
18
|
-
initialized_attributes.transform_values(&:value)
|
19
|
-
end
|
20
|
-
alias_method :to_h, :to_hash
|
21
|
-
|
22
|
-
def key?(name)
|
23
|
-
attributes.key?(name) && self[name].initialized?
|
24
|
-
end
|
25
|
-
|
26
|
-
def keys
|
27
|
-
attributes.initialized_keys
|
28
|
-
end
|
29
|
-
|
30
|
-
def fetch_value(name)
|
31
|
-
self[name].value { |n| yield n if block_given? }
|
32
|
-
end
|
33
|
-
|
34
|
-
def write_from_database(name, value)
|
35
|
-
attributes[name] = self[name].with_value_from_database(value)
|
36
|
-
end
|
37
|
-
|
38
|
-
def write_from_user(name, value)
|
39
|
-
attributes[name] = self[name].with_value_from_user(value)
|
40
|
-
end
|
41
|
-
|
42
|
-
def write_cast_value(name, value)
|
43
|
-
attributes[name] = self[name].with_cast_value(value)
|
44
|
-
end
|
45
|
-
|
46
|
-
def freeze
|
47
|
-
@attributes.freeze
|
48
|
-
super
|
49
|
-
end
|
50
|
-
|
51
|
-
def initialize_dup(_)
|
52
|
-
@attributes = attributes.dup
|
53
|
-
super
|
54
|
-
end
|
55
|
-
|
56
|
-
def initialize_clone(_)
|
57
|
-
@attributes = attributes.clone
|
58
|
-
super
|
59
|
-
end
|
60
|
-
|
61
|
-
def reset(key)
|
62
|
-
if key?(key)
|
63
|
-
write_from_database(key, nil)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def ==(other)
|
68
|
-
attributes == other.attributes
|
69
|
-
end
|
70
|
-
|
71
|
-
protected
|
72
|
-
|
73
|
-
attr_reader :attributes
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def initialized_attributes
|
78
|
-
attributes.select { |_, attr| attr.initialized? }
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,275 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'active_support/core_ext/string/filters'
|
3
|
-
|
4
|
-
module ActiveRecord
|
5
|
-
module ConnectionAdapters
|
6
|
-
class ConnectionSpecification #:nodoc:
|
7
|
-
attr_reader :config, :adapter_method
|
8
|
-
|
9
|
-
def initialize(config, adapter_method)
|
10
|
-
@config, @adapter_method = config, adapter_method
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize_dup(original)
|
14
|
-
@config = original.config.dup
|
15
|
-
end
|
16
|
-
|
17
|
-
# Expands a connection string into a hash.
|
18
|
-
class ConnectionUrlResolver # :nodoc:
|
19
|
-
|
20
|
-
# == Example
|
21
|
-
#
|
22
|
-
# url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
|
23
|
-
# ConnectionUrlResolver.new(url).to_hash
|
24
|
-
# # => {
|
25
|
-
# "adapter" => "postgresql",
|
26
|
-
# "host" => "localhost",
|
27
|
-
# "port" => 9000,
|
28
|
-
# "database" => "foo_test",
|
29
|
-
# "username" => "foo",
|
30
|
-
# "password" => "bar",
|
31
|
-
# "pool" => "5",
|
32
|
-
# "timeout" => "3000"
|
33
|
-
# }
|
34
|
-
def initialize(url)
|
35
|
-
raise "Database URL cannot be empty" if url.blank?
|
36
|
-
@uri = uri_parser.parse(url)
|
37
|
-
@adapter = @uri.scheme.tr('-', '_')
|
38
|
-
@adapter = "postgresql" if @adapter == "postgres"
|
39
|
-
|
40
|
-
if @uri.opaque
|
41
|
-
@uri.opaque, @query = @uri.opaque.split('?', 2)
|
42
|
-
else
|
43
|
-
@query = @uri.query
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Converts the given URL to a full connection hash.
|
48
|
-
def to_hash
|
49
|
-
config = raw_config.reject { |_,value| value.blank? }
|
50
|
-
config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String }
|
51
|
-
config
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def uri
|
57
|
-
@uri
|
58
|
-
end
|
59
|
-
|
60
|
-
def uri_parser
|
61
|
-
@uri_parser ||= URI::Parser.new
|
62
|
-
end
|
63
|
-
|
64
|
-
# Converts the query parameters of the URI into a hash.
|
65
|
-
#
|
66
|
-
# "localhost?pool=5&reaping_frequency=2"
|
67
|
-
# # => { "pool" => "5", "reaping_frequency" => "2" }
|
68
|
-
#
|
69
|
-
# returns empty hash if no query present.
|
70
|
-
#
|
71
|
-
# "localhost"
|
72
|
-
# # => {}
|
73
|
-
def query_hash
|
74
|
-
Hash[(@query || '').split("&").map { |pair| pair.split("=") }]
|
75
|
-
end
|
76
|
-
|
77
|
-
def raw_config
|
78
|
-
if uri.opaque
|
79
|
-
query_hash.merge({
|
80
|
-
"adapter" => @adapter,
|
81
|
-
"database" => uri.opaque })
|
82
|
-
else
|
83
|
-
query_hash.merge({
|
84
|
-
"adapter" => @adapter,
|
85
|
-
"username" => uri.user,
|
86
|
-
"password" => uri.password,
|
87
|
-
"port" => uri.port,
|
88
|
-
"database" => database_from_path,
|
89
|
-
"host" => uri.hostname })
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# Returns name of the database.
|
94
|
-
def database_from_path
|
95
|
-
if @adapter == 'sqlite3'
|
96
|
-
# 'sqlite3:/foo' is absolute, because that makes sense. The
|
97
|
-
# corresponding relative version, 'sqlite3:foo', is handled
|
98
|
-
# elsewhere, as an "opaque".
|
99
|
-
|
100
|
-
uri.path
|
101
|
-
else
|
102
|
-
# Only SQLite uses a filename as the "database" name; for
|
103
|
-
# anything else, a leading slash would be silly.
|
104
|
-
|
105
|
-
uri.path.sub(%r{^/}, "")
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
##
|
111
|
-
# Builds a ConnectionSpecification from user input.
|
112
|
-
class Resolver # :nodoc:
|
113
|
-
attr_reader :configurations
|
114
|
-
|
115
|
-
# Accepts a hash two layers deep, keys on the first layer represent
|
116
|
-
# environments such as "production". Keys must be strings.
|
117
|
-
def initialize(configurations)
|
118
|
-
@configurations = configurations
|
119
|
-
end
|
120
|
-
|
121
|
-
# Returns a hash with database connection information.
|
122
|
-
#
|
123
|
-
# == Examples
|
124
|
-
#
|
125
|
-
# Full hash Configuration.
|
126
|
-
#
|
127
|
-
# configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
|
128
|
-
# Resolver.new(configurations).resolve(:production)
|
129
|
-
# # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
|
130
|
-
#
|
131
|
-
# Initialized with URL configuration strings.
|
132
|
-
#
|
133
|
-
# configurations = { "production" => "postgresql://localhost/foo" }
|
134
|
-
# Resolver.new(configurations).resolve(:production)
|
135
|
-
# # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
|
136
|
-
#
|
137
|
-
def resolve(config)
|
138
|
-
if config
|
139
|
-
resolve_connection config
|
140
|
-
elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
|
141
|
-
resolve_symbol_connection env.to_sym
|
142
|
-
else
|
143
|
-
raise AdapterNotSpecified
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
# Expands each key in @configurations hash into fully resolved hash
|
148
|
-
def resolve_all
|
149
|
-
config = configurations.dup
|
150
|
-
config.each do |key, value|
|
151
|
-
config[key] = resolve(value) if value
|
152
|
-
end
|
153
|
-
config
|
154
|
-
end
|
155
|
-
|
156
|
-
# Returns an instance of ConnectionSpecification for a given adapter.
|
157
|
-
# Accepts a hash one layer deep that contains all connection information.
|
158
|
-
#
|
159
|
-
# == Example
|
160
|
-
#
|
161
|
-
# config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
|
162
|
-
# spec = Resolver.new(config).spec(:production)
|
163
|
-
# spec.adapter_method
|
164
|
-
# # => "sqlite3_connection"
|
165
|
-
# spec.config
|
166
|
-
# # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
|
167
|
-
#
|
168
|
-
def spec(config)
|
169
|
-
spec = resolve(config).symbolize_keys
|
170
|
-
|
171
|
-
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
|
172
|
-
|
173
|
-
path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
|
174
|
-
begin
|
175
|
-
require path_to_adapter
|
176
|
-
rescue Gem::LoadError => e
|
177
|
-
raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
|
178
|
-
rescue LoadError => e
|
179
|
-
raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
|
180
|
-
end
|
181
|
-
|
182
|
-
adapter_method = "#{spec[:adapter]}_connection"
|
183
|
-
ConnectionSpecification.new(spec, adapter_method)
|
184
|
-
end
|
185
|
-
|
186
|
-
private
|
187
|
-
|
188
|
-
# Returns fully resolved connection, accepts hash, string or symbol.
|
189
|
-
# Always returns a hash.
|
190
|
-
#
|
191
|
-
# == Examples
|
192
|
-
#
|
193
|
-
# Symbol representing current environment.
|
194
|
-
#
|
195
|
-
# Resolver.new("production" => {}).resolve_connection(:production)
|
196
|
-
# # => {}
|
197
|
-
#
|
198
|
-
# One layer deep hash of connection values.
|
199
|
-
#
|
200
|
-
# Resolver.new({}).resolve_connection("adapter" => "sqlite3")
|
201
|
-
# # => { "adapter" => "sqlite3" }
|
202
|
-
#
|
203
|
-
# Connection URL.
|
204
|
-
#
|
205
|
-
# Resolver.new({}).resolve_connection("postgresql://localhost/foo")
|
206
|
-
# # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
|
207
|
-
#
|
208
|
-
def resolve_connection(spec)
|
209
|
-
case spec
|
210
|
-
when Symbol
|
211
|
-
resolve_symbol_connection spec
|
212
|
-
when String
|
213
|
-
resolve_string_connection spec
|
214
|
-
when Hash
|
215
|
-
resolve_hash_connection spec
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
def resolve_string_connection(spec)
|
220
|
-
# Rails has historically accepted a string to mean either
|
221
|
-
# an environment key or a URL spec, so we have deprecated
|
222
|
-
# this ambiguous behaviour and in the future this function
|
223
|
-
# can be removed in favor of resolve_url_connection.
|
224
|
-
if configurations.key?(spec) || spec !~ /:/
|
225
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
226
|
-
Passing a string to ActiveRecord::Base.establish_connection for a
|
227
|
-
configuration lookup is deprecated, please pass a symbol
|
228
|
-
(#{spec.to_sym.inspect}) instead.
|
229
|
-
MSG
|
230
|
-
|
231
|
-
resolve_symbol_connection(spec)
|
232
|
-
else
|
233
|
-
resolve_url_connection(spec)
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
# Takes the environment such as +:production+ or +:development+.
|
238
|
-
# This requires that the @configurations was initialized with a key that
|
239
|
-
# matches.
|
240
|
-
#
|
241
|
-
# Resolver.new("production" => {}).resolve_symbol_connection(:production)
|
242
|
-
# # => {}
|
243
|
-
#
|
244
|
-
def resolve_symbol_connection(spec)
|
245
|
-
if config = configurations[spec.to_s]
|
246
|
-
resolve_connection(config)
|
247
|
-
else
|
248
|
-
raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}")
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
# Accepts a hash. Expands the "url" key that contains a
|
253
|
-
# URL database connection to a full connection
|
254
|
-
# hash and merges with the rest of the hash.
|
255
|
-
# Connection details inside of the "url" key win any merge conflicts
|
256
|
-
def resolve_hash_connection(spec)
|
257
|
-
if spec["url"] && spec["url"] !~ /^jdbc:/
|
258
|
-
connection_hash = resolve_url_connection(spec.delete("url"))
|
259
|
-
spec.merge!(connection_hash)
|
260
|
-
end
|
261
|
-
spec
|
262
|
-
end
|
263
|
-
|
264
|
-
# Takes a connection URL.
|
265
|
-
#
|
266
|
-
# Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
|
267
|
-
# # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
|
268
|
-
#
|
269
|
-
def resolve_url_connection(url)
|
270
|
-
ConnectionUrlResolver.new(url).to_hash
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|