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

Files changed (372) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +613 -1643
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +13 -12
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record.rb +41 -22
  8. data/lib/active_record/aggregations.rb +267 -251
  9. data/lib/active_record/association_relation.rb +11 -6
  10. data/lib/active_record/associations.rb +1737 -1597
  11. data/lib/active_record/associations/alias_tracker.rb +29 -35
  12. data/lib/active_record/associations/association.rb +125 -58
  13. data/lib/active_record/associations/association_scope.rb +103 -132
  14. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -40
  17. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  18. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +52 -66
  20. data/lib/active_record/associations/builder/has_many.rb +8 -4
  21. data/lib/active_record/associations/builder/has_one.rb +46 -5
  22. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  23. data/lib/active_record/associations/collection_association.rb +131 -287
  24. data/lib/active_record/associations/collection_proxy.rb +241 -146
  25. data/lib/active_record/associations/foreign_association.rb +10 -1
  26. data/lib/active_record/associations/has_many_association.rb +34 -97
  27. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  28. data/lib/active_record/associations/has_one_association.rb +61 -49
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +137 -167
  31. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +90 -92
  35. data/lib/active_record/associations/preloader/association.rb +90 -123
  36. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  37. data/lib/active_record/associations/singular_association.rb +18 -39
  38. data/lib/active_record/associations/through_association.rb +38 -18
  39. data/lib/active_record/attribute_assignment.rb +56 -183
  40. data/lib/active_record/attribute_decorators.rb +39 -15
  41. data/lib/active_record/attribute_methods.rb +120 -135
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -8
  43. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  44. data/lib/active_record/attribute_methods/primary_key.rb +91 -83
  45. data/lib/active_record/attribute_methods/query.rb +6 -5
  46. data/lib/active_record/attribute_methods/read.rb +20 -76
  47. data/lib/active_record/attribute_methods/serialization.rb +40 -20
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +58 -36
  49. data/lib/active_record/attribute_methods/write.rb +32 -54
  50. data/lib/active_record/attributes.rb +214 -82
  51. data/lib/active_record/autosave_association.rb +91 -37
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +100 -74
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +24 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +796 -296
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +234 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -23
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -46
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +356 -227
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +664 -243
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +191 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +460 -204
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +510 -635
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -152
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -180
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  86. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -58
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  93. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  94. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
  96. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
  101. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
  102. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
  103. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  105. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +10 -5
  106. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +470 -290
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +551 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +290 -345
  127. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  128. data/lib/active_record/connection_handling.rb +176 -41
  129. data/lib/active_record/core.rb +251 -231
  130. data/lib/active_record/counter_cache.rb +67 -49
  131. data/lib/active_record/database_configurations.rb +233 -0
  132. data/lib/active_record/database_configurations/database_config.rb +37 -0
  133. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  134. data/lib/active_record/database_configurations/url_config.rb +79 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -105
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +23 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +153 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  147. data/lib/active_record/fixtures.rb +228 -499
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -112
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +87 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +621 -303
  162. data/lib/active_record/migration/command_recorder.rb +177 -90
  163. data/lib/active_record/migration/compatibility.rb +244 -0
  164. data/lib/active_record/migration/join_table.rb +8 -6
  165. data/lib/active_record/model_schema.rb +312 -112
  166. data/lib/active_record/nested_attributes.rb +264 -222
  167. data/lib/active_record/no_touching.rb +14 -1
  168. data/lib/active_record/null_relation.rb +24 -37
  169. data/lib/active_record/persistence.rb +557 -125
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +43 -29
  172. data/lib/active_record/railtie.rb +143 -44
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +328 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +428 -279
  179. data/lib/active_record/relation.rb +518 -341
  180. data/lib/active_record/relation/batches.rb +207 -55
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  182. data/lib/active_record/relation/calculations.rb +267 -253
  183. data/lib/active_record/relation/delegation.rb +70 -80
  184. data/lib/active_record/relation/finder_methods.rb +277 -241
  185. data/lib/active_record/relation/from_clause.rb +26 -0
  186. data/lib/active_record/relation/merger.rb +78 -87
  187. data/lib/active_record/relation/predicate_builder.rb +114 -119
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  189. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  190. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  193. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  195. data/lib/active_record/relation/query_attribute.rb +50 -0
  196. data/lib/active_record/relation/query_methods.rb +575 -394
  197. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  198. data/lib/active_record/relation/spawn_methods.rb +11 -13
  199. data/lib/active_record/relation/where_clause.rb +190 -0
  200. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  201. data/lib/active_record/result.rb +79 -42
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping.rb +45 -26
  208. data/lib/active_record/scoping/default.rb +101 -85
  209. data/lib/active_record/scoping/named.rb +86 -33
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +75 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -99
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +38 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +224 -0
  222. data/lib/active_record/timestamp.rb +86 -40
  223. data/lib/active_record/touch_later.rb +66 -0
  224. data/lib/active_record/transactions.rb +216 -150
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type.rb +78 -23
  227. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  228. data/lib/active_record/type/date.rb +4 -45
  229. data/lib/active_record/type/date_time.rb +4 -49
  230. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  231. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  232. data/lib/active_record/type/internal/timezone.rb +17 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +24 -15
  235. data/lib/active_record/type/text.rb +2 -2
  236. data/lib/active_record/type/time.rb +11 -16
  237. data/lib/active_record/type/type_map.rb +15 -17
  238. data/lib/active_record/type/unsigned_integer.rb +9 -7
  239. data/lib/active_record/type_caster.rb +9 -0
  240. data/lib/active_record/type_caster/connection.rb +34 -0
  241. data/lib/active_record/type_caster/map.rb +20 -0
  242. data/lib/active_record/validations.rb +39 -35
  243. data/lib/active_record/validations/absence.rb +25 -0
  244. data/lib/active_record/validations/associated.rb +13 -4
  245. data/lib/active_record/validations/length.rb +26 -0
  246. data/lib/active_record/validations/presence.rb +14 -13
  247. data/lib/active_record/validations/uniqueness.rb +42 -55
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/arel.rb +51 -0
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/attributes/attribute.rb +37 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes.rb +68 -0
  266. data/lib/arel/nodes/and.rb +32 -0
  267. data/lib/arel/nodes/ascending.rb +23 -0
  268. data/lib/arel/nodes/binary.rb +52 -0
  269. data/lib/arel/nodes/bind_param.rb +36 -0
  270. data/lib/arel/nodes/case.rb +55 -0
  271. data/lib/arel/nodes/casted.rb +50 -0
  272. data/lib/arel/nodes/comment.rb +29 -0
  273. data/lib/arel/nodes/count.rb +12 -0
  274. data/lib/arel/nodes/delete_statement.rb +45 -0
  275. data/lib/arel/nodes/descending.rb +23 -0
  276. data/lib/arel/nodes/equality.rb +18 -0
  277. data/lib/arel/nodes/extract.rb +24 -0
  278. data/lib/arel/nodes/false.rb +16 -0
  279. data/lib/arel/nodes/full_outer_join.rb +8 -0
  280. data/lib/arel/nodes/function.rb +44 -0
  281. data/lib/arel/nodes/grouping.rb +8 -0
  282. data/lib/arel/nodes/in.rb +8 -0
  283. data/lib/arel/nodes/infix_operation.rb +80 -0
  284. data/lib/arel/nodes/inner_join.rb +8 -0
  285. data/lib/arel/nodes/insert_statement.rb +37 -0
  286. data/lib/arel/nodes/join_source.rb +20 -0
  287. data/lib/arel/nodes/matches.rb +18 -0
  288. data/lib/arel/nodes/named_function.rb +23 -0
  289. data/lib/arel/nodes/node.rb +50 -0
  290. data/lib/arel/nodes/node_expression.rb +13 -0
  291. data/lib/arel/nodes/outer_join.rb +8 -0
  292. data/lib/arel/nodes/over.rb +15 -0
  293. data/lib/arel/nodes/regexp.rb +16 -0
  294. data/lib/arel/nodes/right_outer_join.rb +8 -0
  295. data/lib/arel/nodes/select_core.rb +67 -0
  296. data/lib/arel/nodes/select_statement.rb +41 -0
  297. data/lib/arel/nodes/sql_literal.rb +16 -0
  298. data/lib/arel/nodes/string_join.rb +11 -0
  299. data/lib/arel/nodes/table_alias.rb +27 -0
  300. data/lib/arel/nodes/terminal.rb +16 -0
  301. data/lib/arel/nodes/true.rb +16 -0
  302. data/lib/arel/nodes/unary.rb +45 -0
  303. data/lib/arel/nodes/unary_operation.rb +20 -0
  304. data/lib/arel/nodes/unqualified_column.rb +22 -0
  305. data/lib/arel/nodes/update_statement.rb +41 -0
  306. data/lib/arel/nodes/values_list.rb +9 -0
  307. data/lib/arel/nodes/window.rb +126 -0
  308. data/lib/arel/nodes/with.rb +11 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +257 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors.rb +20 -0
  316. data/lib/arel/visitors/depth_first.rb +204 -0
  317. data/lib/arel/visitors/dot.rb +297 -0
  318. data/lib/arel/visitors/ibm_db.rb +34 -0
  319. data/lib/arel/visitors/informix.rb +62 -0
  320. data/lib/arel/visitors/mssql.rb +157 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +159 -0
  323. data/lib/arel/visitors/oracle12.rb +66 -0
  324. data/lib/arel/visitors/postgresql.rb +110 -0
  325. data/lib/arel/visitors/sqlite.rb +39 -0
  326. data/lib/arel/visitors/to_sql.rb +889 -0
  327. data/lib/arel/visitors/visitor.rb +46 -0
  328. data/lib/arel/visitors/where_sql.rb +23 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +7 -5
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration.rb +31 -1
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  335. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  336. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  337. data/lib/rails/generators/active_record/model/model_generator.rb +19 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. metadata +164 -59
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -163
  349. data/lib/active_record/attribute_set.rb +0 -81
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  352. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  353. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  354. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  355. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  356. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  359. data/lib/active_record/type/big_integer.rb +0 -13
  360. data/lib/active_record/type/binary.rb +0 -50
  361. data/lib/active_record/type/boolean.rb +0 -31
  362. data/lib/active_record/type/decimal.rb +0 -64
  363. data/lib/active_record/type/decorator.rb +0 -14
  364. data/lib/active_record/type/float.rb +0 -19
  365. data/lib/active_record/type/integer.rb +0 -59
  366. data/lib/active_record/type/mutable.rb +0 -16
  367. data/lib/active_record/type/numeric.rb +0 -36
  368. data/lib/active_record/type/string.rb +0 -40
  369. data/lib/active_record/type/time_value.rb +0 -38
  370. data/lib/active_record/type/value.rb +0 -110
  371. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  372. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # = Active Record Query Cache
