activerecord 4.2.0 → 6.0.5.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 +852 -801
- data/MIT-LICENSE +4 -2
- data/README.rdoc +14 -13
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +267 -249
- data/lib/active_record/association_relation.rb +26 -6
- data/lib/active_record/associations/alias_tracker.rb +29 -36
- data/lib/active_record/associations/association.rb +137 -55
- data/lib/active_record/associations/association_scope.rb +110 -132
- data/lib/active_record/associations/belongs_to_association.rb +67 -54
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +27 -40
- data/lib/active_record/associations/builder/belongs_to.rb +69 -55
- data/lib/active_record/associations/builder/collection_association.rb +10 -29
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +58 -70
- data/lib/active_record/associations/builder/has_many.rb +8 -4
- data/lib/active_record/associations/builder/has_one.rb +46 -5
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +150 -275
- data/lib/active_record/associations/collection_proxy.rb +253 -152
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +35 -84
- data/lib/active_record/associations/has_many_through_association.rb +62 -80
- data/lib/active_record/associations/has_one_association.rb +62 -49
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -78
- 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 +159 -162
- data/lib/active_record/associations/preloader/association.rb +102 -113
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +96 -95
- data/lib/active_record/associations/singular_association.rb +18 -45
- data/lib/active_record/associations/through_association.rb +49 -24
- data/lib/active_record/associations.rb +1737 -1596
- data/lib/active_record/attribute_assignment.rb +57 -185
- data/lib/active_record/attribute_decorators.rb +39 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +14 -5
- data/lib/active_record/attribute_methods/dirty.rb +174 -134
- data/lib/active_record/attribute_methods/primary_key.rb +90 -84
- data/lib/active_record/attribute_methods/query.rb +6 -5
- data/lib/active_record/attribute_methods/read.rb +20 -77
- data/lib/active_record/attribute_methods/serialization.rb +40 -21
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -37
- data/lib/active_record/attribute_methods/write.rb +33 -56
- data/lib/active_record/attribute_methods.rb +124 -143
- data/lib/active_record/attributes.rb +213 -74
- data/lib/active_record/autosave_association.rb +125 -54
- data/lib/active_record/base.rb +60 -49
- data/lib/active_record/callbacks.rb +101 -76
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +36 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +810 -291
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +253 -108
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +383 -239
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +736 -235
- data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -87
- data/lib/active_record/connection_adapters/abstract_adapter.rb +487 -192
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +536 -600
- data/lib/active_record/connection_adapters/column.rb +56 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -196
- data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +71 -115
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
- 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 +5 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +17 -13
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
- 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/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 -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 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
- 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 +23 -25
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -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 +465 -291
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +565 -363
- data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -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 +17 -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 +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -364
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_handling.rb +167 -41
- data/lib/active_record/core.rb +277 -233
- data/lib/active_record/counter_cache.rb +71 -50
- 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 -106
- data/lib/active_record/enum.rb +172 -89
- data/lib/active_record/errors.rb +189 -53
- data/lib/active_record/explain.rb +22 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +11 -6
- data/lib/active_record/fixture_set/file.rb +35 -9
- 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 +225 -497
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +158 -115
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +123 -29
- data/lib/active_record/internal_metadata.rb +53 -0
- data/lib/active_record/legacy_yaml_adapter.rb +48 -0
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +99 -98
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +76 -33
- 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 +166 -91
- data/lib/active_record/migration/compatibility.rb +244 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +636 -290
- data/lib/active_record/model_schema.rb +344 -112
- data/lib/active_record/nested_attributes.rb +265 -215
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +559 -125
- data/lib/active_record/query_cache.rb +19 -23
- data/lib/active_record/querying.rb +44 -30
- data/lib/active_record/railtie.rb +166 -47
- 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 +341 -202
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +461 -302
- data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
- data/lib/active_record/relation/batches.rb +206 -55
- data/lib/active_record/relation/calculations.rb +270 -249
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +287 -255
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +86 -68
- data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -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 +53 -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 +112 -92
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +612 -392
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +18 -17
- data/lib/active_record/relation/where_clause.rb +189 -0
- data/lib/active_record/relation/where_clause_factory.rb +33 -0
- data/lib/active_record/relation.rb +533 -340
- data/lib/active_record/result.rb +79 -43
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +144 -121
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +112 -93
- data/lib/active_record/schema_migration.rb +24 -20
- data/lib/active_record/scoping/default.rb +98 -82
- data/lib/active_record/scoping/named.rb +91 -33
- data/lib/active_record/scoping.rb +45 -27
- data/lib/active_record/secure_token.rb +40 -0
- data/lib/active_record/serialization.rb +5 -5
- data/lib/active_record/statement_cache.rb +73 -36
- data/lib/active_record/store.rb +127 -42
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +90 -0
- data/lib/active_record/tasks/database_tasks.rb +309 -99
- data/lib/active_record/tasks/mysql_database_tasks.rb +58 -89
- data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -31
- data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -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 +86 -41
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +222 -146
- 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 -41
- data/lib/active_record/type/date_time.rb +4 -38
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
- 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 +29 -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 +77 -23
- data/lib/active_record/type_caster/connection.rb +34 -0
- data/lib/active_record/type_caster/map.rb +20 -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/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +43 -46
- data/lib/active_record/validations.rb +38 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +44 -21
- 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/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -8
- data/lib/rails/generators/active_record/migration.rb +30 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +174 -63
- 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 -149
- data/lib/active_record/attribute_set/builder.rb +0 -86
- data/lib/active_record/attribute_set.rb +0 -77
- 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 -30
- data/lib/active_record/type/decimal.rb +0 -40
- 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 -55
- 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 -36
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -101
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,26 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/deprecation"
|
4
|
+
|
1
5
|
module ActiveRecord
|
2
6
|
module ConnectionAdapters # :nodoc:
|
3
7
|
module DatabaseLimits
|
8
|
+
def max_identifier_length # :nodoc:
|
9
|
+
64
|
10
|
+
end
|
4
11
|
|
5
12
|
# Returns the maximum length of a table alias.
|
6
13
|
def table_alias_length
|
7
|
-
|
14
|
+
max_identifier_length
|
8
15
|
end
|
9
16
|
|
10
17
|
# Returns the maximum length of a column name.
|
11
18
|
def column_name_length
|
12
|
-
|
19
|
+
max_identifier_length
|
13
20
|
end
|
21
|
+
deprecate :column_name_length
|
14
22
|
|
15
23
|
# Returns the maximum length of a table name.
|
16
24
|
def table_name_length
|
17
|
-
|
25
|
+
max_identifier_length
|
18
26
|
end
|
27
|
+
deprecate :table_name_length
|
19
28
|
|
20
29
|
# Returns the maximum allowed length for an index name. This
|
21
|
-
# limit is enforced by
|
22
|
-
#
|
23
|
-
#
|
30
|
+
# limit is enforced by \Rails and is less than or equal to
|
31
|
+
# #index_name_length. The gap between
|
32
|
+
# #index_name_length is to allow internal \Rails
|
24
33
|
# operations to use prefixes in temporary operations.
|
25
34
|
def allowed_index_name_length
|
26
35
|
index_name_length
|
@@ -28,26 +37,29 @@ module ActiveRecord
|
|
28
37
|
|
29
38
|
# Returns the maximum length of an index name.
|
30
39
|
def index_name_length
|
31
|
-
|
40
|
+
max_identifier_length
|
32
41
|
end
|
33
42
|
|
34
43
|
# Returns the maximum number of columns per table.
|
35
44
|
def columns_per_table
|
36
45
|
1024
|
37
46
|
end
|
47
|
+
deprecate :columns_per_table
|
38
48
|
|
39
49
|
# Returns the maximum number of indexes per table.
|
40
50
|
def indexes_per_table
|
41
51
|
16
|
42
52
|
end
|
53
|
+
deprecate :indexes_per_table
|
43
54
|
|
44
55
|
# Returns the maximum number of columns in a multicolumn index.
|
45
56
|
def columns_per_multicolumn_index
|
46
57
|
16
|
47
58
|
end
|
59
|
+
deprecate :columns_per_multicolumn_index
|
48
60
|
|
49
61
|
# Returns the maximum number of elements in an IN (x,y,z) clause.
|
50
|
-
# nil means no limit.
|
62
|
+
# +nil+ means no limit.
|
51
63
|
def in_clause_length
|
52
64
|
nil
|
53
65
|
end
|
@@ -56,12 +68,18 @@ module ActiveRecord
|
|
56
68
|
def sql_query_length
|
57
69
|
1048575
|
58
70
|
end
|
71
|
+
deprecate :sql_query_length
|
59
72
|
|
60
73
|
# Returns maximum number of joins in a single query.
|
61
74
|
def joins_per_query
|
62
75
|
256
|
63
76
|
end
|
77
|
+
deprecate :joins_per_query
|
64
78
|
|
79
|
+
private
|
80
|
+
def bind_params_length
|
81
|
+
65535
|
82
|
+
end
|
65
83
|
end
|
66
84
|
end
|
67
85
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters # :nodoc:
|
3
5
|
module DatabaseStatements
|
@@ -7,29 +9,66 @@ module ActiveRecord
|
|
7
9
|
end
|
8
10
|
|
9
11
|
# Converts an arel AST to SQL
|
10
|
-
def to_sql(
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def to_sql(arel_or_sql_string, binds = [])
|
13
|
+
sql, _ = to_sql_and_binds(arel_or_sql_string, binds)
|
14
|
+
sql
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_sql_and_binds(arel_or_sql_string, binds = []) # :nodoc:
|
18
|
+
if arel_or_sql_string.respond_to?(:ast)
|
19
|
+
unless binds.empty?
|
20
|
+
raise "Passing bind parameters with an arel AST is forbidden. " \
|
21
|
+
"The values must be stored on the AST directly"
|
22
|
+
end
|
23
|
+
|
24
|
+
if prepared_statements
|
25
|
+
sql, binds = visitor.compile(arel_or_sql_string.ast, collector)
|
26
|
+
|
27
|
+
if binds.length > bind_params_length
|
28
|
+
unprepared_statement do
|
29
|
+
sql, binds = to_sql_and_binds(arel_or_sql_string)
|
30
|
+
visitor.preparable = false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
sql = visitor.compile(arel_or_sql_string.ast, collector)
|
35
|
+
end
|
36
|
+
[sql.freeze, binds]
|
14
37
|
else
|
15
|
-
|
38
|
+
visitor.preparable = false if prepared_statements
|
39
|
+
[arel_or_sql_string.dup.freeze, binds]
|
16
40
|
end
|
17
41
|
end
|
42
|
+
private :to_sql_and_binds
|
18
43
|
|
19
44
|
# This is used in the StatementCache object. It returns an object that
|
20
45
|
# can be used to query the database repeatedly.
|
21
|
-
def cacheable_query(arel) # :nodoc:
|
46
|
+
def cacheable_query(klass, arel) # :nodoc:
|
22
47
|
if prepared_statements
|
23
|
-
|
48
|
+
sql, binds = visitor.compile(arel.ast, collector)
|
49
|
+
query = klass.query(sql)
|
24
50
|
else
|
25
|
-
|
51
|
+
collector = klass.partial_query_collector
|
52
|
+
parts, binds = visitor.compile(arel.ast, collector)
|
53
|
+
query = klass.partial_query(parts)
|
26
54
|
end
|
55
|
+
[query, binds]
|
27
56
|
end
|
28
57
|
|
29
58
|
# Returns an ActiveRecord::Result instance.
|
30
|
-
def select_all(arel, name = nil, binds = [])
|
31
|
-
arel
|
32
|
-
|
59
|
+
def select_all(arel, name = nil, binds = [], preparable: nil)
|
60
|
+
arel = arel_from_relation(arel)
|
61
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
62
|
+
|
63
|
+
if preparable.nil?
|
64
|
+
preparable = prepared_statements ? visitor.preparable : false
|
65
|
+
end
|
66
|
+
|
67
|
+
if prepared_statements && preparable
|
68
|
+
select_prepared(sql, name, binds)
|
69
|
+
else
|
70
|
+
select(sql, name, binds)
|
71
|
+
end
|
33
72
|
end
|
34
73
|
|
35
74
|
# Returns a record hash with the column names as keys and column values
|
@@ -40,89 +79,121 @@ module ActiveRecord
|
|
40
79
|
|
41
80
|
# Returns a single value from a record
|
42
81
|
def select_value(arel, name = nil, binds = [])
|
43
|
-
|
44
|
-
result.values.first
|
45
|
-
end
|
82
|
+
single_value_from_rows(select_rows(arel, name, binds))
|
46
83
|
end
|
47
84
|
|
48
85
|
# Returns an array of the values of the first column in a select:
|
49
86
|
# select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
|
50
|
-
def select_values(arel, name = nil)
|
51
|
-
arel,
|
52
|
-
select_rows(to_sql(arel, binds), name, binds).map(&:first)
|
87
|
+
def select_values(arel, name = nil, binds = [])
|
88
|
+
select_rows(arel, name, binds).map(&:first)
|
53
89
|
end
|
54
90
|
|
55
91
|
# Returns an array of arrays containing the field values.
|
56
92
|
# Order is the same as that returned by +columns+.
|
57
|
-
def select_rows(
|
93
|
+
def select_rows(arel, name = nil, binds = [])
|
94
|
+
select_all(arel, name, binds).rows
|
95
|
+
end
|
96
|
+
|
97
|
+
def query_value(sql, name = nil) # :nodoc:
|
98
|
+
single_value_from_rows(query(sql, name))
|
99
|
+
end
|
100
|
+
|
101
|
+
def query_values(sql, name = nil) # :nodoc:
|
102
|
+
query(sql, name).map(&:first)
|
103
|
+
end
|
104
|
+
|
105
|
+
def query(sql, name = nil) # :nodoc:
|
106
|
+
exec_query(sql, name).rows
|
58
107
|
end
|
59
|
-
undef_method :select_rows
|
60
108
|
|
61
|
-
#
|
109
|
+
# Determines whether the SQL statement is a write query.
|
110
|
+
def write_query?(sql)
|
111
|
+
raise NotImplementedError
|
112
|
+
end
|
113
|
+
|
114
|
+
# Executes the SQL statement in the context of this connection and returns
|
115
|
+
# the raw result from the connection adapter.
|
116
|
+
# Note: depending on your database connector, the result returned by this
|
117
|
+
# method may be manually memory managed. Consider using the exec_query
|
118
|
+
# wrapper instead.
|
62
119
|
def execute(sql, name = nil)
|
120
|
+
raise NotImplementedError
|
63
121
|
end
|
64
|
-
undef_method :execute
|
65
122
|
|
66
123
|
# Executes +sql+ statement in the context of this connection using
|
67
124
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
68
125
|
# the executed +sql+ statement.
|
69
|
-
def exec_query(sql, name =
|
126
|
+
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
127
|
+
raise NotImplementedError
|
70
128
|
end
|
71
129
|
|
72
130
|
# Executes insert +sql+ statement in the context of this connection using
|
73
131
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
74
132
|
# the executed +sql+ statement.
|
75
|
-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
133
|
+
def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
|
134
|
+
sql, binds = sql_for_insert(sql, pk, binds)
|
76
135
|
exec_query(sql, name, binds)
|
77
136
|
end
|
78
137
|
|
79
138
|
# Executes delete +sql+ statement in the context of this connection using
|
80
139
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
81
140
|
# the executed +sql+ statement.
|
82
|
-
def exec_delete(sql, name, binds)
|
141
|
+
def exec_delete(sql, name = nil, binds = [])
|
83
142
|
exec_query(sql, name, binds)
|
84
143
|
end
|
85
144
|
|
86
|
-
# Executes the truncate statement.
|
87
|
-
def truncate(table_name, name = nil)
|
88
|
-
raise NotImplementedError
|
89
|
-
end
|
90
|
-
|
91
145
|
# Executes update +sql+ statement in the context of this connection using
|
92
146
|
# +binds+ as the bind substitutes. +name+ is logged along with
|
93
147
|
# the executed +sql+ statement.
|
94
|
-
def exec_update(sql, name, binds)
|
148
|
+
def exec_update(sql, name = nil, binds = [])
|
95
149
|
exec_query(sql, name, binds)
|
96
150
|
end
|
97
151
|
|
98
|
-
|
152
|
+
def exec_insert_all(sql, name) # :nodoc:
|
153
|
+
exec_query(sql, name)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Executes an INSERT query and returns the new record's ID
|
99
157
|
#
|
100
|
-
# +id_value+ will be returned unless the value is nil
|
158
|
+
# +id_value+ will be returned unless the value is +nil+, in
|
101
159
|
# which case the database will attempt to calculate the last inserted
|
102
160
|
# id and return that value.
|
103
161
|
#
|
104
162
|
# If the next id was calculated in advance (as in Oracle), it should be
|
105
163
|
# passed in as +id_value+.
|
106
164
|
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
107
|
-
sql, binds =
|
108
|
-
value
|
165
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
166
|
+
value = exec_insert(sql, name, binds, pk, sequence_name)
|
109
167
|
id_value || last_inserted_id(value)
|
110
168
|
end
|
169
|
+
alias create insert
|
111
170
|
|
112
171
|
# Executes the update statement and returns the number of rows affected.
|
113
172
|
def update(arel, name = nil, binds = [])
|
114
|
-
|
173
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
174
|
+
exec_update(sql, name, binds)
|
115
175
|
end
|
116
176
|
|
117
177
|
# Executes the delete statement and returns the number of rows affected.
|
118
178
|
def delete(arel, name = nil, binds = [])
|
119
|
-
|
179
|
+
sql, binds = to_sql_and_binds(arel, binds)
|
180
|
+
exec_delete(sql, name, binds)
|
120
181
|
end
|
121
182
|
|
122
|
-
#
|
123
|
-
|
124
|
-
|
125
|
-
|
183
|
+
# Executes the truncate statement.
|
184
|
+
def truncate(table_name, name = nil)
|
185
|
+
execute(build_truncate_statement(table_name), name)
|
186
|
+
end
|
187
|
+
|
188
|
+
def truncate_tables(*table_names) # :nodoc:
|
189
|
+
return if table_names.empty?
|
190
|
+
|
191
|
+
with_multi_statements do
|
192
|
+
disable_referential_integrity do
|
193
|
+
statements = build_truncate_statements(table_names)
|
194
|
+
execute_batch(statements, "Truncate Tables")
|
195
|
+
end
|
196
|
+
end
|
126
197
|
end
|
127
198
|
|
128
199
|
# Runs the given block in a database transaction, and returns the result
|
@@ -136,7 +207,7 @@ module ActiveRecord
|
|
136
207
|
#
|
137
208
|
# In order to get around this problem, #transaction will emulate the effect
|
138
209
|
# of nested transactions, by using savepoints:
|
139
|
-
#
|
210
|
+
# https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
|
140
211
|
# Savepoints are supported by MySQL and PostgreSQL. SQLite3 version >= '3.6.8'
|
141
212
|
# supports savepoints.
|
142
213
|
#
|
@@ -188,29 +259,25 @@ module ActiveRecord
|
|
188
259
|
# You should consult the documentation for your database to understand the
|
189
260
|
# semantics of these different levels:
|
190
261
|
#
|
191
|
-
# *
|
192
|
-
# * https://dev.mysql.com/doc/refman/5.
|
262
|
+
# * https://www.postgresql.org/docs/current/static/transaction-iso.html
|
263
|
+
# * https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
|
193
264
|
#
|
194
|
-
# An
|
265
|
+
# An ActiveRecord::TransactionIsolationError will be raised if:
|
195
266
|
#
|
196
267
|
# * The adapter does not support setting the isolation level
|
197
268
|
# * You are joining an existing open transaction
|
198
269
|
# * You are creating a nested (savepoint) transaction
|
199
270
|
#
|
200
|
-
# The
|
201
|
-
# isolation level.
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
options.assert_valid_keys :requires_new, :joinable, :isolation
|
206
|
-
|
207
|
-
if !options[:requires_new] && current_transaction.joinable?
|
208
|
-
if options[:isolation]
|
271
|
+
# The mysql2 and postgresql adapters support setting the transaction
|
272
|
+
# isolation level.
|
273
|
+
def transaction(requires_new: nil, isolation: nil, joinable: true)
|
274
|
+
if !requires_new && current_transaction.joinable?
|
275
|
+
if isolation
|
209
276
|
raise ActiveRecord::TransactionIsolationError, "cannot set isolation when joining a transaction"
|
210
277
|
end
|
211
278
|
yield
|
212
279
|
else
|
213
|
-
transaction_manager.within_new_transaction(
|
280
|
+
transaction_manager.within_new_transaction(isolation: isolation, joinable: joinable) { yield }
|
214
281
|
end
|
215
282
|
rescue ActiveRecord::Rollback
|
216
283
|
# rollbacks are silently swallowed
|
@@ -218,14 +285,16 @@ module ActiveRecord
|
|
218
285
|
|
219
286
|
attr_reader :transaction_manager #:nodoc:
|
220
287
|
|
221
|
-
delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
|
288
|
+
delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
|
289
|
+
:commit_transaction, :rollback_transaction, :materialize_transactions,
|
290
|
+
:disable_lazy_transactions!, :enable_lazy_transactions!, to: :transaction_manager
|
222
291
|
|
223
292
|
def transaction_open?
|
224
293
|
current_transaction.open?
|
225
294
|
end
|
226
295
|
|
227
296
|
def reset_transaction #:nodoc:
|
228
|
-
@transaction_manager = TransactionManager.new(self)
|
297
|
+
@transaction_manager = ConnectionAdapters::TransactionManager.new(self)
|
229
298
|
end
|
230
299
|
|
231
300
|
# Register a record with the current transaction so that its after_commit and after_rollback callbacks
|
@@ -234,6 +303,10 @@ module ActiveRecord
|
|
234
303
|
current_transaction.add_record(record)
|
235
304
|
end
|
236
305
|
|
306
|
+
def transaction_state
|
307
|
+
current_transaction.state
|
308
|
+
end
|
309
|
+
|
237
310
|
# Begins the transaction (and turns off auto-committing).
|
238
311
|
def begin_db_transaction() end
|
239
312
|
|
@@ -258,7 +331,15 @@ module ActiveRecord
|
|
258
331
|
|
259
332
|
# Rolls back the transaction (and turns on auto-committing). Must be
|
260
333
|
# done if the transaction block raises an exception or returns false.
|
261
|
-
def rollback_db_transaction
|
334
|
+
def rollback_db_transaction
|
335
|
+
exec_rollback_db_transaction
|
336
|
+
end
|
337
|
+
|
338
|
+
def exec_rollback_db_transaction() end #:nodoc:
|
339
|
+
|
340
|
+
def rollback_to_savepoint(name = nil)
|
341
|
+
exec_rollback_to_savepoint(name)
|
342
|
+
end
|
262
343
|
|
263
344
|
def default_sequence_name(table, column)
|
264
345
|
nil
|
@@ -271,102 +352,166 @@ module ActiveRecord
|
|
271
352
|
|
272
353
|
# Inserts the given fixture into the table. Overridden in adapters that require
|
273
354
|
# something beyond a simple insert (eg. Oracle).
|
355
|
+
# Most of adapters should implement `insert_fixtures_set` that leverages bulk SQL insert.
|
356
|
+
# We keep this method to provide fallback
|
357
|
+
# for databases like sqlite that do not support bulk inserts.
|
274
358
|
def insert_fixture(fixture, table_name)
|
275
|
-
|
359
|
+
execute(build_fixture_sql(Array.wrap(fixture), table_name), "Fixture Insert")
|
360
|
+
end
|
276
361
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
end
|
362
|
+
def insert_fixtures_set(fixture_set, tables_to_delete = [])
|
363
|
+
fixture_inserts = build_fixture_statements(fixture_set)
|
364
|
+
table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
|
365
|
+
statements = table_deletes + fixture_inserts
|
282
366
|
|
283
|
-
|
367
|
+
with_multi_statements do
|
368
|
+
disable_referential_integrity do
|
369
|
+
transaction(requires_new: true) do
|
370
|
+
execute_batch(statements, "Fixtures Load")
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
284
374
|
end
|
285
375
|
|
286
|
-
def empty_insert_statement_value
|
376
|
+
def empty_insert_statement_value(primary_key = nil)
|
287
377
|
"DEFAULT VALUES"
|
288
378
|
end
|
289
379
|
|
290
380
|
# Sanitizes the given LIMIT parameter in order to prevent SQL injection.
|
291
381
|
#
|
292
382
|
# The +limit+ may be anything that can evaluate to a string via #to_s. It
|
293
|
-
# should look like an integer, or
|
294
|
-
# an Arel SQL literal.
|
383
|
+
# should look like an integer, or an Arel SQL literal.
|
295
384
|
#
|
296
385
|
# Returns Integer and Arel::Nodes::SqlLiteral limits as is.
|
297
|
-
# Returns the sanitized limit parameter, either as an integer, or as a
|
298
|
-
# string which contains a comma-delimited list of integers.
|
299
386
|
def sanitize_limit(limit)
|
300
387
|
if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
|
301
388
|
limit
|
302
|
-
elsif limit.to_s.include?(',')
|
303
|
-
Arel.sql limit.to_s.split(',').map{ |i| Integer(i) }.join(',')
|
304
389
|
else
|
305
390
|
Integer(limit)
|
306
391
|
end
|
307
392
|
end
|
308
393
|
|
309
|
-
#
|
310
|
-
#
|
311
|
-
#
|
312
|
-
def
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
394
|
+
# Fixture value is quoted by Arel, however scalar values
|
395
|
+
# are not quotable. In this case we want to convert
|
396
|
+
# the column value to YAML.
|
397
|
+
def with_yaml_fallback(value) # :nodoc:
|
398
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
399
|
+
YAML.dump(value)
|
400
|
+
else
|
401
|
+
value
|
402
|
+
end
|
317
403
|
end
|
318
404
|
|
319
|
-
|
320
|
-
|
405
|
+
private
|
406
|
+
def execute_batch(statements, name = nil)
|
407
|
+
statements.each do |statement|
|
408
|
+
execute(statement, name)
|
409
|
+
end
|
410
|
+
end
|
321
411
|
|
322
|
-
|
323
|
-
|
412
|
+
DEFAULT_INSERT_VALUE = Arel.sql("DEFAULT").freeze
|
413
|
+
private_constant :DEFAULT_INSERT_VALUE
|
324
414
|
|
325
|
-
|
415
|
+
def default_insert_value(column)
|
416
|
+
DEFAULT_INSERT_VALUE
|
417
|
+
end
|
326
418
|
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
419
|
+
def build_fixture_sql(fixtures, table_name)
|
420
|
+
columns = schema_cache.columns_hash(table_name)
|
421
|
+
|
422
|
+
values_list = fixtures.map do |fixture|
|
423
|
+
fixture = fixture.stringify_keys
|
424
|
+
|
425
|
+
unknown_columns = fixture.keys - columns.keys
|
426
|
+
if unknown_columns.any?
|
427
|
+
raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
|
428
|
+
end
|
429
|
+
|
430
|
+
columns.map do |name, column|
|
431
|
+
if fixture.key?(name)
|
432
|
+
type = lookup_cast_type_from_column(column)
|
433
|
+
with_yaml_fallback(type.serialize(fixture[name]))
|
434
|
+
else
|
435
|
+
default_insert_value(column)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
table = Arel::Table.new(table_name)
|
441
|
+
manager = Arel::InsertManager.new
|
442
|
+
manager.into(table)
|
443
|
+
|
444
|
+
if values_list.size == 1
|
445
|
+
values = values_list.shift
|
446
|
+
new_values = []
|
447
|
+
columns.each_key.with_index { |column, i|
|
448
|
+
unless values[i].equal?(DEFAULT_INSERT_VALUE)
|
449
|
+
new_values << values[i]
|
450
|
+
manager.columns << table[column]
|
451
|
+
end
|
452
|
+
}
|
453
|
+
values_list << new_values
|
454
|
+
else
|
455
|
+
columns.each_key { |column| manager.columns << table[column] }
|
456
|
+
end
|
457
|
+
|
458
|
+
manager.values = manager.create_values_list(values_list)
|
459
|
+
visitor.compile(manager.ast)
|
332
460
|
end
|
333
461
|
|
334
|
-
|
335
|
-
|
336
|
-
|
462
|
+
def build_fixture_statements(fixture_set)
|
463
|
+
fixture_set.map do |table_name, fixtures|
|
464
|
+
next if fixtures.empty?
|
465
|
+
build_fixture_sql(fixtures, table_name)
|
466
|
+
end.compact
|
337
467
|
end
|
338
468
|
|
469
|
+
def build_truncate_statement(table_name)
|
470
|
+
"TRUNCATE TABLE #{quote_table_name(table_name)}"
|
471
|
+
end
|
339
472
|
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
473
|
+
def build_truncate_statements(table_names)
|
474
|
+
table_names.map do |table_name|
|
475
|
+
build_truncate_statement(table_name)
|
476
|
+
end
|
344
477
|
end
|
345
478
|
|
346
|
-
|
347
|
-
|
348
|
-
execute(sql, name)
|
479
|
+
def with_multi_statements
|
480
|
+
yield
|
349
481
|
end
|
350
482
|
|
351
|
-
|
352
|
-
|
353
|
-
update_sql(sql, name)
|
483
|
+
def combine_multi_statements(total_sql)
|
484
|
+
total_sql.join(";\n")
|
354
485
|
end
|
355
486
|
|
356
|
-
|
487
|
+
# Returns an ActiveRecord::Result instance.
|
488
|
+
def select(sql, name = nil, binds = [])
|
489
|
+
exec_query(sql, name, binds, prepare: false)
|
490
|
+
end
|
491
|
+
|
492
|
+
def select_prepared(sql, name = nil, binds = [])
|
493
|
+
exec_query(sql, name, binds, prepare: true)
|
494
|
+
end
|
495
|
+
|
496
|
+
def sql_for_insert(sql, pk, binds)
|
357
497
|
[sql, binds]
|
358
498
|
end
|
359
499
|
|
360
500
|
def last_inserted_id(result)
|
361
|
-
|
501
|
+
single_value_from_rows(result.rows)
|
502
|
+
end
|
503
|
+
|
504
|
+
def single_value_from_rows(rows)
|
505
|
+
row = rows.first
|
362
506
|
row && row.first
|
363
507
|
end
|
364
508
|
|
365
|
-
def
|
366
|
-
if relation.is_a?(Relation)
|
367
|
-
relation
|
509
|
+
def arel_from_relation(relation)
|
510
|
+
if relation.is_a?(Relation)
|
511
|
+
relation.arel
|
512
|
+
else
|
513
|
+
relation
|
368
514
|
end
|
369
|
-
[relation, binds]
|
370
515
|
end
|
371
516
|
end
|
372
517
|
end
|