activerecord 5.1.7 → 5.2.0.beta1
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 +221 -900
- data/README.rdoc +3 -3
- data/examples/performance.rb +2 -0
- data/examples/simple.rb +2 -0
- data/lib/active_record.rb +10 -3
- data/lib/active_record/aggregations.rb +2 -0
- data/lib/active_record/association_relation.rb +2 -0
- data/lib/active_record/associations.rb +13 -42
- data/lib/active_record/associations/alias_tracker.rb +17 -17
- data/lib/active_record/associations/association.rb +11 -22
- data/lib/active_record/associations/association_scope.rb +32 -44
- data/lib/active_record/associations/belongs_to_association.rb +6 -4
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -1
- data/lib/active_record/associations/builder/association.rb +2 -5
- data/lib/active_record/associations/builder/belongs_to.rb +7 -12
- data/lib/active_record/associations/builder/collection_association.rb +1 -1
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
- data/lib/active_record/associations/builder/has_many.rb +2 -0
- data/lib/active_record/associations/builder/has_one.rb +2 -0
- data/lib/active_record/associations/builder/singular_association.rb +2 -0
- data/lib/active_record/associations/collection_association.rb +41 -33
- data/lib/active_record/associations/collection_proxy.rb +11 -14
- data/lib/active_record/associations/foreign_association.rb +2 -0
- data/lib/active_record/associations/has_many_association.rb +4 -2
- data/lib/active_record/associations/has_many_through_association.rb +4 -2
- data/lib/active_record/associations/has_one_association.rb +3 -1
- data/lib/active_record/associations/has_one_through_association.rb +3 -1
- data/lib/active_record/associations/join_dependency.rb +22 -40
- data/lib/active_record/associations/join_dependency/join_association.rb +17 -56
- data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
- data/lib/active_record/associations/join_dependency/join_part.rb +2 -9
- data/lib/active_record/associations/preloader.rb +17 -37
- data/lib/active_record/associations/preloader/association.rb +42 -58
- data/lib/active_record/associations/preloader/through_association.rb +71 -79
- data/lib/active_record/associations/singular_association.rb +14 -10
- data/lib/active_record/associations/through_association.rb +3 -1
- data/lib/active_record/attribute_assignment.rb +2 -0
- data/lib/active_record/attribute_decorators.rb +3 -2
- data/lib/active_record/attribute_methods.rb +47 -7
- data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
- data/lib/active_record/attribute_methods/dirty.rb +25 -214
- data/lib/active_record/attribute_methods/primary_key.rb +7 -6
- data/lib/active_record/attribute_methods/query.rb +2 -0
- data/lib/active_record/attribute_methods/read.rb +8 -2
- data/lib/active_record/attribute_methods/serialization.rb +23 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
- data/lib/active_record/attribute_methods/write.rb +21 -9
- data/lib/active_record/attributes.rb +7 -6
- data/lib/active_record/autosave_association.rb +5 -11
- data/lib/active_record/base.rb +2 -0
- data/lib/active_record/callbacks.rb +6 -8
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +2 -0
- data/lib/active_record/collection_cache_key.rb +10 -5
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +110 -35
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +120 -28
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +7 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +14 -33
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +13 -5
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +40 -2
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +103 -63
- data/lib/active_record/connection_adapters/abstract/transaction.rb +45 -9
- data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -90
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +75 -138
- data/lib/active_record/connection_adapters/column.rb +3 -1
- data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -6
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +91 -1
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
- data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
- 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 +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +10 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +11 -7
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +79 -65
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +47 -82
- data/lib/active_record/connection_adapters/schema_cache.rb +2 -0
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +19 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +71 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -89
- data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
- data/lib/active_record/connection_handling.rb +4 -2
- data/lib/active_record/core.rb +27 -57
- data/lib/active_record/counter_cache.rb +15 -12
- data/lib/active_record/define_callbacks.rb +5 -3
- data/lib/active_record/dynamic_matchers.rb +9 -9
- data/lib/active_record/enum.rb +15 -13
- data/lib/active_record/errors.rb +54 -21
- data/lib/active_record/explain.rb +3 -1
- data/lib/active_record/explain_registry.rb +2 -0
- data/lib/active_record/explain_subscriber.rb +2 -0
- data/lib/active_record/fixture_set/file.rb +2 -0
- data/lib/active_record/fixtures.rb +40 -24
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +6 -5
- data/lib/active_record/integration.rb +58 -19
- data/lib/active_record/internal_metadata.rb +2 -0
- data/lib/active_record/legacy_yaml_adapter.rb +3 -1
- data/lib/active_record/locking/optimistic.rb +31 -20
- data/lib/active_record/locking/pessimistic.rb +10 -7
- data/lib/active_record/log_subscriber.rb +2 -0
- data/lib/active_record/migration.rb +47 -21
- data/lib/active_record/migration/command_recorder.rb +11 -9
- data/lib/active_record/migration/compatibility.rb +20 -2
- data/lib/active_record/migration/join_table.rb +2 -0
- data/lib/active_record/model_schema.rb +29 -38
- data/lib/active_record/nested_attributes.rb +18 -6
- data/lib/active_record/no_touching.rb +3 -1
- data/lib/active_record/null_relation.rb +2 -0
- data/lib/active_record/persistence.rb +184 -40
- data/lib/active_record/query_cache.rb +17 -12
- data/lib/active_record/querying.rb +3 -1
- data/lib/active_record/railtie.rb +54 -1
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +2 -0
- data/lib/active_record/railties/databases.rake +41 -28
- data/lib/active_record/readonly_attributes.rb +3 -2
- data/lib/active_record/reflection.rb +100 -182
- data/lib/active_record/relation.rb +61 -193
- data/lib/active_record/relation/batches.rb +20 -5
- data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
- data/lib/active_record/relation/calculations.rb +40 -23
- data/lib/active_record/relation/delegation.rb +10 -27
- data/lib/active_record/relation/finder_methods.rb +53 -49
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +22 -19
- data/lib/active_record/relation/predicate_builder.rb +42 -79
- data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +54 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -6
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +9 -2
- data/lib/active_record/relation/query_methods.rb +80 -69
- data/lib/active_record/relation/record_fetch_warning.rb +2 -0
- data/lib/active_record/relation/spawn_methods.rb +2 -0
- data/lib/active_record/relation/where_clause.rb +50 -67
- data/lib/active_record/relation/where_clause_factory.rb +4 -46
- data/lib/active_record/result.rb +2 -0
- data/lib/active_record/runtime_registry.rb +2 -0
- data/lib/active_record/sanitization.rb +15 -9
- data/lib/active_record/schema.rb +3 -1
- data/lib/active_record/schema_dumper.rb +24 -23
- data/lib/active_record/schema_migration.rb +2 -0
- data/lib/active_record/scoping.rb +9 -8
- data/lib/active_record/scoping/default.rb +6 -7
- data/lib/active_record/scoping/named.rb +15 -7
- data/lib/active_record/secure_token.rb +2 -0
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +22 -12
- data/lib/active_record/store.rb +2 -0
- data/lib/active_record/suppressor.rb +2 -0
- data/lib/active_record/table_metadata.rb +3 -1
- data/lib/active_record/tasks/database_tasks.rb +23 -12
- data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
- data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
- data/lib/active_record/timestamp.rb +5 -12
- data/lib/active_record/touch_later.rb +2 -0
- data/lib/active_record/transactions.rb +9 -7
- data/lib/active_record/translation.rb +2 -0
- data/lib/active_record/type.rb +4 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -0
- 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 +2 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
- 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 +2 -4
- data/lib/active_record/type/text.rb +2 -0
- data/lib/active_record/type/time.rb +2 -0
- data/lib/active_record/type/type_map.rb +2 -0
- data/lib/active_record/type/unsigned_integer.rb +2 -0
- data/lib/active_record/type_caster.rb +2 -0
- data/lib/active_record/type_caster/connection.rb +2 -0
- data/lib/active_record/type_caster/map.rb +2 -0
- data/lib/active_record/validations.rb +2 -0
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +2 -0
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +2 -0
- data/lib/active_record/validations/uniqueness.rb +36 -6
- data/lib/active_record/version.rb +2 -0
- data/lib/rails/generators/active_record.rb +3 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +2 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +25 -38
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -15
- 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 -18
- data/lib/active_record/attribute.rb +0 -240
- data/lib/active_record/attribute/user_provided_default.rb +0 -30
- data/lib/active_record/attribute_mutation_tracker.rb +0 -122
- data/lib/active_record/attribute_set.rb +0 -113
- data/lib/active_record/attribute_set/builder.rb +0 -126
- data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
- 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/polymorphic_array_handler.rb +0 -59
- data/lib/active_record/type/internal/abstract_json.rb +0 -37
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/per_thread_registry"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -9,23 +11,23 @@ module ActiveRecord
|
|
9
11
|
include Named
|
10
12
|
end
|
11
13
|
|
12
|
-
module ClassMethods
|
13
|
-
def current_scope(skip_inherited_scope = false)
|
14
|
+
module ClassMethods # :nodoc:
|
15
|
+
def current_scope(skip_inherited_scope = false)
|
14
16
|
ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
|
15
17
|
end
|
16
18
|
|
17
|
-
def current_scope=(scope)
|
19
|
+
def current_scope=(scope)
|
18
20
|
ScopeRegistry.set_value_for(:current_scope, self, scope)
|
19
21
|
end
|
20
22
|
|
21
23
|
# Collects attributes from scopes that should be applied when creating
|
22
24
|
# an AR instance for the particular class this is called on.
|
23
|
-
def scope_attributes
|
25
|
+
def scope_attributes
|
24
26
|
all.scope_for_create
|
25
27
|
end
|
26
28
|
|
27
29
|
# Are there attributes associated with this scope?
|
28
|
-
def scope_attributes?
|
30
|
+
def scope_attributes?
|
29
31
|
current_scope
|
30
32
|
end
|
31
33
|
end
|
@@ -33,9 +35,8 @@ module ActiveRecord
|
|
33
35
|
def populate_with_current_scope_attributes # :nodoc:
|
34
36
|
return unless self.class.scope_attributes?
|
35
37
|
|
36
|
-
self.class.scope_attributes
|
37
|
-
|
38
|
-
end
|
38
|
+
attributes = self.class.scope_attributes
|
39
|
+
_assign_attributes(attributes) if attributes.any?
|
39
40
|
end
|
40
41
|
|
41
42
|
def initialize_internals_callback # :nodoc:
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Scoping
|
3
5
|
module Default
|
@@ -5,11 +7,8 @@ module ActiveRecord
|
|
5
7
|
|
6
8
|
included do
|
7
9
|
# Stores the default scope for the class.
|
8
|
-
class_attribute :default_scopes, instance_writer: false, instance_predicate: false
|
9
|
-
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false
|
10
|
-
|
11
|
-
self.default_scopes = []
|
12
|
-
self.default_scope_override = nil
|
10
|
+
class_attribute :default_scopes, instance_writer: false, instance_predicate: false, default: []
|
11
|
+
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false, default: nil
|
13
12
|
end
|
14
13
|
|
15
14
|
module ClassMethods
|
@@ -112,7 +111,7 @@ module ActiveRecord
|
|
112
111
|
# The user has defined their own default scope method, so call that
|
113
112
|
evaluate_default_scope do
|
114
113
|
if scope = default_scope
|
115
|
-
(base_rel ||= relation).merge(scope)
|
114
|
+
(base_rel ||= relation).merge!(scope)
|
116
115
|
end
|
117
116
|
end
|
118
117
|
elsif default_scopes.any?
|
@@ -120,7 +119,7 @@ module ActiveRecord
|
|
120
119
|
evaluate_default_scope do
|
121
120
|
default_scopes.inject(base_rel) do |default_scope, scope|
|
122
121
|
scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
|
123
|
-
default_scope.merge(base_rel.instance_exec(&scope))
|
122
|
+
default_scope.merge!(base_rel.instance_exec(&scope))
|
124
123
|
end
|
125
124
|
end
|
126
125
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/array"
|
2
4
|
require "active_support/core_ext/hash/except"
|
3
5
|
require "active_support/core_ext/kernel/singleton_class"
|
@@ -22,8 +24,14 @@ module ActiveRecord
|
|
22
24
|
# You can define a scope that applies to all finders using
|
23
25
|
# {default_scope}[rdoc-ref:Scoping::Default::ClassMethods#default_scope].
|
24
26
|
def all
|
27
|
+
current_scope = self.current_scope
|
28
|
+
|
25
29
|
if current_scope
|
26
|
-
current_scope.
|
30
|
+
if self == current_scope.klass
|
31
|
+
current_scope.clone
|
32
|
+
else
|
33
|
+
relation.merge!(current_scope)
|
34
|
+
end
|
27
35
|
else
|
28
36
|
default_scoped
|
29
37
|
end
|
@@ -168,17 +176,17 @@ module ActiveRecord
|
|
168
176
|
|
169
177
|
if body.respond_to?(:to_proc)
|
170
178
|
singleton_class.send(:define_method, name) do |*args|
|
171
|
-
scope = all
|
179
|
+
scope = all
|
180
|
+
scope = scope.instance_exec(*args, &body) || scope
|
172
181
|
scope = scope.extending(extension) if extension
|
173
|
-
|
174
|
-
scope || all
|
182
|
+
scope
|
175
183
|
end
|
176
184
|
else
|
177
185
|
singleton_class.send(:define_method, name) do |*args|
|
178
|
-
scope = all
|
186
|
+
scope = all
|
187
|
+
scope = scope.scoping { body.call(*args) || scope }
|
179
188
|
scope = scope.extending(extension) if extension
|
180
|
-
|
181
|
-
scope || all
|
189
|
+
scope
|
182
190
|
end
|
183
191
|
end
|
184
192
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# Statement cache is used to cache a single statement in order to avoid creating the AST again.
|
3
5
|
# Initializing the cache is done by passing the statement in the create block:
|
@@ -9,7 +11,7 @@ module ActiveRecord
|
|
9
11
|
# The cached statement is executed by using the
|
10
12
|
# {connection.execute}[rdoc-ref:ConnectionAdapters::DatabaseStatements#execute] method:
|
11
13
|
#
|
12
|
-
# cache.execute([], Book
|
14
|
+
# cache.execute([], Book.connection)
|
13
15
|
#
|
14
16
|
# The relation returned by the block is cached, and for each
|
15
17
|
# {execute}[rdoc-ref:ConnectionAdapters::DatabaseStatements#execute]
|
@@ -24,7 +26,7 @@ module ActiveRecord
|
|
24
26
|
#
|
25
27
|
# And pass the bind values as the first argument of +execute+ call.
|
26
28
|
#
|
27
|
-
# cache.execute(["my book"], Book
|
29
|
+
# cache.execute(["my book"], Book.connection)
|
28
30
|
class StatementCache # :nodoc:
|
29
31
|
class Substitute; end # :nodoc:
|
30
32
|
|
@@ -85,27 +87,35 @@ module ActiveRecord
|
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
88
|
-
attr_reader :bind_map, :query_builder
|
89
|
-
|
90
90
|
def self.create(connection, block = Proc.new)
|
91
|
-
relation
|
92
|
-
|
93
|
-
|
94
|
-
new
|
91
|
+
relation = block.call Params.new
|
92
|
+
query_builder, binds = connection.cacheable_query(self, relation.arel)
|
93
|
+
bind_map = BindMap.new(binds)
|
94
|
+
new(query_builder, bind_map, relation.klass)
|
95
95
|
end
|
96
96
|
|
97
|
-
def initialize(query_builder, bind_map)
|
97
|
+
def initialize(query_builder, bind_map, klass)
|
98
98
|
@query_builder = query_builder
|
99
|
-
@bind_map
|
99
|
+
@bind_map = bind_map
|
100
|
+
@klass = klass
|
100
101
|
end
|
101
102
|
|
102
|
-
def execute(params,
|
103
|
+
def execute(params, connection, &block)
|
103
104
|
bind_values = bind_map.bind params
|
104
105
|
|
105
106
|
sql = query_builder.sql_for bind_values, connection
|
106
107
|
|
107
108
|
klass.find_by_sql(sql, bind_values, preparable: true, &block)
|
108
109
|
end
|
109
|
-
|
110
|
+
|
111
|
+
def self.unsupported_value?(value)
|
112
|
+
case value
|
113
|
+
when NilClass, Array, Range, Hash, Relation, Base then true
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
attr_reader :query_builder, :bind_map, :klass
|
110
120
|
end
|
111
121
|
end
|
data/lib/active_record/store.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
class TableMetadata # :nodoc:
|
3
|
-
delegate :foreign_type, :foreign_key, to: :association, prefix: true
|
5
|
+
delegate :foreign_type, :foreign_key, :join_keys, :join_foreign_key, to: :association, prefix: true
|
4
6
|
delegate :association_primary_key, to: :association
|
5
7
|
|
6
8
|
def initialize(klass, arel_table, association = nil)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Tasks # :nodoc:
|
3
5
|
class DatabaseAlreadyExists < StandardError; end # :nodoc:
|
@@ -71,9 +73,9 @@ module ActiveRecord
|
|
71
73
|
@tasks[pattern] = task
|
72
74
|
end
|
73
75
|
|
74
|
-
register_task(/mysql/, ActiveRecord::Tasks::MySQLDatabaseTasks)
|
75
|
-
register_task(/postgresql/, ActiveRecord::Tasks::PostgreSQLDatabaseTasks)
|
76
|
-
register_task(/sqlite/, ActiveRecord::Tasks::SQLiteDatabaseTasks)
|
76
|
+
register_task(/mysql/, "ActiveRecord::Tasks::MySQLDatabaseTasks")
|
77
|
+
register_task(/postgresql/, "ActiveRecord::Tasks::PostgreSQLDatabaseTasks")
|
78
|
+
register_task(/sqlite/, "ActiveRecord::Tasks::SQLiteDatabaseTasks")
|
77
79
|
|
78
80
|
def db_dir
|
79
81
|
@db_dir ||= Rails.application.config.paths["db"].first
|
@@ -120,7 +122,7 @@ module ActiveRecord
|
|
120
122
|
$stderr.puts "Database '#{configuration['database']}' already exists"
|
121
123
|
rescue Exception => error
|
122
124
|
$stderr.puts error
|
123
|
-
$stderr.puts "Couldn't create
|
125
|
+
$stderr.puts "Couldn't create database for #{configuration.inspect}"
|
124
126
|
raise
|
125
127
|
end
|
126
128
|
|
@@ -162,13 +164,12 @@ module ActiveRecord
|
|
162
164
|
end
|
163
165
|
|
164
166
|
def migrate
|
165
|
-
|
167
|
+
check_target_version
|
166
168
|
|
167
|
-
verbose = ENV["VERBOSE"] ? ENV["VERBOSE"]
|
168
|
-
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
169
|
+
verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] != "false" : true
|
169
170
|
scope = ENV["SCOPE"]
|
170
171
|
verbose_was, Migration.verbose = Migration.verbose, verbose
|
171
|
-
Migrator.migrate(migrations_paths,
|
172
|
+
Migrator.migrate(migrations_paths, target_version) do |migration|
|
172
173
|
scope.blank? || scope == migration.scope
|
173
174
|
end
|
174
175
|
ActiveRecord::Base.clear_cache!
|
@@ -176,6 +177,16 @@ module ActiveRecord
|
|
176
177
|
Migration.verbose = verbose_was
|
177
178
|
end
|
178
179
|
|
180
|
+
def check_target_version
|
181
|
+
if target_version && !(Migration::MigrationFilenameRegexp.match?(ENV["VERSION"]) || /\A\d+\z/.match?(ENV["VERSION"]))
|
182
|
+
raise "Invalid format of target version: `VERSION=#{ENV['VERSION']}`"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def target_version
|
187
|
+
ENV["VERSION"].to_i if ENV["VERSION"] && !ENV["VERSION"].empty?
|
188
|
+
end
|
189
|
+
|
179
190
|
def charset_current(environment = env)
|
180
191
|
charset ActiveRecord::Base.configurations[environment]
|
181
192
|
end
|
@@ -259,7 +270,7 @@ module ActiveRecord
|
|
259
270
|
|
260
271
|
def check_schema_file(filename)
|
261
272
|
unless File.exist?(filename)
|
262
|
-
message = %{#{filename} doesn't exist yet. Run `rails db:migrate` to create it, then try again.}
|
273
|
+
message = %{#{filename} doesn't exist yet. Run `rails db:migrate` to create it, then try again.}.dup
|
263
274
|
message << %{ If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded.} if defined?(::Rails.root)
|
264
275
|
Kernel.abort message
|
265
276
|
end
|
@@ -288,11 +299,11 @@ module ActiveRecord
|
|
288
299
|
private
|
289
300
|
|
290
301
|
def class_for_adapter(adapter)
|
291
|
-
|
292
|
-
unless
|
302
|
+
_key, task = @tasks.each_pair.detect { |pattern, _task| adapter[pattern] }
|
303
|
+
unless task
|
293
304
|
raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
|
294
305
|
end
|
295
|
-
|
306
|
+
task.is_a?(String) ? task.constantize : task
|
296
307
|
end
|
297
308
|
|
298
309
|
def each_current_configuration(environment)
|
@@ -1,8 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Tasks # :nodoc:
|
3
5
|
class MySQLDatabaseTasks # :nodoc:
|
4
|
-
ACCESS_DENIED_ERROR = 1045
|
5
|
-
|
6
6
|
delegate :connection, :establish_connection, to: ActiveRecord::Base
|
7
7
|
|
8
8
|
def initialize(configuration)
|
@@ -19,20 +19,6 @@ module ActiveRecord
|
|
19
19
|
else
|
20
20
|
raise
|
21
21
|
end
|
22
|
-
rescue error_class => error
|
23
|
-
if error.respond_to?(:errno) && error.errno == ACCESS_DENIED_ERROR
|
24
|
-
$stdout.print error.message
|
25
|
-
establish_connection root_configuration_without_database
|
26
|
-
connection.create_database configuration["database"], creation_options
|
27
|
-
if configuration["username"] != "root"
|
28
|
-
connection.execute grant_statement.gsub(/\s+/, " ").strip
|
29
|
-
end
|
30
|
-
establish_connection configuration
|
31
|
-
else
|
32
|
-
$stderr.puts error.inspect
|
33
|
-
$stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
|
34
|
-
$stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration["encoding"]
|
35
|
-
end
|
36
22
|
end
|
37
23
|
|
38
24
|
def drop
|
@@ -59,6 +45,12 @@ module ActiveRecord
|
|
59
45
|
args.concat(["--no-data"])
|
60
46
|
args.concat(["--routines"])
|
61
47
|
args.concat(["--skip-comments"])
|
48
|
+
|
49
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
50
|
+
if ignore_tables.any?
|
51
|
+
args += ignore_tables.map { |table| "--ignore-table=#{configuration['database']}.#{table}" }
|
52
|
+
end
|
53
|
+
|
62
54
|
args.concat(["#{configuration['database']}"])
|
63
55
|
args.unshift(*extra_flags) if extra_flags
|
64
56
|
|
@@ -91,37 +83,6 @@ module ActiveRecord
|
|
91
83
|
end
|
92
84
|
end
|
93
85
|
|
94
|
-
def error_class
|
95
|
-
if configuration["adapter"].include?("jdbc")
|
96
|
-
require "active_record/railties/jdbcmysql_error"
|
97
|
-
ArJdbcMySQL::Error
|
98
|
-
elsif defined?(Mysql2)
|
99
|
-
Mysql2::Error
|
100
|
-
else
|
101
|
-
StandardError
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def grant_statement
|
106
|
-
<<-SQL
|
107
|
-
GRANT ALL PRIVILEGES ON `#{configuration['database']}`.*
|
108
|
-
TO '#{configuration['username']}'@'localhost'
|
109
|
-
IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
110
|
-
SQL
|
111
|
-
end
|
112
|
-
|
113
|
-
def root_configuration_without_database
|
114
|
-
configuration_without_database.merge(
|
115
|
-
"username" => "root",
|
116
|
-
"password" => root_password
|
117
|
-
)
|
118
|
-
end
|
119
|
-
|
120
|
-
def root_password
|
121
|
-
$stdout.print "Please provide the root password for your MySQL installation\n>"
|
122
|
-
$stdin.gets.strip
|
123
|
-
end
|
124
|
-
|
125
86
|
def prepare_command_options
|
126
87
|
args = {
|
127
88
|
"host" => "--host",
|
@@ -145,7 +106,7 @@ IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
|
145
106
|
end
|
146
107
|
|
147
108
|
def run_cmd_error(cmd, args, action)
|
148
|
-
msg = "failed to execute: `#{cmd}`\n"
|
109
|
+
msg = "failed to execute: `#{cmd}`\n".dup
|
149
110
|
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
150
111
|
msg
|
151
112
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "tempfile"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -66,6 +68,12 @@ module ActiveRecord
|
|
66
68
|
"--schema=#{part.strip}"
|
67
69
|
end
|
68
70
|
end
|
71
|
+
|
72
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
73
|
+
if ignore_tables.any?
|
74
|
+
args += ignore_tables.flat_map { |table| ["-T", table] }
|
75
|
+
end
|
76
|
+
|
69
77
|
args << configuration["database"]
|
70
78
|
run_cmd("pg_dump", args, "dumping")
|
71
79
|
remove_sql_header_comments(filename)
|
@@ -109,7 +117,7 @@ module ActiveRecord
|
|
109
117
|
end
|
110
118
|
|
111
119
|
def run_cmd_error(cmd, args, action)
|
112
|
-
msg = "failed to execute:\n"
|
120
|
+
msg = "failed to execute:\n".dup
|
113
121
|
msg << "#{cmd} #{args.join(' ')}\n\n"
|
114
122
|
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
115
123
|
msg
|
@@ -128,7 +136,7 @@ module ActiveRecord
|
|
128
136
|
ensure
|
129
137
|
tempfile.close
|
130
138
|
end
|
131
|
-
FileUtils.
|
139
|
+
FileUtils.cp(tempfile.path, filename)
|
132
140
|
end
|
133
141
|
end
|
134
142
|
end
|