3
5
  class QueryCache
@@ -5,7 +7,7 @@ module ActiveRecord
5
7
  # Enable the query cache within the block if Active Record is configured.
6
8
  # If it's not, it will execute the given block.
7
9
  def cache(&block)
8
- if ActiveRecord::Base.connected?
10
+ if connected? || !configurations.empty?
9
11
  connection.cache(&block)
10
12
  else
11
13
  yield
@@ -15,7 +17,7 @@ module ActiveRecord
15
17
  # Disable the query cache within the block if Active Record is configured.
16
18
  # If it's not, it will execute the given block.
17
19
  def uncached(&block)
18
- if ActiveRecord::Base.connected?
20
+ if connected? || !configurations.empty?
19
21
  connection.uncached(&block)
20
22
  else
21
23
  yield
@@ -23,34 +25,28 @@ module ActiveRecord
23
25
  end
24
26
  end
25
27
 
26
- def initialize(app)
27
- @app = app
28
- end
29
-
30
- def call(env)
31
- connection = ActiveRecord::Base.connection
32
- enabled = connection.query_cache_enabled
33
- connection_id = ActiveRecord::Base.connection_id
34
- connection.enable_query_cache!
28
+ def self.run
29
+ pools = []
35
30
 
36
- response = @app.call(env)
37
- response[2] = Rack::BodyProxy.new(response[2]) do
38
- restore_query_cache_settings(connection_id, enabled)
31
+ ActiveRecord::Base.connection_handlers.each do |key, handler|
32
+ pools << handler.connection_pool_list.reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! }
39
33
  end
