activerecord 5.0.7.2 → 6.0.6.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 +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,11 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "set"
|
4
|
+
require "active_record/connection_adapters/determine_if_preparable_visitor"
|
5
|
+
require "active_record/connection_adapters/schema_cache"
|
6
|
+
require "active_record/connection_adapters/sql_type_metadata"
|
7
|
+
require "active_record/connection_adapters/abstract/schema_dumper"
|
8
|
+
require "active_record/connection_adapters/abstract/schema_creation"
|
9
|
+
require "active_support/concurrency/load_interlock_aware_monitor"
|
10
|
+
require "active_support/deprecation"
|
11
|
+
require "arel/collectors/bind"
|
12
|
+
require "arel/collectors/composite"
|
13
|
+
require "arel/collectors/sql_string"
|
14
|
+
require "arel/collectors/substitute_binds"
|
9
15
|
|
10
16
|
module ActiveRecord
|
11
17
|
module ConnectionAdapters # :nodoc:
|
@@ -14,7 +20,7 @@ module ActiveRecord
|
|
14
20
|
autoload :Column
|
15
21
|
autoload :ConnectionSpecification
|
16
22
|
|
17
|
-
autoload_at
|
23
|
+
autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
|
18
24
|
autoload :IndexDefinition
|
19
25
|
autoload :ColumnDefinition
|
20
26
|
autoload :ChangeColumnDefinition
|
@@ -25,11 +31,11 @@ module ActiveRecord
|
|
25
31
|
autoload :ReferenceDefinition
|
26
32
|
end
|
27
33
|
|
28
|
-
autoload_at
|
34
|
+
autoload_at "active_record/connection_adapters/abstract/connection_pool" do
|
29
35
|
autoload :ConnectionHandler
|
30
36
|
end
|
31
37
|
|
32
|
-
autoload_under
|
38
|
+
autoload_under "abstract" do
|
33
39
|
autoload :SchemaStatements
|
34
40
|
autoload :DatabaseStatements
|
35
41
|
autoload :DatabaseLimits
|
@@ -39,7 +45,7 @@ module ActiveRecord
|
|
39
45
|
autoload :Savepoints
|
40
46
|
end
|
41
47
|
|
42
|
-
autoload_at
|
48
|
+
autoload_at "active_record/connection_adapters/abstract/transaction" do
|
43
49
|
autoload :TransactionManager
|
44
50
|
autoload :NullTransaction
|
45
51
|
autoload :RealTransaction
|
@@ -61,24 +67,28 @@ module ActiveRecord
|
|
61
67
|
# Most of the methods in the adapter are useful during migrations. Most
|
62
68
|
# notably, the instance methods provided by SchemaStatements are very useful.
|
63
69
|
class AbstractAdapter
|
64
|
-
ADAPTER_NAME = "Abstract"
|
70
|
+
ADAPTER_NAME = "Abstract"
|
65
71
|
include ActiveSupport::Callbacks
|
66
72
|
define_callbacks :checkout, :checkin
|
67
73
|
|
68
74
|
include Quoting, DatabaseStatements, SchemaStatements
|
69
75
|
include DatabaseLimits
|
70
76
|
include QueryCache
|
71
|
-
include ColumnDumper
|
72
77
|
include Savepoints
|
73
78
|
|
74
79
|
SIMPLE_INT = /\A\d+\z/
|
80
|
+
COMMENT_REGEX = %r{/\*(?:[^\*]|\*[^/])*\*/}m
|
75
81
|
|
76
|
-
attr_accessor :
|
77
|
-
attr_reader :
|
82
|
+
attr_accessor :pool
|
83
|
+
attr_reader :visitor, :owner, :logger, :lock
|
78
84
|
alias :in_use? :owner
|
79
85
|
|
86
|
+
set_callback :checkin, :after, :enable_lazy_transactions!
|
87
|
+
|
80
88
|
def self.type_cast_config_to_integer(config)
|
81
|
-
if config
|
89
|
+
if config.is_a?(Integer)
|
90
|
+
config
|
91
|
+
elsif SIMPLE_INT.match?(config)
|
82
92
|
config.to_i
|
83
93
|
else
|
84
94
|
config
|
@@ -93,7 +103,22 @@ module ActiveRecord
|
|
93
103
|
end
|
94
104
|
end
|
95
105
|
|
96
|
-
|
106
|
+
DEFAULT_READ_QUERY = [:begin, :commit, :explain, :release, :rollback, :savepoint, :select, :with] # :nodoc:
|
107
|
+
private_constant :DEFAULT_READ_QUERY
|
108
|
+
|
109
|
+
def self.build_read_query_regexp(*parts) # :nodoc:
|
110
|
+
parts += DEFAULT_READ_QUERY
|
111
|
+
parts = parts.map { |part| /#{part}/i }
|
112
|
+
/\A(?:[\(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.quoted_column_names # :nodoc:
|
116
|
+
@quoted_column_names ||= {}
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.quoted_table_names # :nodoc:
|
120
|
+
@quoted_table_names ||= {}
|
121
|
+
end
|
97
122
|
|
98
123
|
def initialize(connection, logger = nil, config = {}) # :nodoc:
|
99
124
|
super()
|
@@ -103,10 +128,11 @@ module ActiveRecord
|
|
103
128
|
@instrumenter = ActiveSupport::Notifications.instrumenter
|
104
129
|
@logger = logger
|
105
130
|
@config = config
|
106
|
-
@pool =
|
107
|
-
@
|
108
|
-
@
|
109
|
-
@
|
131
|
+
@pool = ActiveRecord::ConnectionAdapters::NullPool.new
|
132
|
+
@idle_since = Concurrent.monotonic_time
|
133
|
+
@visitor = arel_visitor
|
134
|
+
@statements = build_statement_pool
|
135
|
+
@lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
|
110
136
|
|
111
137
|
if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
|
112
138
|
@prepared_statements = true
|
@@ -114,61 +140,88 @@ module ActiveRecord
|
|
114
140
|
else
|
115
141
|
@prepared_statements = false
|
116
142
|
end
|
143
|
+
|
144
|
+
@advisory_locks_enabled = self.class.type_cast_config_to_boolean(
|
145
|
+
config.fetch(:advisory_locks, true)
|
146
|
+
)
|
117
147
|
end
|
118
148
|
|
119
|
-
|
120
|
-
|
149
|
+
def replica?
|
150
|
+
@config[:replica] || false
|
151
|
+
end
|
121
152
|
|
122
|
-
|
123
|
-
|
124
|
-
|
153
|
+
# Determines whether writes are currently being prevents.
|
154
|
+
#
|
155
|
+
# Returns true if the connection is a replica, or if +prevent_writes+
|
156
|
+
# is set to true.
|
157
|
+
def preventing_writes?
|
158
|
+
replica? || ActiveRecord::Base.connection_handler.prevent_writes
|
159
|
+
end
|
125
160
|
|
126
|
-
|
127
|
-
|
128
|
-
end
|
161
|
+
def migrations_paths # :nodoc:
|
162
|
+
@config[:migrations_paths] || Migrator.migrations_paths
|
129
163
|
end
|
130
164
|
|
131
|
-
|
132
|
-
|
133
|
-
casted_binds = conn.prepare_binds_for_database(bvs)
|
134
|
-
super(casted_binds.map { |value| conn.quote(value) })
|
135
|
-
end
|
165
|
+
def migration_context # :nodoc:
|
166
|
+
MigrationContext.new(migrations_paths, schema_migration)
|
136
167
|
end
|
137
168
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
169
|
+
def schema_migration # :nodoc:
|
170
|
+
@schema_migration ||= begin
|
171
|
+
conn = self
|
172
|
+
spec_name = conn.pool.spec.name
|
173
|
+
name = "#{spec_name}::SchemaMigration"
|
174
|
+
|
175
|
+
return ActiveRecord::SchemaMigration if spec_name == "primary"
|
176
|
+
|
177
|
+
Class.new(ActiveRecord::SchemaMigration) do
|
178
|
+
define_singleton_method(:name) { name }
|
179
|
+
define_singleton_method(:to_s) { name }
|
180
|
+
|
181
|
+
self.connection_specification_name = spec_name
|
182
|
+
end
|
183
|
+
end
|
142
184
|
end
|
143
185
|
|
144
|
-
def
|
145
|
-
|
146
|
-
SQLString.new
|
147
|
-
else
|
148
|
-
BindCollector.new
|
149
|
-
end
|
186
|
+
def prepared_statements
|
187
|
+
@prepared_statements && !prepared_statements_disabled_cache.include?(object_id)
|
150
188
|
end
|
151
189
|
|
152
|
-
def
|
153
|
-
|
190
|
+
def prepared_statements_disabled_cache # :nodoc:
|
191
|
+
Thread.current[:ar_prepared_statements_disabled_cache] ||= Set.new
|
154
192
|
end
|
155
193
|
|
156
|
-
|
157
|
-
|
194
|
+
class Version
|
195
|
+
include Comparable
|
196
|
+
|
197
|
+
attr_reader :full_version_string
|
198
|
+
|
199
|
+
def initialize(version_string, full_version_string = nil)
|
200
|
+
@version = version_string.split(".").map(&:to_i)
|
201
|
+
@full_version_string = full_version_string
|
202
|
+
end
|
203
|
+
|
204
|
+
def <=>(version_string)
|
205
|
+
@version <=> version_string.split(".").map(&:to_i)
|
206
|
+
end
|
207
|
+
|
208
|
+
def to_s
|
209
|
+
@version.join(".")
|
210
|
+
end
|
158
211
|
end
|
159
212
|
|
160
|
-
def
|
161
|
-
|
213
|
+
def valid_type?(type) # :nodoc:
|
214
|
+
!native_database_types[type].nil?
|
162
215
|
end
|
163
216
|
|
164
217
|
# this method must only be called while holding connection pool's mutex
|
165
218
|
def lease
|
166
219
|
if in_use?
|
167
|
-
msg =
|
220
|
+
msg = +"Cannot lease connection, "
|
168
221
|
if @owner == Thread.current
|
169
|
-
msg <<
|
222
|
+
msg << "it is already leased by the current thread."
|
170
223
|
else
|
171
|
-
msg << "it is already in use by a different thread: #{@owner}. "
|
224
|
+
msg << "it is already in use by a different thread: #{@owner}. " \
|
172
225
|
"Current thread: #{Thread.current}."
|
173
226
|
end
|
174
227
|
raise ActiveRecordError, msg
|
@@ -177,23 +230,28 @@ module ActiveRecord
|
|
177
230
|
@owner = Thread.current
|
178
231
|
end
|
179
232
|
|
233
|
+
def schema_cache
|
234
|
+
@pool.get_schema_cache(self)
|
235
|
+
end
|
236
|
+
|
180
237
|
def schema_cache=(cache)
|
181
238
|
cache.connection = self
|
182
|
-
@
|
239
|
+
@pool.set_schema_cache(cache)
|
183
240
|
end
|
184
241
|
|
185
242
|
# this method must only be called while holding connection pool's mutex
|
186
243
|
def expire
|
187
244
|
if in_use?
|
188
245
|
if @owner != Thread.current
|
189
|
-
raise ActiveRecordError, "Cannot expire connection, "
|
190
|
-
"it is owned by a different thread: #{@owner}. "
|
246
|
+
raise ActiveRecordError, "Cannot expire connection, " \
|
247
|
+
"it is owned by a different thread: #{@owner}. " \
|
191
248
|
"Current thread: #{Thread.current}."
|
192
249
|
end
|
193
250
|
|
251
|
+
@idle_since = Concurrent.monotonic_time
|
194
252
|
@owner = nil
|
195
253
|
else
|
196
|
-
raise ActiveRecordError,
|
254
|
+
raise ActiveRecordError, "Cannot expire connection, it is not currently leased."
|
197
255
|
end
|
198
256
|
end
|
199
257
|
|
@@ -206,15 +264,21 @@ module ActiveRecord
|
|
206
264
|
@owner = Thread.current
|
207
265
|
end
|
208
266
|
else
|
209
|
-
raise ActiveRecordError,
|
267
|
+
raise ActiveRecordError, "Cannot steal connection, it is not currently leased."
|
210
268
|
end
|
211
269
|
end
|
212
270
|
|
271
|
+
# Seconds since this connection was returned to the pool
|
272
|
+
def seconds_idle # :nodoc:
|
273
|
+
return 0 if in_use?
|
274
|
+
Concurrent.monotonic_time - @idle_since
|
275
|
+
end
|
276
|
+
|
213
277
|
def unprepared_statement
|
214
|
-
|
278
|
+
cache = prepared_statements_disabled_cache.add(object_id) if @prepared_statements
|
215
279
|
yield
|
216
280
|
ensure
|
217
|
-
|
281
|
+
cache&.delete(object_id)
|
218
282
|
end
|
219
283
|
|
220
284
|
# Returns the human-readable name of the adapter. Use mixed case - one
|
@@ -223,15 +287,9 @@ module ActiveRecord
|
|
223
287
|
self.class::ADAPTER_NAME
|
224
288
|
end
|
225
289
|
|
226
|
-
# Does this adapter
|
227
|
-
def
|
228
|
-
|
229
|
-
end
|
230
|
-
|
231
|
-
# Can this adapter determine the primary key for tables not attached
|
232
|
-
# to an Active Record class, such as join tables?
|
233
|
-
def supports_primary_key?
|
234
|
-
false
|
290
|
+
# Does the database for this adapter exist?
|
291
|
+
def self.database_exists?(config)
|
292
|
+
raise NotImplementedError
|
235
293
|
end
|
236
294
|
|
237
295
|
# Does this adapter support DDL rollbacks in transactions? That is, would
|
@@ -261,6 +319,10 @@ module ActiveRecord
|
|
261
319
|
false
|
262
320
|
end
|
263
321
|
|
322
|
+
def supports_partitioned_indexes?
|
323
|
+
false
|
324
|
+
end
|
325
|
+
|
264
326
|
# Does this adapter support index sort order?
|
265
327
|
def supports_index_sort_order?
|
266
328
|
false
|
@@ -302,11 +364,28 @@ module ActiveRecord
|
|
302
364
|
false
|
303
365
|
end
|
304
366
|
|
367
|
+
# Does this adapter support creating invalid constraints?
|
368
|
+
def supports_validate_constraints?
|
369
|
+
false
|
370
|
+
end
|
371
|
+
|
372
|
+
# Does this adapter support creating foreign key constraints
|
373
|
+
# in the same statement as creating the table?
|
374
|
+
def supports_foreign_keys_in_create?
|
375
|
+
supports_foreign_keys?
|
376
|
+
end
|
377
|
+
deprecate :supports_foreign_keys_in_create?
|
378
|
+
|
305
379
|
# Does this adapter support views?
|
306
380
|
def supports_views?
|
307
381
|
false
|
308
382
|
end
|
309
383
|
|
384
|
+
# Does this adapter support materialized views?
|
385
|
+
def supports_materialized_views?
|
386
|
+
false
|
387
|
+
end
|
388
|
+
|
310
389
|
# Does this adapter support datetime with precision?
|
311
390
|
def supports_datetime_with_precision?
|
312
391
|
false
|
@@ -331,6 +410,46 @@ module ActiveRecord
|
|
331
410
|
def supports_multi_insert?
|
332
411
|
true
|
333
412
|
end
|
413
|
+
deprecate :supports_multi_insert?
|
414
|
+
|
415
|
+
# Does this adapter support virtual columns?
|
416
|
+
def supports_virtual_columns?
|
417
|
+
false
|
418
|
+
end
|
419
|
+
|
420
|
+
# Does this adapter support foreign/external tables?
|
421
|
+
def supports_foreign_tables?
|
422
|
+
false
|
423
|
+
end
|
424
|
+
|
425
|
+
# Does this adapter support optimizer hints?
|
426
|
+
def supports_optimizer_hints?
|
427
|
+
false
|
428
|
+
end
|
429
|
+
|
430
|
+
def supports_common_table_expressions?
|
431
|
+
false
|
432
|
+
end
|
433
|
+
|
434
|
+
def supports_lazy_transactions?
|
435
|
+
false
|
436
|
+
end
|
437
|
+
|
438
|
+
def supports_insert_returning?
|
439
|
+
false
|
440
|
+
end
|
441
|
+
|
442
|
+
def supports_insert_on_duplicate_skip?
|
443
|
+
false
|
444
|
+
end
|
445
|
+
|
446
|
+
def supports_insert_on_duplicate_update?
|
447
|
+
false
|
448
|
+
end
|
449
|
+
|
450
|
+
def supports_insert_conflict_target?
|
451
|
+
false
|
452
|
+
end
|
334
453
|
|
335
454
|
# This is meant to be implemented by the adapters that support extensions
|
336
455
|
def disable_extension(name)
|
@@ -340,6 +459,10 @@ module ActiveRecord
|
|
340
459
|
def enable_extension(name)
|
341
460
|
end
|
342
461
|
|
462
|
+
def advisory_locks_enabled? # :nodoc:
|
463
|
+
supports_advisory_locks? && @advisory_locks_enabled
|
464
|
+
end
|
465
|
+
|
343
466
|
# This is meant to be implemented by the adapters that support advisory
|
344
467
|
# locks
|
345
468
|
#
|
@@ -394,6 +517,22 @@ module ActiveRecord
|
|
394
517
|
reset_transaction
|
395
518
|
end
|
396
519
|
|
520
|
+
# Immediately forget this connection ever existed. Unlike disconnect!,
|
521
|
+
# this will not communicate with the server.
|
522
|
+
#
|
523
|
+
# After calling this method, the behavior of all other methods becomes
|
524
|
+
# undefined. This is called internally just before a forked process gets
|
525
|
+
# rid of a connection that belonged to its parent.
|
526
|
+
def discard!
|
527
|
+
# This should be overridden by concrete adapters.
|
528
|
+
#
|
529
|
+
# Prevent @connection's finalizer from touching the socket, or
|
530
|
+
# otherwise communicating with its server, when it is collected.
|
531
|
+
if schema_cache.connection == self
|
532
|
+
schema_cache.connection = nil
|
533
|
+
end
|
534
|
+
end
|
535
|
+
|
397
536
|
# Reset the state of this connection, directing the DBMS to clear
|
398
537
|
# transactions and other connection-related server-side state. Usually a
|
399
538
|
# database-dependent operation.
|
@@ -404,11 +543,9 @@ module ActiveRecord
|
|
404
543
|
# this should be overridden by concrete adapters
|
405
544
|
end
|
406
545
|
|
407
|
-
|
408
|
-
# Clear any caching the database adapter may be doing, for example
|
409
|
-
# clearing the prepared statement cache. This is database specific.
|
546
|
+
# Clear any caching the database adapter may be doing.
|
410
547
|
def clear_cache!
|
411
|
-
|
548
|
+
@lock.synchronize { @statements.clear } if @statements
|
412
549
|
end
|
413
550
|
|
414
551
|
# Returns true if its required to reload the connection between requests for development mode.
|
@@ -419,7 +556,7 @@ module ActiveRecord
|
|
419
556
|
# Checks whether the connection to the database is still active (i.e. not stale).
|
420
557
|
# This is done under the hood by calling #active?. If the connection
|
421
558
|
# is no longer active, then this method will reconnect to the database.
|
422
|
-
def verify!
|
559
|
+
def verify!
|
423
560
|
reconnect! unless active?
|
424
561
|
end
|
425
562
|
|
@@ -430,22 +567,25 @@ module ActiveRecord
|
|
430
567
|
# This is useful for when you need to call a proprietary method such as
|
431
568
|
# PostgreSQL's lo_* methods.
|
432
569
|
def raw_connection
|
570
|
+
disable_lazy_transactions!
|
433
571
|
@connection
|
434
572
|
end
|
435
573
|
|
436
|
-
def
|
437
|
-
|
438
|
-
table[attribute].eq(value)
|
439
|
-
else
|
440
|
-
table[attribute].eq(Arel::Nodes::BindParam.new)
|
441
|
-
end
|
574
|
+
def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
|
575
|
+
attribute.eq(value)
|
442
576
|
end
|
443
577
|
|
444
|
-
def
|
578
|
+
def case_sensitive_comparison(attribute, value) # :nodoc:
|
579
|
+
attribute.eq(value)
|
580
|
+
end
|
581
|
+
|
582
|
+
def case_insensitive_comparison(attribute, value) # :nodoc:
|
583
|
+
column = column_for_attribute(attribute)
|
584
|
+
|
445
585
|
if can_perform_case_insensitive_comparison_for?(column)
|
446
|
-
|
586
|
+
attribute.lower.eq(attribute.relation.lower(value))
|
447
587
|
else
|
448
|
-
|
588
|
+
attribute.eq(value)
|
449
589
|
end
|
450
590
|
end
|
451
591
|
|
@@ -459,153 +599,184 @@ module ActiveRecord
|
|
459
599
|
pool.checkin self
|
460
600
|
end
|
461
601
|
|
462
|
-
def
|
463
|
-
|
464
|
-
|
602
|
+
def column_name_for_operation(operation, node) # :nodoc:
|
603
|
+
visitor.compile(node)
|
604
|
+
end
|
605
|
+
|
606
|
+
def default_index_type?(index) # :nodoc:
|
607
|
+
index.using.nil?
|
608
|
+
end
|
609
|
+
|
610
|
+
# Called by ActiveRecord::InsertAll,
|
611
|
+
# Passed an instance of ActiveRecord::InsertAll::Builder,
|
612
|
+
# This method implements standard bulk inserts for all databases, but
|
613
|
+
# should be overridden by adapters to implement common features with
|
614
|
+
# non-standard syntax like handling duplicates or returning values.
|
615
|
+
def build_insert_sql(insert) # :nodoc:
|
616
|
+
if insert.skip_duplicates? || insert.update_duplicates?
|
617
|
+
raise NotImplementedError, "#{self.class} should define `build_insert_sql` to implement adapter-specific logic for handling duplicates during INSERT"
|
465
618
|
end
|
619
|
+
|
620
|
+
"INSERT #{insert.into} #{insert.values_list}"
|
466
621
|
end
|
467
622
|
|
468
|
-
def
|
469
|
-
Column.new(name, default, sql_type_metadata, null, table_name, default_function, collation)
|
623
|
+
def get_database_version # :nodoc:
|
470
624
|
end
|
471
625
|
|
472
|
-
def
|
473
|
-
|
626
|
+
def database_version # :nodoc:
|
627
|
+
schema_cache.database_version
|
474
628
|
end
|
475
629
|
|
476
|
-
def
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
having_clause: [],
|
485
|
-
limit: nil,
|
486
|
-
offset: nil
|
487
|
-
) # :nodoc:
|
488
|
-
result = from_clause + join_clause + where_clause + having_clause
|
489
|
-
if limit
|
490
|
-
result << limit
|
491
|
-
end
|
492
|
-
if offset
|
493
|
-
result << offset
|
630
|
+
def check_version # :nodoc:
|
631
|
+
end
|
632
|
+
|
633
|
+
private
|
634
|
+
def type_map
|
635
|
+
@type_map ||= Type::TypeMap.new.tap do |mapping|
|
636
|
+
initialize_type_map(mapping)
|
637
|
+
end
|
494
638
|
end
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
Type::Decimal.new(precision: precision, scale: scale)
|
639
|
+
|
640
|
+
def initialize_type_map(m = type_map)
|
641
|
+
register_class_with_limit m, %r(boolean)i, Type::Boolean
|
642
|
+
register_class_with_limit m, %r(char)i, Type::String
|
643
|
+
register_class_with_limit m, %r(binary)i, Type::Binary
|
644
|
+
register_class_with_limit m, %r(text)i, Type::Text
|
645
|
+
register_class_with_precision m, %r(date)i, Type::Date
|
646
|
+
register_class_with_precision m, %r(time)i, Type::Time
|
647
|
+
register_class_with_precision m, %r(datetime)i, Type::DateTime
|
648
|
+
register_class_with_limit m, %r(float)i, Type::Float
|
649
|
+
register_class_with_limit m, %r(int)i, Type::Integer
|
650
|
+
|
651
|
+
m.alias_type %r(blob)i, "binary"
|
652
|
+
m.alias_type %r(clob)i, "text"
|
653
|
+
m.alias_type %r(timestamp)i, "datetime"
|
654
|
+
m.alias_type %r(numeric)i, "decimal"
|
655
|
+
m.alias_type %r(number)i, "decimal"
|
656
|
+
m.alias_type %r(double)i, "float"
|
657
|
+
|
658
|
+
m.register_type %r(^json)i, Type::Json.new
|
659
|
+
|
660
|
+
m.register_type(%r(decimal)i) do |sql_type|
|
661
|
+
scale = extract_scale(sql_type)
|
662
|
+
precision = extract_precision(sql_type)
|
663
|
+
|
664
|
+
if scale == 0
|
665
|
+
# FIXME: Remove this class as well
|
666
|
+
Type::DecimalWithoutScale.new(precision: precision)
|
667
|
+
else
|
668
|
+
Type::Decimal.new(precision: precision, scale: scale)
|
669
|
+
end
|
527
670
|
end
|
528
671
|
end
|
529
|
-
end
|
530
672
|
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
673
|
+
def reload_type_map
|
674
|
+
type_map.clear
|
675
|
+
initialize_type_map
|
676
|
+
end
|
535
677
|
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
678
|
+
def register_class_with_limit(mapping, key, klass)
|
679
|
+
mapping.register_type(key) do |*args|
|
680
|
+
limit = extract_limit(args.last)
|
681
|
+
klass.new(limit: limit)
|
682
|
+
end
|
540
683
|
end
|
541
|
-
end
|
542
684
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
685
|
+
def register_class_with_precision(mapping, key, klass)
|
686
|
+
mapping.register_type(key) do |*args|
|
687
|
+
precision = extract_precision(args.last)
|
688
|
+
klass.new(precision: precision)
|
689
|
+
end
|
547
690
|
end
|
548
|
-
end
|
549
691
|
|
550
|
-
|
551
|
-
|
692
|
+
def extract_scale(sql_type)
|
693
|
+
case sql_type
|
552
694
|
when /\((\d+)\)/ then 0
|
553
695
|
when /\((\d+)(,(\d+))\)/ then $3.to_i
|
696
|
+
end
|
554
697
|
end
|
555
|
-
end
|
556
698
|
|
557
|
-
|
558
|
-
|
559
|
-
|
699
|
+
def extract_precision(sql_type)
|
700
|
+
$1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
|
701
|
+
end
|
560
702
|
|
561
|
-
|
562
|
-
|
563
|
-
when /^bigint/i
|
564
|
-
8
|
565
|
-
when /\((.*)\)/
|
566
|
-
$1.to_i
|
703
|
+
def extract_limit(sql_type)
|
704
|
+
$1.to_i if sql_type =~ /\((.*)\)/
|
567
705
|
end
|
568
|
-
end
|
569
706
|
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
707
|
+
def translate_exception_class(e, sql, binds)
|
708
|
+
message = "#{e.class.name}: #{e.message}"
|
709
|
+
|
710
|
+
exception = translate_exception(
|
711
|
+
e, message: message, sql: sql, binds: binds
|
712
|
+
)
|
713
|
+
exception.set_backtrace e.backtrace
|
714
|
+
exception
|
575
715
|
end
|
576
716
|
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
717
|
+
def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
|
718
|
+
@instrumenter.instrument(
|
719
|
+
"sql.active_record",
|
720
|
+
sql: sql,
|
721
|
+
name: name,
|
722
|
+
binds: binds,
|
723
|
+
type_casted_binds: type_casted_binds,
|
724
|
+
statement_name: statement_name,
|
725
|
+
connection_id: object_id,
|
726
|
+
connection: self) do
|
727
|
+
@lock.synchronize do
|
728
|
+
yield
|
729
|
+
end
|
730
|
+
rescue => e
|
731
|
+
raise translate_exception_class(e, sql, binds)
|
732
|
+
end
|
733
|
+
end
|
581
734
|
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
rescue => e
|
592
|
-
raise translate_exception_class(e, sql)
|
593
|
-
end
|
735
|
+
def translate_exception(exception, message:, sql:, binds:)
|
736
|
+
# override in derived class
|
737
|
+
case exception
|
738
|
+
when RuntimeError
|
739
|
+
exception
|
740
|
+
else
|
741
|
+
ActiveRecord::StatementInvalid.new(message, sql: sql, binds: binds)
|
742
|
+
end
|
743
|
+
end
|
594
744
|
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
end
|
745
|
+
def without_prepared_statement?(binds)
|
746
|
+
!prepared_statements || binds.empty?
|
747
|
+
end
|
599
748
|
|
600
|
-
|
601
|
-
|
602
|
-
|
749
|
+
def column_for(table_name, column_name)
|
750
|
+
column_name = column_name.to_s
|
751
|
+
columns(table_name).detect { |c| c.name == column_name } ||
|
752
|
+
raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
|
753
|
+
end
|
603
754
|
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
755
|
+
def column_for_attribute(attribute)
|
756
|
+
table_name = attribute.relation.name
|
757
|
+
schema_cache.columns_hash(table_name)[attribute.name.to_s]
|
758
|
+
end
|
759
|
+
|
760
|
+
def collector
|
761
|
+
if prepared_statements
|
762
|
+
Arel::Collectors::Composite.new(
|
763
|
+
Arel::Collectors::SQLString.new,
|
764
|
+
Arel::Collectors::Bind.new,
|
765
|
+
)
|
766
|
+
else
|
767
|
+
Arel::Collectors::SubstituteBinds.new(
|
768
|
+
self,
|
769
|
+
Arel::Collectors::SQLString.new,
|
770
|
+
)
|
771
|
+
end
|
772
|
+
end
|
773
|
+
|
774
|
+
def arel_visitor
|
775
|
+
Arel::Visitors::ToSql.new(self)
|
776
|
+
end
|
777
|
+
|
778
|
+
def build_statement_pool
|
779
|
+
end
|
609
780
|
end
|
610
781
|
end
|
611
782
|
end
|