activerecord 4.2.11.3 → 5.0.0.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.

Files changed (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1281 -1204
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +7 -8
  5. data/examples/performance.rb +2 -3
  6. data/examples/simple.rb +0 -1
  7. data/lib/active_record/aggregations.rb +35 -24
  8. data/lib/active_record/association_relation.rb +3 -3
  9. data/lib/active_record/associations/alias_tracker.rb +19 -16
  10. data/lib/active_record/associations/association.rb +11 -9
  11. data/lib/active_record/associations/association_scope.rb +73 -102
  12. data/lib/active_record/associations/belongs_to_association.rb +21 -32
  13. data/lib/active_record/associations/builder/association.rb +28 -34
  14. data/lib/active_record/associations/builder/belongs_to.rb +43 -18
  15. data/lib/active_record/associations/builder/collection_association.rb +7 -19
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +14 -11
  17. data/lib/active_record/associations/builder/has_many.rb +4 -4
  18. data/lib/active_record/associations/builder/has_one.rb +11 -6
  19. data/lib/active_record/associations/builder/singular_association.rb +3 -10
  20. data/lib/active_record/associations/collection_association.rb +49 -41
  21. data/lib/active_record/associations/collection_proxy.rb +67 -27
  22. data/lib/active_record/associations/foreign_association.rb +1 -1
  23. data/lib/active_record/associations/has_many_association.rb +20 -71
  24. data/lib/active_record/associations/has_many_through_association.rb +8 -47
  25. data/lib/active_record/associations/has_one_association.rb +12 -5
  26. data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
  27. data/lib/active_record/associations/join_dependency.rb +29 -19
  28. data/lib/active_record/associations/preloader/association.rb +46 -52
  29. data/lib/active_record/associations/preloader/collection_association.rb +0 -6
  30. data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
  31. data/lib/active_record/associations/preloader/has_one.rb +0 -8
  32. data/lib/active_record/associations/preloader/through_association.rb +27 -14
  33. data/lib/active_record/associations/preloader.rb +14 -4
  34. data/lib/active_record/associations/singular_association.rb +7 -1
  35. data/lib/active_record/associations/through_association.rb +11 -3
  36. data/lib/active_record/associations.rb +317 -209
  37. data/lib/active_record/attribute/user_provided_default.rb +28 -0
  38. data/lib/active_record/attribute.rb +68 -18
  39. data/lib/active_record/attribute_assignment.rb +19 -140
  40. data/lib/active_record/attribute_decorators.rb +6 -5
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
  42. data/lib/active_record/attribute_methods/dirty.rb +46 -86
  43. data/lib/active_record/attribute_methods/primary_key.rb +2 -2
  44. data/lib/active_record/attribute_methods/query.rb +2 -2
  45. data/lib/active_record/attribute_methods/read.rb +31 -59
  46. data/lib/active_record/attribute_methods/serialization.rb +13 -16
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -14
  48. data/lib/active_record/attribute_methods/write.rb +13 -37
  49. data/lib/active_record/attribute_methods.rb +76 -47
  50. data/lib/active_record/attribute_mutation_tracker.rb +70 -0
  51. data/lib/active_record/attribute_set/builder.rb +6 -4
  52. data/lib/active_record/attribute_set.rb +30 -3
  53. data/lib/active_record/attributes.rb +199 -81
  54. data/lib/active_record/autosave_association.rb +49 -16
  55. data/lib/active_record/base.rb +32 -23
  56. data/lib/active_record/callbacks.rb +39 -43
  57. data/lib/active_record/coders/json.rb +1 -1
  58. data/lib/active_record/coders/yaml_column.rb +20 -8
  59. data/lib/active_record/collection_cache_key.rb +40 -0
  60. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -182
  61. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
  62. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -61
  63. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -2
  64. data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -10
  65. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  66. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -185
  68. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
  69. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +380 -141
  70. data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
  71. data/lib/active_record/connection_adapters/abstract_adapter.rb +141 -59
  72. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -370
  73. data/lib/active_record/connection_adapters/column.rb +28 -43
  74. data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
  75. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
  76. data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
  77. data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
  78. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
  79. data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
  80. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
  81. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
  82. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
  83. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
  84. data/lib/active_record/connection_adapters/mysql2_adapter.rb +29 -166
  85. data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
  86. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +10 -72
  87. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -57
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
  94. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
  96. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
  98. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
  100. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
  101. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
  102. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
  104. data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
  105. data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
  106. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
  107. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
  108. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
  109. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -148
  110. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
  111. data/lib/active_record/connection_adapters/postgresql_adapter.rb +248 -160
  112. data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
  113. data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
  114. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
  115. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
  116. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  117. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +149 -192
  118. data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
  119. data/lib/active_record/connection_handling.rb +37 -14
  120. data/lib/active_record/core.rb +89 -107
  121. data/lib/active_record/counter_cache.rb +13 -24
  122. data/lib/active_record/dynamic_matchers.rb +1 -20
  123. data/lib/active_record/enum.rb +113 -76
  124. data/lib/active_record/errors.rb +87 -48
  125. data/lib/active_record/explain_registry.rb +1 -1
  126. data/lib/active_record/explain_subscriber.rb +1 -1
  127. data/lib/active_record/fixture_set/file.rb +26 -5
  128. data/lib/active_record/fixtures.rb +76 -40
  129. data/lib/active_record/gem_version.rb +4 -4
  130. data/lib/active_record/inheritance.rb +32 -40
  131. data/lib/active_record/integration.rb +4 -4
  132. data/lib/active_record/internal_metadata.rb +56 -0
  133. data/lib/active_record/legacy_yaml_adapter.rb +18 -2
  134. data/lib/active_record/locale/en.yml +3 -2
  135. data/lib/active_record/locking/optimistic.rb +15 -15
  136. data/lib/active_record/locking/pessimistic.rb +1 -1
  137. data/lib/active_record/log_subscriber.rb +43 -21
  138. data/lib/active_record/migration/command_recorder.rb +59 -18
  139. data/lib/active_record/migration/compatibility.rb +126 -0
  140. data/lib/active_record/migration.rb +363 -133
  141. data/lib/active_record/model_schema.rb +129 -41
  142. data/lib/active_record/nested_attributes.rb +58 -29
  143. data/lib/active_record/null_relation.rb +16 -8
  144. data/lib/active_record/persistence.rb +121 -80
  145. data/lib/active_record/query_cache.rb +15 -18
  146. data/lib/active_record/querying.rb +10 -9
  147. data/lib/active_record/railtie.rb +23 -16
  148. data/lib/active_record/railties/controller_runtime.rb +1 -1
  149. data/lib/active_record/railties/databases.rake +69 -46
  150. data/lib/active_record/readonly_attributes.rb +1 -1
  151. data/lib/active_record/reflection.rb +282 -115
  152. data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
  153. data/lib/active_record/relation/batches.rb +139 -34
  154. data/lib/active_record/relation/calculations.rb +79 -108
  155. data/lib/active_record/relation/delegation.rb +7 -20
  156. data/lib/active_record/relation/finder_methods.rb +163 -81
  157. data/lib/active_record/relation/from_clause.rb +32 -0
  158. data/lib/active_record/relation/merger.rb +16 -42
  159. data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
  160. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
  161. data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
  162. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
  163. data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
  164. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
  165. data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
  166. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  167. data/lib/active_record/relation/predicate_builder.rb +120 -107
  168. data/lib/active_record/relation/query_attribute.rb +19 -0
  169. data/lib/active_record/relation/query_methods.rb +308 -244
  170. data/lib/active_record/relation/record_fetch_warning.rb +49 -0
  171. data/lib/active_record/relation/spawn_methods.rb +4 -7
  172. data/lib/active_record/relation/where_clause.rb +174 -0
  173. data/lib/active_record/relation/where_clause_factory.rb +38 -0
  174. data/lib/active_record/relation.rb +176 -116
  175. data/lib/active_record/result.rb +4 -3
  176. data/lib/active_record/runtime_registry.rb +1 -1
  177. data/lib/active_record/sanitization.rb +95 -66
  178. data/lib/active_record/schema.rb +26 -22
  179. data/lib/active_record/schema_dumper.rb +62 -38
  180. data/lib/active_record/schema_migration.rb +11 -14
  181. data/lib/active_record/scoping/default.rb +23 -9
  182. data/lib/active_record/scoping/named.rb +49 -28
  183. data/lib/active_record/scoping.rb +32 -15
  184. data/lib/active_record/secure_token.rb +38 -0
  185. data/lib/active_record/serialization.rb +2 -4
  186. data/lib/active_record/statement_cache.rb +16 -14
  187. data/lib/active_record/store.rb +8 -3
  188. data/lib/active_record/suppressor.rb +58 -0
  189. data/lib/active_record/table_metadata.rb +68 -0
  190. data/lib/active_record/tasks/database_tasks.rb +57 -43
  191. data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
  192. data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
  193. data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
  194. data/lib/active_record/timestamp.rb +20 -9
  195. data/lib/active_record/touch_later.rb +58 -0
  196. data/lib/active_record/transactions.rb +138 -56
  197. data/lib/active_record/type/adapter_specific_registry.rb +130 -0
  198. data/lib/active_record/type/date.rb +2 -45
  199. data/lib/active_record/type/date_time.rb +2 -49
  200. data/lib/active_record/type/internal/abstract_json.rb +29 -0
  201. data/lib/active_record/type/internal/timezone.rb +15 -0
  202. data/lib/active_record/type/serialized.rb +15 -14
  203. data/lib/active_record/type/time.rb +10 -16
  204. data/lib/active_record/type/type_map.rb +4 -4
  205. data/lib/active_record/type.rb +66 -17
  206. data/lib/active_record/type_caster/connection.rb +29 -0
  207. data/lib/active_record/type_caster/map.rb +19 -0
  208. data/lib/active_record/type_caster.rb +7 -0
  209. data/lib/active_record/validations/absence.rb +23 -0
  210. data/lib/active_record/validations/associated.rb +10 -3
  211. data/lib/active_record/validations/length.rb +24 -0
  212. data/lib/active_record/validations/presence.rb +11 -12
  213. data/lib/active_record/validations/uniqueness.rb +30 -29
  214. data/lib/active_record/validations.rb +33 -32
  215. data/lib/active_record.rb +8 -4
  216. data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
  217. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
  218. data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -1
  219. data/lib/rails/generators/active_record/migration.rb +7 -0
  220. data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
  221. data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
  222. data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
  223. metadata +60 -34
  224. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  225. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  226. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
  227. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  228. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  229. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  230. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  231. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  232. data/lib/active_record/type/big_integer.rb +0 -13
  233. data/lib/active_record/type/binary.rb +0 -50
  234. data/lib/active_record/type/boolean.rb +0 -31
  235. data/lib/active_record/type/decimal.rb +0 -64
  236. data/lib/active_record/type/decimal_without_scale.rb +0 -11
  237. data/lib/active_record/type/decorator.rb +0 -14
  238. data/lib/active_record/type/float.rb +0 -19
  239. data/lib/active_record/type/integer.rb +0 -59
  240. data/lib/active_record/type/mutable.rb +0 -16
  241. data/lib/active_record/type/numeric.rb +0 -36
  242. data/lib/active_record/type/string.rb +0 -40
  243. data/lib/active_record/type/text.rb +0 -11
  244. data/lib/active_record/type/time_value.rb +0 -38
  245. data/lib/active_record/type/unsigned_integer.rb +0 -15
  246. 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
- # <tt>ActiveRecord::Tasks::DatabaseTasks</tt> is a utility class, which encapsulates
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
- # * +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.
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 +DatabaseTasks+ outside Rails could look as such:
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, *(error.backtrace)
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, *(error.backtrace)
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 load_schema_current_if_exists(format = ActiveRecord::Base.schema_format, file = nil, environment = env)
231
- if File.exist?(file || schema_file(format))
232
- load_schema_current(format, file, environment)
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
- load_schema_for configuration, format, file
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 `rake db:migrate` to create it, then try again.}
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
- # add test environment only if no RAILS_ENV was specified.
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.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:\n"
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) if File.exist?(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
- # By default, ActiveRecord::Base keeps all the datetime columns time zone aware by executing following code.
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
- # config.active_record.time_zone_aware_attributes = true
22
+ # This feature can be turned off completely by setting:
21
23
  #
22
- # This feature can easily be turned off by assigning value <tt>false</tt> .
24
+ # config.active_record.time_zone_aware_attributes = false
23
25
  #
24
- # If your attributes are time zone aware and you desire to skip time zone conversion to the current Time.zone
25
- # when reading certain attributes then you can do following:
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