40
34
 
41
- response
42
- rescue Exception => e
43
- restore_query_cache_settings(connection_id, enabled)
44
- raise e
35
+ pools.flatten
45
36
  end
46
37
 
47
- private
38
+ def self.complete(pools)
39
+ pools.each { |pool| pool.disable_query_cache! }
48
40
 
49
- def restore_query_cache_settings(connection_id, enabled)
50
- ActiveRecord::Base.connection_id = connection_id
51
- ActiveRecord::Base.connection.clear_query_cache
52
- ActiveRecord::Base.connection.disable_query_cache! unless enabled
41
+ ActiveRecord::Base.connection_handlers.each do |_, handler|
42
+ handler.connection_pool_list.each do |pool|
43
+ pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
44
+ end
45
+ end
53
46
  end
54
47
 
48
+ def self.install_executor_hooks(executor = ActiveSupport::Executor)
49
+ executor.register_hook(self)
50
+ end
55
51
  end
56
52
  end
@@ -1,30 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Querying
3
- delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, to: :all
4
- delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, to: :all
5
- delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
6
- delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
7
- delegate :find_by, :find_by!, to: :all
8
- delegate :destroy, :destroy_all, :delete, :delete_all, :update, :update_all, to: :all
9
- delegate :find_each, :find_in_batches, to: :all
10
- delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins,
11
- :where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly,
12
- :having, :create_with, :uniq, :distinct, :references, :none, :unscope, to: :all
13
- delegate :count, :average, :minimum, :maximum, :sum, :calculate, to: :all
14
- delegate :pluck, :ids, to: :all
5
+ QUERYING_METHODS = [
6
+ :find, :find_by, :find_by!, :take, :take!, :first, :first!, :last, :last!,
7
+ :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!,
8
+ :forty_two, :forty_two!, :third_to_last, :third_to_last!, :second_to_last, :second_to_last!,
9
+ :exists?, :any?, :many?, :none?, :one?,
10
+ :first_or_create, :first_or_create!, :first_or_initialize,
11
+ :find_or_create_by, :find_or_create_by!, :find_or_initialize_by,
12
+ :create_or_find_by, :create_or_find_by!,
13
+ :destroy_all, :delete_all, :update_all, :touch_all, :destroy_by, :delete_by,
14
+ :find_each, :find_in_batches, :in_batches,
15
+ :select, :reselect, :order, :reorder, :group, :limit, :offset, :joins, :left_joins, :left_outer_joins,
16
+ :where, :rewhere, :preload, :extract_associated, :eager_load, :includes, :from, :lock, :readonly, :extending, :or,
17
+ :having, :create_with, :distinct, :references, :none, :unscope, :optimizer_hints, :merge, :except, :only,
18
+ :count, :average, :minimum, :maximum, :sum, :calculate, :annotate,
19
+ :pluck, :pick, :ids
20
+ ].freeze # :nodoc:
21
+ delegate(*QUERYING_METHODS, to: :all)
15
22
 
