activerecord 4.2.11.3 → 5.0.0
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 +1281 -1204
- data/MIT-LICENSE +2 -2
- data/README.rdoc +7 -8
- data/examples/performance.rb +2 -3
- data/examples/simple.rb +0 -1
- data/lib/active_record/aggregations.rb +35 -24
- data/lib/active_record/association_relation.rb +3 -3
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +11 -9
- data/lib/active_record/associations/association_scope.rb +73 -102
- data/lib/active_record/associations/belongs_to_association.rb +21 -32
- data/lib/active_record/associations/builder/association.rb +28 -34
- data/lib/active_record/associations/builder/belongs_to.rb +43 -18
- data/lib/active_record/associations/builder/collection_association.rb +7 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +14 -11
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +11 -6
- data/lib/active_record/associations/builder/singular_association.rb +3 -10
- data/lib/active_record/associations/collection_association.rb +49 -41
- data/lib/active_record/associations/collection_proxy.rb +67 -27
- data/lib/active_record/associations/foreign_association.rb +1 -1
- data/lib/active_record/associations/has_many_association.rb +20 -71
- data/lib/active_record/associations/has_many_through_association.rb +8 -47
- data/lib/active_record/associations/has_one_association.rb +12 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
- data/lib/active_record/associations/join_dependency.rb +29 -19
- data/lib/active_record/associations/preloader/association.rb +46 -52
- data/lib/active_record/associations/preloader/collection_association.rb +0 -6
- data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
- data/lib/active_record/associations/preloader/has_one.rb +0 -8
- data/lib/active_record/associations/preloader/through_association.rb +27 -14
- data/lib/active_record/associations/preloader.rb +14 -4
- data/lib/active_record/associations/singular_association.rb +7 -1
- data/lib/active_record/associations/through_association.rb +11 -3
- data/lib/active_record/associations.rb +317 -209
- data/lib/active_record/attribute/user_provided_default.rb +28 -0
- data/lib/active_record/attribute.rb +68 -18
- data/lib/active_record/attribute_assignment.rb +19 -140
- data/lib/active_record/attribute_decorators.rb +6 -5
- data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
- data/lib/active_record/attribute_methods/dirty.rb +46 -86
- data/lib/active_record/attribute_methods/primary_key.rb +2 -2
- data/lib/active_record/attribute_methods/query.rb +2 -2
- data/lib/active_record/attribute_methods/read.rb +31 -59
- data/lib/active_record/attribute_methods/serialization.rb +13 -16
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -14
- data/lib/active_record/attribute_methods/write.rb +13 -37
- data/lib/active_record/attribute_methods.rb +76 -47
- data/lib/active_record/attribute_mutation_tracker.rb +70 -0
- data/lib/active_record/attribute_set/builder.rb +6 -4
- data/lib/active_record/attribute_set.rb +30 -3
- data/lib/active_record/attributes.rb +199 -81
- data/lib/active_record/autosave_association.rb +49 -16
- data/lib/active_record/base.rb +32 -23
- data/lib/active_record/callbacks.rb +39 -43
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +20 -8
- data/lib/active_record/collection_cache_key.rb +40 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -182
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -61
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -10
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -185
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +380 -141
- data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
- data/lib/active_record/connection_adapters/abstract_adapter.rb +141 -59
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -370
- data/lib/active_record/connection_adapters/column.rb +28 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +29 -166
- data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +10 -72
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -148
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +248 -160
- data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +149 -192
- data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
- data/lib/active_record/connection_handling.rb +37 -14
- data/lib/active_record/core.rb +89 -107
- data/lib/active_record/counter_cache.rb +13 -24
- data/lib/active_record/dynamic_matchers.rb +1 -20
- data/lib/active_record/enum.rb +113 -76
- data/lib/active_record/errors.rb +87 -48
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +26 -5
- data/lib/active_record/fixtures.rb +76 -40
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +32 -40
- data/lib/active_record/integration.rb +4 -4
- data/lib/active_record/internal_metadata.rb +56 -0
- data/lib/active_record/legacy_yaml_adapter.rb +18 -2
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +15 -15
- data/lib/active_record/locking/pessimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +43 -21
- data/lib/active_record/migration/command_recorder.rb +59 -18
- data/lib/active_record/migration/compatibility.rb +126 -0
- data/lib/active_record/migration.rb +363 -133
- data/lib/active_record/model_schema.rb +129 -41
- data/lib/active_record/nested_attributes.rb +58 -29
- data/lib/active_record/null_relation.rb +16 -8
- data/lib/active_record/persistence.rb +121 -80
- data/lib/active_record/query_cache.rb +15 -18
- data/lib/active_record/querying.rb +10 -9
- data/lib/active_record/railtie.rb +23 -16
- data/lib/active_record/railties/controller_runtime.rb +1 -1
- data/lib/active_record/railties/databases.rake +69 -46
- data/lib/active_record/readonly_attributes.rb +1 -1
- data/lib/active_record/reflection.rb +282 -115
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- data/lib/active_record/relation/batches.rb +139 -34
- data/lib/active_record/relation/calculations.rb +79 -108
- data/lib/active_record/relation/delegation.rb +7 -20
- data/lib/active_record/relation/finder_methods.rb +163 -81
- data/lib/active_record/relation/from_clause.rb +32 -0
- data/lib/active_record/relation/merger.rb +16 -42
- data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +120 -107
- data/lib/active_record/relation/query_attribute.rb +19 -0
- data/lib/active_record/relation/query_methods.rb +308 -244
- data/lib/active_record/relation/record_fetch_warning.rb +49 -0
- data/lib/active_record/relation/spawn_methods.rb +4 -7
- data/lib/active_record/relation/where_clause.rb +174 -0
- data/lib/active_record/relation/where_clause_factory.rb +38 -0
- data/lib/active_record/relation.rb +176 -116
- data/lib/active_record/result.rb +4 -3
- data/lib/active_record/runtime_registry.rb +1 -1
- data/lib/active_record/sanitization.rb +95 -66
- data/lib/active_record/schema.rb +26 -22
- data/lib/active_record/schema_dumper.rb +62 -38
- data/lib/active_record/schema_migration.rb +11 -14
- data/lib/active_record/scoping/default.rb +23 -9
- data/lib/active_record/scoping/named.rb +49 -28
- data/lib/active_record/scoping.rb +32 -15
- data/lib/active_record/secure_token.rb +38 -0
- data/lib/active_record/serialization.rb +2 -4
- data/lib/active_record/statement_cache.rb +16 -14
- data/lib/active_record/store.rb +8 -3
- data/lib/active_record/suppressor.rb +58 -0
- data/lib/active_record/table_metadata.rb +68 -0
- data/lib/active_record/tasks/database_tasks.rb +57 -43
- data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
- data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
- data/lib/active_record/timestamp.rb +20 -9
- data/lib/active_record/touch_later.rb +58 -0
- data/lib/active_record/transactions.rb +138 -56
- data/lib/active_record/type/adapter_specific_registry.rb +130 -0
- data/lib/active_record/type/date.rb +2 -45
- data/lib/active_record/type/date_time.rb +2 -49
- data/lib/active_record/type/internal/abstract_json.rb +29 -0
- data/lib/active_record/type/internal/timezone.rb +15 -0
- data/lib/active_record/type/serialized.rb +15 -14
- data/lib/active_record/type/time.rb +10 -16
- data/lib/active_record/type/type_map.rb +4 -4
- data/lib/active_record/type.rb +66 -17
- data/lib/active_record/type_caster/connection.rb +29 -0
- data/lib/active_record/type_caster/map.rb +19 -0
- data/lib/active_record/type_caster.rb +7 -0
- data/lib/active_record/validations/absence.rb +23 -0
- data/lib/active_record/validations/associated.rb +10 -3
- data/lib/active_record/validations/length.rb +24 -0
- data/lib/active_record/validations/presence.rb +11 -12
- data/lib/active_record/validations/uniqueness.rb +30 -29
- data/lib/active_record/validations.rb +33 -32
- data/lib/active_record.rb +8 -4
- data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
- data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -1
- data/lib/rails/generators/active_record/migration.rb +7 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
- data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
- metadata +59 -34
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decimal_without_scale.rb +0 -11
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/text.rb +0 -11
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/unsigned_integer.rb +0 -15
- data/lib/active_record/type/value.rb +0 -110
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
class DatabaseAlreadyExists < StandardError; end # :nodoc:
|
6
6
|
class DatabaseNotSupported < StandardError; end # :nodoc:
|
7
7
|
|
8
|
-
#
|
8
|
+
# ActiveRecord::Tasks::DatabaseTasks is a utility class, which encapsulates
|
9
9
|
# logic behind common tasks used to manage database and migrations.
|
10
10
|
#
|
11
11
|
# The tasks defined here are used with Rake tasks provided by Active Record.
|
@@ -18,15 +18,15 @@ module ActiveRecord
|
|
18
18
|
#
|
19
19
|
# The possible config values are:
|
20
20
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
21
|
+
# * +env+: current environment (like Rails.env).
|
22
|
+
# * +database_configuration+: configuration of your databases (as in +config/database.yml+).
|
23
|
+
# * +db_dir+: your +db+ directory.
|
24
|
+
# * +fixtures_path+: a path to fixtures directory.
|
25
|
+
# * +migrations_paths+: a list of paths to directories with migrations.
|
26
|
+
# * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
|
27
|
+
# * +root+: a path to the root of the application.
|
28
28
|
#
|
29
|
-
# Example usage of
|
29
|
+
# Example usage of DatabaseTasks outside Rails could look as such:
|
30
30
|
#
|
31
31
|
# include ActiveRecord::Tasks
|
32
32
|
# DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
|
@@ -42,6 +42,22 @@ module ActiveRecord
|
|
42
42
|
|
43
43
|
LOCAL_HOSTS = ['127.0.0.1', 'localhost']
|
44
44
|
|
45
|
+
def check_protected_environments!
|
46
|
+
unless ENV['DISABLE_DATABASE_ENVIRONMENT_CHECK']
|
47
|
+
current = ActiveRecord::Migrator.current_environment
|
48
|
+
stored = ActiveRecord::Migrator.last_stored_environment
|
49
|
+
|
50
|
+
if ActiveRecord::Migrator.protected_environment?
|
51
|
+
raise ActiveRecord::ProtectedEnvironmentError.new(stored)
|
52
|
+
end
|
53
|
+
|
54
|
+
if stored && stored != current
|
55
|
+
raise ActiveRecord::EnvironmentMismatchError.new(current: current, stored: stored)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
rescue ActiveRecord::NoDatabaseError
|
59
|
+
end
|
60
|
+
|
45
61
|
def register_task(pattern, task)
|
46
62
|
@tasks ||= {}
|
47
63
|
@tasks[pattern] = task
|
@@ -91,15 +107,21 @@ module ActiveRecord
|
|
91
107
|
def create(*arguments)
|
92
108
|
configuration = arguments.first
|
93
109
|
class_for_adapter(configuration['adapter']).new(*arguments).create
|
110
|
+
$stdout.puts "Created database '#{configuration['database']}'"
|
94
111
|
rescue DatabaseAlreadyExists
|
95
|
-
$stderr.puts "#{configuration['database']} already exists"
|
112
|
+
$stderr.puts "Database '#{configuration['database']}' already exists"
|
96
113
|
rescue Exception => error
|
97
|
-
$stderr.puts error
|
114
|
+
$stderr.puts error
|
98
115
|
$stderr.puts "Couldn't create database for #{configuration.inspect}"
|
116
|
+
raise
|
99
117
|
end
|
100
118
|
|
101
119
|
def create_all
|
120
|
+
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
|
102
121
|
each_local_configuration { |configuration| create configuration }
|
122
|
+
if old_pool
|
123
|
+
ActiveRecord::Base.connection_handler.establish_connection(old_pool.spec)
|
124
|
+
end
|
103
125
|
end
|
104
126
|
|
105
127
|
def create_current(environment = env)
|
@@ -112,11 +134,13 @@ module ActiveRecord
|
|
112
134
|
def drop(*arguments)
|
113
135
|
configuration = arguments.first
|
114
136
|
class_for_adapter(configuration['adapter']).new(*arguments).drop
|
137
|
+
$stdout.puts "Dropped database '#{configuration['database']}'"
|
115
138
|
rescue ActiveRecord::NoDatabaseError
|
116
139
|
$stderr.puts "Database '#{configuration['database']}' does not exist"
|
117
140
|
rescue Exception => error
|
118
|
-
$stderr.puts error
|
119
|
-
$stderr.puts "Couldn't drop #{configuration['database']}"
|
141
|
+
$stderr.puts error
|
142
|
+
$stderr.puts "Couldn't drop database '#{configuration['database']}'"
|
143
|
+
raise
|
120
144
|
end
|
121
145
|
|
122
146
|
def drop_all
|
@@ -130,8 +154,6 @@ module ActiveRecord
|
|
130
154
|
end
|
131
155
|
|
132
156
|
def migrate
|
133
|
-
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
134
|
-
|
135
157
|
verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
136
158
|
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
137
159
|
scope = ENV['SCOPE']
|
@@ -191,27 +213,7 @@ module ActiveRecord
|
|
191
213
|
class_for_adapter(configuration['adapter']).new(*arguments).structure_load(filename)
|
192
214
|
end
|
193
215
|
|
194
|
-
def load_schema(format = ActiveRecord::Base.schema_format, file = nil)
|
195
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
196
|
-
This method will act on a specific connection in the future.
|
197
|
-
To act on the current connection, use `load_schema_current` instead.
|
198
|
-
MSG
|
199
|
-
|
200
|
-
load_schema_current(format, file)
|
201
|
-
end
|
202
|
-
|
203
|
-
def schema_file(format = ActiveRecord::Base.schema_format)
|
204
|
-
case format
|
205
|
-
when :ruby
|
206
|
-
File.join(db_dir, "schema.rb")
|
207
|
-
when :sql
|
208
|
-
File.join(db_dir, "structure.sql")
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
# This method is the successor of +load_schema+. We should rename it
|
213
|
-
# after +load_schema+ went through a deprecation cycle. (Rails > 4.2)
|
214
|
-
def load_schema_for(configuration, format = ActiveRecord::Base.schema_format, file = nil) # :nodoc:
|
216
|
+
def load_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil) # :nodoc:
|
215
217
|
file ||= schema_file(format)
|
216
218
|
|
217
219
|
case format
|
@@ -225,24 +227,37 @@ module ActiveRecord
|
|
225
227
|
else
|
226
228
|
raise ArgumentError, "unknown format #{format.inspect}"
|
227
229
|
end
|
230
|
+
ActiveRecord::InternalMetadata.create_table
|
231
|
+
ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
|
228
232
|
end
|
229
233
|
|
230
|
-
def
|
231
|
-
|
232
|
-
|
234
|
+
def load_schema_for(*args)
|
235
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
236
|
+
This method was renamed to `#load_schema` and will be removed in the future.
|
237
|
+
Use `#load_schema` instead.
|
238
|
+
MSG
|
239
|
+
load_schema(*args)
|
240
|
+
end
|
241
|
+
|
242
|
+
def schema_file(format = ActiveRecord::Base.schema_format)
|
243
|
+
case format
|
244
|
+
when :ruby
|
245
|
+
File.join(db_dir, "schema.rb")
|
246
|
+
when :sql
|
247
|
+
File.join(db_dir, "structure.sql")
|
233
248
|
end
|
234
249
|
end
|
235
250
|
|
236
251
|
def load_schema_current(format = ActiveRecord::Base.schema_format, file = nil, environment = env)
|
237
252
|
each_current_configuration(environment) { |configuration|
|
238
|
-
|
253
|
+
load_schema configuration, format, file
|
239
254
|
}
|
240
255
|
ActiveRecord::Base.establish_connection(environment.to_sym)
|
241
256
|
end
|
242
257
|
|
243
258
|
def check_schema_file(filename)
|
244
259
|
unless File.exist?(filename)
|
245
|
-
message = %{#{filename} doesn't exist yet. Run `
|
260
|
+
message = %{#{filename} doesn't exist yet. Run `rails db:migrate` to create it, then try again.}
|
246
261
|
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)
|
247
262
|
Kernel.abort message
|
248
263
|
end
|
@@ -270,8 +285,7 @@ module ActiveRecord
|
|
270
285
|
|
271
286
|
def each_current_configuration(environment)
|
272
287
|
environments = [environment]
|
273
|
-
|
274
|
-
environments << 'test' if environment == 'development' && ENV['RAILS_ENV'].nil?
|
288
|
+
environments << 'test' if environment == 'development'
|
275
289
|
|
276
290
|
configurations = ActiveRecord::Base.configurations.values_at(*environments)
|
277
291
|
configurations.compact.each do |configuration|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module Tasks # :nodoc:
|
3
3
|
class MySQLDatabaseTasks # :nodoc:
|
4
|
-
DEFAULT_CHARSET = ENV['CHARSET'] || 'utf8'
|
5
|
-
DEFAULT_COLLATION = ENV['COLLATION'] || 'utf8_unicode_ci'
|
6
4
|
ACCESS_DENIED_ERROR = 1045
|
7
5
|
|
8
6
|
delegate :connection, :establish_connection, to: ActiveRecord::Base
|
@@ -23,7 +21,7 @@ module ActiveRecord
|
|
23
21
|
end
|
24
22
|
rescue error_class => error
|
25
23
|
if error.respond_to?(:errno) && error.errno == ACCESS_DENIED_ERROR
|
26
|
-
$stdout.print error.
|
24
|
+
$stdout.print error.message
|
27
25
|
establish_connection root_configuration_without_database
|
28
26
|
connection.create_database configuration['database'], creation_options
|
29
27
|
if configuration['username'] != 'root'
|
@@ -59,6 +57,7 @@ module ActiveRecord
|
|
59
57
|
args = prepare_command_options
|
60
58
|
args.concat(["--result-file", "#{filename}"])
|
61
59
|
args.concat(["--no-data"])
|
60
|
+
args.concat(["--routines"])
|
62
61
|
args.concat(["#{configuration['database']}"])
|
63
62
|
|
64
63
|
run_cmd('mysqldump', args, 'dumping')
|
@@ -86,12 +85,6 @@ module ActiveRecord
|
|
86
85
|
Hash.new.tap do |options|
|
87
86
|
options[:charset] = configuration['encoding'] if configuration.include? 'encoding'
|
88
87
|
options[:collation] = configuration['collation'] if configuration.include? 'collation'
|
89
|
-
|
90
|
-
# Set default charset only when collation isn't set.
|
91
|
-
options[:charset] ||= DEFAULT_CHARSET unless options[:collation]
|
92
|
-
|
93
|
-
# Set default collation only when charset is also default.
|
94
|
-
options[:collation] ||= DEFAULT_COLLATION if options[:charset] == DEFAULT_CHARSET
|
95
88
|
end
|
96
89
|
end
|
97
90
|
|
@@ -101,8 +94,6 @@ module ActiveRecord
|
|
101
94
|
ArJdbcMySQL::Error
|
102
95
|
elsif defined?(Mysql2)
|
103
96
|
Mysql2::Error
|
104
|
-
elsif defined?(Mysql)
|
105
|
-
Mysql::Error
|
106
97
|
else
|
107
98
|
StandardError
|
108
99
|
end
|
@@ -129,7 +120,7 @@ IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
|
129
120
|
end
|
130
121
|
|
131
122
|
def prepare_command_options
|
132
|
-
{
|
123
|
+
args = {
|
133
124
|
'host' => '--host',
|
134
125
|
'port' => '--port',
|
135
126
|
'socket' => '--socket',
|
@@ -142,6 +133,8 @@ IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
|
142
133
|
'sslcipher' => '--ssl-cipher',
|
143
134
|
'sslkey' => '--ssl-key'
|
144
135
|
}.map { |opt, arg| "#{arg}=#{configuration[opt]}" if configuration[opt] }.compact
|
136
|
+
|
137
|
+
args
|
145
138
|
end
|
146
139
|
|
147
140
|
def run_cmd(cmd, args, action)
|
@@ -149,8 +142,7 @@ IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
|
|
149
142
|
end
|
150
143
|
|
151
144
|
def run_cmd_error(cmd, args, action)
|
152
|
-
msg = "failed to execute
|
153
|
-
msg << "#{cmd}"
|
145
|
+
msg = "failed to execute: `#{cmd}`\n"
|
154
146
|
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"
|
155
147
|
msg
|
156
148
|
end
|
@@ -44,8 +44,17 @@ module ActiveRecord
|
|
44
44
|
|
45
45
|
def structure_dump(filename)
|
46
46
|
set_psql_env
|
47
|
+
|
48
|
+
search_path = case ActiveRecord::Base.dump_schemas
|
49
|
+
when :schema_search_path
|
50
|
+
configuration['schema_search_path']
|
51
|
+
when :all
|
52
|
+
nil
|
53
|
+
when String
|
54
|
+
ActiveRecord::Base.dump_schemas
|
55
|
+
end
|
56
|
+
|
47
57
|
args = ['-s', '-x', '-O', '-f', filename]
|
48
|
-
search_path = configuration['schema_search_path']
|
49
58
|
unless search_path.blank?
|
50
59
|
args += search_path.split(',').map do |part|
|
51
60
|
"--schema=#{part.strip}"
|
@@ -59,7 +68,7 @@ module ActiveRecord
|
|
59
68
|
def structure_load(filename)
|
60
69
|
set_psql_env
|
61
70
|
args = [ '-q', '-f', filename, configuration['database'] ]
|
62
|
-
run_cmd('psql', args, 'loading')
|
71
|
+
run_cmd('psql', args, 'loading' )
|
63
72
|
end
|
64
73
|
|
65
74
|
private
|
@@ -19,11 +19,15 @@ module ActiveRecord
|
|
19
19
|
path = Pathname.new configuration['database']
|
20
20
|
file = path.absolute? ? path.to_s : File.join(root, path)
|
21
21
|
|
22
|
-
FileUtils.rm(file)
|
22
|
+
FileUtils.rm(file)
|
23
|
+
rescue Errno::ENOENT => error
|
24
|
+
raise NoDatabaseError.new(error.message, error)
|
23
25
|
end
|
24
26
|
|
25
27
|
def purge
|
26
28
|
drop
|
29
|
+
rescue NoDatabaseError
|
30
|
+
ensure
|
27
31
|
create
|
28
32
|
end
|
29
33
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module ActiveRecord
|
2
|
-
# = Active Record Timestamp
|
2
|
+
# = Active Record \Timestamp
|
3
3
|
#
|
4
4
|
# Active Record automatically timestamps create and update operations if the
|
5
5
|
# table has fields named <tt>created_at/created_on</tt> or
|
@@ -15,14 +15,25 @@ module ActiveRecord
|
|
15
15
|
#
|
16
16
|
# == Time Zone aware attributes
|
17
17
|
#
|
18
|
-
#
|
18
|
+
# Active Record keeps all the <tt>datetime</tt> and <tt>time</tt> columns
|
19
|
+
# timezone aware. By default, these values are stored in the database as UTC
|
20
|
+
# and converted back to the current <tt>Time.zone</tt> when pulled from the database.
|
19
21
|
#
|
20
|
-
#
|
22
|
+
# This feature can be turned off completely by setting:
|
21
23
|
#
|
22
|
-
#
|
24
|
+
# config.active_record.time_zone_aware_attributes = false
|
23
25
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
+
# You can also specify that only <tt>datetime</tt> columns should be time-zone
|
27
|
+
# aware (while <tt>time</tt> should not) by setting:
|
28
|
+
#
|
29
|
+
# ActiveRecord::Base.time_zone_aware_types = [:datetime]
|
30
|
+
#
|
31
|
+
# You can also add database specific timezone aware types. For example, for PostgreSQL:
|
32
|
+
#
|
33
|
+
# ActiveRecord::Base.time_zone_aware_types += [:tsrange, :tstzrange]
|
34
|
+
#
|
35
|
+
# Finally, you can indicate specific attributes of a model for which time zone
|
36
|
+
# conversion should not applied, for instance by setting:
|
26
37
|
#
|
27
38
|
# class Topic < ActiveRecord::Base
|
28
39
|
# self.skip_time_zone_conversion_for_attributes = [:written_on]
|
@@ -57,8 +68,8 @@ module ActiveRecord
|
|
57
68
|
super
|
58
69
|
end
|
59
70
|
|
60
|
-
def _update_record(*args)
|
61
|
-
if should_record_timestamps?
|
71
|
+
def _update_record(*args, touch: true, **options)
|
72
|
+
if touch && should_record_timestamps?
|
62
73
|
current_time = current_time_from_proper_timezone
|
63
74
|
|
64
75
|
timestamp_attributes_for_update_in_model.each do |column|
|
@@ -67,7 +78,7 @@ module ActiveRecord
|
|
67
78
|
write_attribute(column, current_time)
|
68
79
|
end
|
69
80
|
end
|
70
|
-
super
|
81
|
+
super(*args)
|
71
82
|
end
|
72
83
|
|
73
84
|
def should_record_timestamps?
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
# = Active Record Touch Later
|
3
|
+
module TouchLater
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
before_commit_without_transaction_enrollment :touch_deferred_attributes
|
8
|
+
end
|
9
|
+
|
10
|
+
def touch_later(*names) # :nodoc:
|
11
|
+
raise ActiveRecordError, "cannot touch on a new record object" unless persisted?
|
12
|
+
|
13
|
+
@_defer_touch_attrs ||= timestamp_attributes_for_update_in_model
|
14
|
+
@_defer_touch_attrs |= names
|
15
|
+
@_touch_time = current_time_from_proper_timezone
|
16
|
+
|
17
|
+
surreptitiously_touch @_defer_touch_attrs
|
18
|
+
self.class.connection.add_transaction_record self
|
19
|
+
|
20
|
+
# touch the parents as we are not calling the after_save callbacks
|
21
|
+
self.class.reflect_on_all_associations(:belongs_to).each do |r|
|
22
|
+
if touch = r.options[:touch]
|
23
|
+
ActiveRecord::Associations::Builder::BelongsTo.touch_record(self, r.foreign_key, r.name, touch, :touch_later)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def touch(*names, time: nil) # :nodoc:
|
29
|
+
if has_defer_touch_attrs?
|
30
|
+
names |= @_defer_touch_attrs
|
31
|
+
end
|
32
|
+
super(*names, time: time)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def surreptitiously_touch(attrs)
|
38
|
+
attrs.each { |attr| write_attribute attr, @_touch_time }
|
39
|
+
clear_attribute_changes attrs
|
40
|
+
end
|
41
|
+
|
42
|
+
def touch_deferred_attributes
|
43
|
+
if has_defer_touch_attrs? && persisted?
|
44
|
+
touch(*@_defer_touch_attrs, time: @_touch_time)
|
45
|
+
@_defer_touch_attrs, @_touch_time = nil, nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def has_defer_touch_attrs?
|
50
|
+
defined?(@_defer_touch_attrs) && @_defer_touch_attrs.present?
|
51
|
+
end
|
52
|
+
|
53
|
+
def belongs_to_touch_method
|
54
|
+
:touch_later
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|