16
23
  # Executes a custom SQL query against your database and returns all the results. The results will
17
- # be returned as an array with columns requested encapsulated as attributes of the model you call
18
- # this method from. If you call <tt>Product.find_by_sql</tt> then the results will be returned in
24
+ # be returned as an array, with the requested columns encapsulated as attributes of the model you call
25
+ # this method from. For example, if you call <tt>Product.find_by_sql</tt>, then the results will be returned in
19
26
  # a +Product+ object with the attributes you specified in the SQL query.
20
27
  #
21
- # If you call a complicated SQL query which spans multiple tables the columns specified by the
28
+ # If you call a complicated SQL query which spans multiple tables, the columns specified by the
22
29
  # SELECT will be attributes of the model, whether or not they are columns of the corresponding
23
30
  # table.
24
31
  #
25
- # The +sql+ parameter is a full SQL query as a string. It will be called as is, there will be
26
- # no database agnostic conversions performed. This should be a last resort because using, for example,
27
- # MySQL specific terms will lock you to using that particular database engine or require you to
32
+ # The +sql+ parameter is a full SQL query as a string. It will be called as is; there will be
33
+ # no database agnostic conversions performed. This should be a last resort because using
34
+ # database-specific terms will lock you into using that particular database engine, or require you to
28
35
  # change your call if you switch engines.
29
36
  #
30
37
  # # A simple SQL query spanning multiple tables
@@ -35,10 +42,10 @@ module ActiveRecord
35
42
  #
36
43
  # Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
37
44
  # Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
38
- def find_by_sql(sql, binds = [])
39
- result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
45
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
46
+ result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
40
47
  column_types = result_set.column_types.dup
41
- columns_hash.each_key { |k| column_types.delete k }
48
+ attribute_types.each_key { |k| column_types.delete k }
42
49
  message_bus = ActiveSupport::Notifications.instrumenter
43
50
 
44
51
  payload = {
@@ -46,23 +53,30 @@ module ActiveRecord
46
53
  class_name: name
47
54
  }
48
55
 
49
- message_bus.instrument('instantiation.active_record', payload) do
50
- result_set.map { |record| instantiate(record, column_types) }
56
+ message_bus.instrument("instantiation.active_record", payload) do
57
+ if result_set.includes_column?(inheritance_column)
58
+ result_set.map { |record| instantiate(record, column_types, &block) }
59
+ else
60
+ # Instantiate a homogeneous set
61
+ result_set.map { |record| instantiate_instance_of(self, record, column_types, &block) }
62
+ end
51
63
  end
52
64
  end
53
65
 
54
66
  # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
55
67
  # The use of this method should be restricted to complicated SQL queries that can't be executed
56
- # using the ActiveRecord::Calculations class methods. Look into those before using this.
68
+ # using the ActiveRecord::Calculations class methods. Look into those before using this method,
69
+ # as it could lock you into a specific database engine or require a code change to switch
70
+ # database engines.
57
71
  #
58
- # ==== Parameters
72
+ # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
73
+ # # => 12
59
74
  #
60
- # * +sql+ - An SQL statement which should return a count query from the database, see the example below.
75
+ # ==== Parameters
61
76
  #
62
- # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
77
+ # * +sql+ - An SQL statement which should return a count query from the database, see the example above.
63
78
  def count_by_sql(sql)
64
- sql = sanitize_conditions(sql)
65
- connection.select_value(sql, "#{name} Count").to_i
79
+ connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
66
80
  end
67
81
  end
68
82
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_record"
2
4
  require "rails"
3
5
  require "active_model/railtie"
4
6
 
5
7
  # For now, action_controller must always be present with
6
- # rails, so let's make sure that it gets required before
8
+ # Rails, so let's make sure that it gets required before
7
9
  # here. This is needed for correctly setting up the middleware.
8
10
  # In the future, this might become an optional require.
9
11
  require "action_controller/railtie"
@@ -13,26 +15,22 @@ module ActiveRecord
13
15
  class Railtie < Rails::Railtie # :nodoc:
14
16
  config.active_record = ActiveSupport::OrderedOptions.new
15
17
 
16
- config.app_generators.orm :active_record, :migration => true,
17
- :timestamps => true
18
-
19
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
20
- "ActiveRecord::QueryCache"
21
-
22
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
23
- "ActiveRecord::ConnectionAdapters::ConnectionManagement"
18
+ config.app_generators.orm :active_record, migration: true,
19
+ timestamps: true
24
20
 
25
21
  config.action_dispatch.rescue_responses.merge!(
26
- 'ActiveRecord::RecordNotFound' => :not_found,
27
- 'ActiveRecord::StaleObjectError' => :conflict,
28
- 'ActiveRecord::RecordInvalid' => :unprocessable_entity,
29
- 'ActiveRecord::RecordNotSaved' => :unprocessable_entity
22
+ "ActiveRecord::RecordNotFound" => :not_found,
23
+ "ActiveRecord::StaleObjectError" => :conflict,
24
+ "ActiveRecord::RecordInvalid" => :unprocessable_entity,
25
+ "ActiveRecord::RecordNotSaved" => :unprocessable_entity
30
26
  )
31
27
 
32
-
33
28
  config.active_record.use_schema_cache_dump = true
34
29
  config.active_record.maintain_test_schema = true
35
30
 
31
+ config.active_record.sqlite3 = ActiveSupport::OrderedOptions.new
32
+ config.active_record.sqlite3.represent_boolean_as_integer = nil
33
+
36
34
  config.eager_load_namespaces << ActiveRecord
37
35
 
38
36
  rake_tasks do
@@ -40,9 +38,9 @@ module ActiveRecord
40
38
  task :load_config do
41
39
  ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
42
40
 
43
- if defined?(ENGINE_PATH) && engine = Rails::Engine.find(ENGINE_PATH)
44
- if engine.paths['db/migrate'].existent
45
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths['db/migrate'].to_a
41
+ if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
42
+ if engine.paths["db/migrate"].existent
43
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
46
44
  end
47
45
  end
48
46
  end
@@ -61,6 +59,7 @@ module ActiveRecord
61
59
  console = ActiveSupport::Logger.new(STDERR)
62
60
  Rails.logger.extend ActiveSupport::Logger.broadcast console
63
61
  end
62
+ ActiveRecord::Base.verbose_query_logs = false
64
63
  end
65
64
 
66
65
  runner do
@@ -78,10 +77,47 @@ module ActiveRecord
78
77
  ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
79
78
  end
80
79
 
80
+ initializer "active_record.backtrace_cleaner" do
81
+ ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
82
+ end
83
+
81
84
  initializer "active_record.migration_error" do
82
85
  if config.active_record.delete(:migration_error) == :page_load
83
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
84
- "ActiveRecord::Migration::CheckPending"
86
+ config.app_middleware.insert_after ::ActionDispatch::Callbacks,
87
+ ActiveRecord::Migration::CheckPending
88
+ end
89
+ end
90
+
91
+ initializer "active_record.database_selector" do
92
+ if options = config.active_record.delete(:database_selector)
93
+ resolver = config.active_record.delete(:database_resolver)
94
+ operations = config.active_record.delete(:database_resolver_context)
95
+ config.app_middleware.use ActiveRecord::Middleware::DatabaseSelector, resolver, operations, options
96
+ end
97
+ end
98
+
99
+ initializer "Check for cache versioning support" do
100
+ config.after_initialize do |app|
101
+ ActiveSupport.on_load(:active_record) do
102
+ if app.config.active_record.cache_versioning && Rails.cache
103
+ unless Rails.cache.class.try(:supports_cache_versioning?)
104
+ raise <<-end_error
105
+
106
+ You're using a cache store that doesn't support native cache versioning.
107
+ Your best option is to upgrade to a newer version of #{Rails.cache.class}
108
+ that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true).
109
+
110
+ Next best, switch to a different cache store that does support cache versioning:
111
+ https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.
112
+
113
+ To keep using the current cache store, you can turn off cache versioning entirely:
114
+
115
+ config.active_record.cache_versioning = false
116
+
117
+ end_error
118
+ end
119
+ end
120
+ end
85
121
  end
86
122
  end
87
123
 
@@ -89,14 +125,18 @@ module ActiveRecord
89
125
  if config.active_record.delete(:use_schema_cache_dump)
90
126
  config.after_initialize do |app|
91
127
  ActiveSupport.on_load(:active_record) do
92
- filename = File.join(app.config.paths["db"].first, "schema_cache.dump")
128
+ filename = File.join(app.config.paths["db"].first, "schema_cache.yml")
93
129
 
94
130
  if File.file?(filename)
95
- cache = Marshal.load File.binread filename
96
- if cache.version == ActiveRecord::Migrator.current_version
97
- self.connection.schema_cache = cache
131
+ current_version = ActiveRecord::Migrator.current_version
132
+
133
+ next if current_version.nil?
134
+
135
+ cache = YAML.load(File.read(filename))
136
+ if cache.version == current_version
137
+ connection_pool.schema_cache = cache.dup
98
138
  else
99
- warn "Ignoring db/schema_cache.dump because it has expired. The current schema version is #{ActiveRecord::Migrator.current_version}, but the one in the cache is #{cache.version}."
139
+ warn "Ignoring db/schema_cache.yml because it has expired. The current schema version is #{current_version}, but the one in the cache is #{cache.version}."
100
140
  end
101
141
  end
102
142
  end
@@ -104,9 +144,49 @@ module ActiveRecord
104
144
  end
105
145
  end
106
146
 
147
+ initializer "active_record.define_attribute_methods" do |app|
148
+ config.after_initialize do
149
+ ActiveSupport.on_load(:active_record) do
150
+ if app.config.eager_load
151
+ descendants.each do |model|
152
+ # SchemaMigration and InternalMetadata both override `table_exists?`
153
+ # to bypass the schema cache, so skip them to avoid the extra queries.
154
+ next if model._internal?
155
+
156
+ # If there's no connection yet, or the schema cache doesn't have the columns
157
+ # hash for the model cached, `define_attribute_methods` would trigger a query.
158
+ next unless model.connected? && model.connection.schema_cache.columns_hash?(model.table_name)
159
+
160
+ model.define_attribute_methods
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ initializer "active_record.warn_on_records_fetched_greater_than" do
168
+ if config.active_record.warn_on_records_fetched_greater_than
169
+ ActiveSupport.on_load(:active_record) do
170
+ require "active_record/relation/record_fetch_warning"
171
+ end
172
+ end
173
+ end
174
+
107
175
  initializer "active_record.set_configs" do |app|
108
176
  ActiveSupport.on_load(:active_record) do
109
- app.config.active_record.each do |k,v|
177
+ configs = app.config.active_record
178
+
179
+ represent_boolean_as_integer = configs.sqlite3.delete(:represent_boolean_as_integer)
180
+
181
+ unless represent_boolean_as_integer.nil?
182
+ ActiveSupport.on_load(:active_record_sqlite3adapter) do
183
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = represent_boolean_as_integer
184
+ end
185
+ end
186
+
187
+ configs.delete(:sqlite3)
188
+
189
+ configs.each do |k, v|
110
190
  send "#{k}=", v
111
191
  end
112
192
  end
@@ -114,24 +194,11 @@ module ActiveRecord
114
194
 
115
195
  # This sets the database configuration from Configuration#database_configuration
116
196
  # and then establishes the connection.
117
- initializer "active_record.initialize_database" do |app|
197
+ initializer "active_record.initialize_database" do
118
198
  ActiveSupport.on_load(:active_record) do
199
+ self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
119
200
  self.configurations = Rails.application.config.database_configuration
120
-
121
- begin
122
- establish_connection
123
- rescue ActiveRecord::NoDatabaseError
124
- warn <<-end_warning
125
- Oops - You have a database configured, but it doesn't exist yet!
126
-
127
- Here's how to get started:
128
-
129
- 1. Configure your database in config/database.yml.
130
- 2. Run `bin/rake db:create` to create the database.
131
- 3. Run `bin/rake db:setup` to load your database schema.
132
- end_warning
133
- raise
134
- end
201
+ establish_connection
135
202
  end
136
203
  end
137
204
 
@@ -143,11 +210,16 @@ end_warning
143
210
  end
144
211
  end
145
212
 
146
- initializer "active_record.set_reloader_hooks" do |app|
147
- hook = app.config.reload_classes_only_on_change ? :to_prepare : :to_cleanup
213
+ initializer "active_record.collection_cache_association_loading" do
214
+ require "active_record/railties/collection_cache_association_loading"
215
+ ActiveSupport.on_load(:action_view) do
216
+ ActionView::PartialRenderer.prepend(ActiveRecord::Railties::CollectionCacheAssociationLoading)
217
+ end
218
+ end
148
219
 
220
+ initializer "active_record.set_reloader_hooks" do
149
221
  ActiveSupport.on_load(:active_record) do
150
- ActionDispatch::Reloader.send(hook) do
222
+ ActiveSupport::Reloader.before_class_unload do
151
223
  if ActiveRecord::Base.connected?
152
224
  ActiveRecord::Base.clear_cache!
153
225
  ActiveRecord::Base.clear_reloadable_connections!
@@ -156,9 +228,36 @@ end_warning
156
228
  end
157
229
  end
158
230
 
231
+ initializer "active_record.set_executor_hooks" do
232
+ ActiveRecord::QueryCache.install_executor_hooks
233
+ end
234
+
159
235
  initializer "active_record.add_watchable_files" do |app|
160
236
  path = app.paths["db"].first
161
237
  config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
162
238
  end
239
+
240
+ initializer "active_record.clear_active_connections" do
241
+ config.after_initialize do
242
+ ActiveSupport.on_load(:active_record) do
243
+ # Ideally the application doesn't connect to the database during boot,
244
+ # but sometimes it does. In case it did, we want to empty out the
245
+ # connection pools so that a non-database-using process (e.g. a master
246
+ # process in a forking server model) doesn't retain a needless
247
+ # connection. If it was needed, the incremental cost of reestablishing
248
+ # this connection is trivial: the rest of the pool would need to be
249
+ # populated anyway.
250
+
251
+ clear_active_connections!
252
+ flush_idle_connections!
253
+ end
254
+ end
255
+ end
256
+
257
+ initializer "active_record.set_filter_attributes" do
258
+ ActiveSupport.on_load(:active_record) do
259
+ self.filter_attributes += Rails.application.config.filter_parameters
260
+ end
261
+ end
163
262
  end
164
263
  end