activerecord 5.0.7.2 → 6.1.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 (363) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +829 -2015
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +11 -9
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -29
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +30 -18
  10. data/lib/active_record/associations.rb +1714 -1596
  11. data/lib/active_record/associations/alias_tracker.rb +36 -42
  12. data/lib/active_record/associations/association.rb +143 -68
  13. data/lib/active_record/associations/association_scope.rb +98 -94
  14. data/lib/active_record/associations/belongs_to_association.rb +76 -46
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -28
  17. data/lib/active_record/associations/builder/belongs_to.rb +52 -60
  18. data/lib/active_record/associations/builder/collection_association.rb +12 -22
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
  20. data/lib/active_record/associations/builder/has_many.rb +10 -2
  21. data/lib/active_record/associations/builder/has_one.rb +35 -2
  22. data/lib/active_record/associations/builder/singular_association.rb +5 -1
  23. data/lib/active_record/associations/collection_association.rb +104 -259
  24. data/lib/active_record/associations/collection_proxy.rb +169 -125
  25. data/lib/active_record/associations/foreign_association.rb +22 -0
  26. data/lib/active_record/associations/has_many_association.rb +46 -31
  27. data/lib/active_record/associations/has_many_through_association.rb +66 -46
  28. data/lib/active_record/associations/has_one_association.rb +71 -52
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +169 -180
  31. data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
  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 +97 -104
  35. data/lib/active_record/associations/preloader/association.rb +109 -97
  36. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  37. data/lib/active_record/associations/singular_association.rb +12 -45
  38. data/lib/active_record/associations/through_association.rb +27 -15
  39. data/lib/active_record/attribute_assignment.rb +55 -60
  40. data/lib/active_record/attribute_methods.rb +111 -141
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +172 -112
  43. data/lib/active_record/attribute_methods/primary_key.rb +88 -91
  44. data/lib/active_record/attribute_methods/query.rb +6 -8
  45. data/lib/active_record/attribute_methods/read.rb +18 -50
  46. data/lib/active_record/attribute_methods/serialization.rb +38 -10
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
  48. data/lib/active_record/attribute_methods/write.rb +25 -32
  49. data/lib/active_record/attributes.rb +69 -31
  50. data/lib/active_record/autosave_association.rb +102 -66
  51. data/lib/active_record/base.rb +16 -25
  52. data/lib/active_record/callbacks.rb +202 -43
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -12
  55. data/lib/active_record/connection_adapters.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
  69. data/lib/active_record/connection_adapters/column.rb +55 -13
  70. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  71. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +79 -49
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +20 -12
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
  82. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  83. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  84. data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
  85. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
  86. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
  93. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
  95. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  98. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  106. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  107. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  109. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  110. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
  121. data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
  123. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  124. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
  131. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  132. data/lib/active_record/connection_handling.rb +287 -45
  133. data/lib/active_record/core.rb +385 -181
  134. data/lib/active_record/counter_cache.rb +60 -28
  135. data/lib/active_record/database_configurations.rb +272 -0
  136. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  137. data/lib/active_record/database_configurations/database_config.rb +80 -0
  138. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  139. data/lib/active_record/database_configurations/url_config.rb +53 -0
  140. data/lib/active_record/delegated_type.rb +209 -0
  141. data/lib/active_record/destroy_association_async_job.rb +36 -0
  142. data/lib/active_record/dynamic_matchers.rb +87 -87
  143. data/lib/active_record/enum.rb +122 -47
  144. data/lib/active_record/errors.rb +153 -22
  145. data/lib/active_record/explain.rb +13 -8
  146. data/lib/active_record/explain_registry.rb +3 -1
  147. data/lib/active_record/explain_subscriber.rb +9 -4
  148. data/lib/active_record/fixture_set/file.rb +20 -22
  149. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  150. data/lib/active_record/fixture_set/render_context.rb +17 -0
  151. data/lib/active_record/fixture_set/table_row.rb +152 -0
  152. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  153. data/lib/active_record/fixtures.rb +246 -507
  154. data/lib/active_record/gem_version.rb +6 -4
  155. data/lib/active_record/inheritance.rb +168 -95
  156. data/lib/active_record/insert_all.rb +208 -0
  157. data/lib/active_record/integration.rb +114 -25
  158. data/lib/active_record/internal_metadata.rb +30 -24
  159. data/lib/active_record/legacy_yaml_adapter.rb +11 -5
  160. data/lib/active_record/locking/optimistic.rb +81 -85
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +68 -31
  163. data/lib/active_record/middleware/database_selector.rb +77 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  166. data/lib/active_record/migration.rb +439 -342
  167. data/lib/active_record/migration/command_recorder.rb +152 -98
  168. data/lib/active_record/migration/compatibility.rb +229 -60
  169. data/lib/active_record/migration/join_table.rb +8 -7
  170. data/lib/active_record/model_schema.rb +230 -122
  171. data/lib/active_record/nested_attributes.rb +213 -203
  172. data/lib/active_record/no_touching.rb +11 -2
  173. data/lib/active_record/null_relation.rb +12 -34
  174. data/lib/active_record/persistence.rb +471 -97
  175. data/lib/active_record/query_cache.rb +23 -12
  176. data/lib/active_record/querying.rb +43 -25
  177. data/lib/active_record/railtie.rb +155 -43
  178. data/lib/active_record/railties/console_sandbox.rb +2 -0
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +507 -195
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +245 -269
  183. data/lib/active_record/relation.rb +475 -324
  184. data/lib/active_record/relation/batches.rb +125 -72
  185. data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
  186. data/lib/active_record/relation/calculations.rb +267 -171
  187. data/lib/active_record/relation/delegation.rb +73 -69
  188. data/lib/active_record/relation/finder_methods.rb +238 -248
  189. data/lib/active_record/relation/from_clause.rb +7 -9
  190. data/lib/active_record/relation/merger.rb +95 -77
  191. data/lib/active_record/relation/predicate_builder.rb +109 -110
  192. data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
  193. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  194. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  195. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
  196. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  197. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  198. data/lib/active_record/relation/query_attribute.rb +33 -2
  199. data/lib/active_record/relation/query_methods.rb +654 -374
  200. data/lib/active_record/relation/record_fetch_warning.rb +8 -6
  201. data/lib/active_record/relation/spawn_methods.rb +15 -14
  202. data/lib/active_record/relation/where_clause.rb +171 -109
  203. data/lib/active_record/result.rb +88 -51
  204. data/lib/active_record/runtime_registry.rb +5 -3
  205. data/lib/active_record/sanitization.rb +73 -100
  206. data/lib/active_record/schema.rb +7 -14
  207. data/lib/active_record/schema_dumper.rb +101 -69
  208. data/lib/active_record/schema_migration.rb +16 -12
  209. data/lib/active_record/scoping.rb +20 -20
  210. data/lib/active_record/scoping/default.rb +92 -95
  211. data/lib/active_record/scoping/named.rb +39 -30
  212. data/lib/active_record/secure_token.rb +19 -9
  213. data/lib/active_record/serialization.rb +7 -3
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +80 -29
  216. data/lib/active_record/store.rb +122 -42
  217. data/lib/active_record/suppressor.rb +6 -3
  218. data/lib/active_record/table_metadata.rb +51 -39
  219. data/lib/active_record/tasks/database_tasks.rb +332 -115
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +246 -0
  225. data/lib/active_record/timestamp.rb +70 -38
  226. data/lib/active_record/touch_later.rb +26 -24
  227. data/lib/active_record/transactions.rb +121 -184
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type.rb +29 -17
  230. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  231. data/lib/active_record/type/date.rb +2 -0
  232. data/lib/active_record/type/date_time.rb +2 -0
  233. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  234. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  235. data/lib/active_record/type/internal/timezone.rb +2 -0
  236. data/lib/active_record/type/json.rb +30 -0
  237. data/lib/active_record/type/serialized.rb +20 -9
  238. data/lib/active_record/type/text.rb +11 -0
  239. data/lib/active_record/type/time.rb +12 -1
  240. data/lib/active_record/type/type_map.rb +14 -17
  241. data/lib/active_record/type/unsigned_integer.rb +16 -0
  242. data/lib/active_record/type_caster.rb +4 -2
  243. data/lib/active_record/type_caster/connection.rb +17 -13
  244. data/lib/active_record/type_caster/map.rb +10 -6
  245. data/lib/active_record/validations.rb +8 -5
  246. data/lib/active_record/validations/absence.rb +2 -0
  247. data/lib/active_record/validations/associated.rb +4 -3
  248. data/lib/active_record/validations/length.rb +2 -0
  249. data/lib/active_record/validations/numericality.rb +35 -0
  250. data/lib/active_record/validations/presence.rb +4 -2
  251. data/lib/active_record/validations/uniqueness.rb +52 -45
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/arel.rb +54 -0
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes.rb +70 -0
  269. data/lib/arel/nodes/and.rb +32 -0
  270. data/lib/arel/nodes/ascending.rb +23 -0
  271. data/lib/arel/nodes/binary.rb +126 -0
  272. data/lib/arel/nodes/bind_param.rb +44 -0
  273. data/lib/arel/nodes/case.rb +55 -0
  274. data/lib/arel/nodes/casted.rb +62 -0
  275. data/lib/arel/nodes/comment.rb +29 -0
  276. data/lib/arel/nodes/count.rb +12 -0
  277. data/lib/arel/nodes/delete_statement.rb +45 -0
  278. data/lib/arel/nodes/descending.rb +23 -0
  279. data/lib/arel/nodes/equality.rb +15 -0
  280. data/lib/arel/nodes/extract.rb +24 -0
  281. data/lib/arel/nodes/false.rb +16 -0
  282. data/lib/arel/nodes/full_outer_join.rb +8 -0
  283. data/lib/arel/nodes/function.rb +44 -0
  284. data/lib/arel/nodes/grouping.rb +11 -0
  285. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  286. data/lib/arel/nodes/in.rb +15 -0
  287. data/lib/arel/nodes/infix_operation.rb +92 -0
  288. data/lib/arel/nodes/inner_join.rb +8 -0
  289. data/lib/arel/nodes/insert_statement.rb +37 -0
  290. data/lib/arel/nodes/join_source.rb +20 -0
  291. data/lib/arel/nodes/matches.rb +18 -0
  292. data/lib/arel/nodes/named_function.rb +23 -0
  293. data/lib/arel/nodes/node.rb +51 -0
  294. data/lib/arel/nodes/node_expression.rb +13 -0
  295. data/lib/arel/nodes/ordering.rb +27 -0
  296. data/lib/arel/nodes/outer_join.rb +8 -0
  297. data/lib/arel/nodes/over.rb +15 -0
  298. data/lib/arel/nodes/regexp.rb +16 -0
  299. data/lib/arel/nodes/right_outer_join.rb +8 -0
  300. data/lib/arel/nodes/select_core.rb +67 -0
  301. data/lib/arel/nodes/select_statement.rb +41 -0
  302. data/lib/arel/nodes/sql_literal.rb +19 -0
  303. data/lib/arel/nodes/string_join.rb +11 -0
  304. data/lib/arel/nodes/table_alias.rb +31 -0
  305. data/lib/arel/nodes/terminal.rb +16 -0
  306. data/lib/arel/nodes/true.rb +16 -0
  307. data/lib/arel/nodes/unary.rb +44 -0
  308. data/lib/arel/nodes/unary_operation.rb +20 -0
  309. data/lib/arel/nodes/unqualified_column.rb +22 -0
  310. data/lib/arel/nodes/update_statement.rb +41 -0
  311. data/lib/arel/nodes/values_list.rb +9 -0
  312. data/lib/arel/nodes/window.rb +126 -0
  313. data/lib/arel/nodes/with.rb +11 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors.rb +13 -0
  321. data/lib/arel/visitors/dot.rb +308 -0
  322. data/lib/arel/visitors/mysql.rb +93 -0
  323. data/lib/arel/visitors/postgresql.rb +120 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +899 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/rails/generators/active_record.rb +7 -5
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  331. data/lib/rails/generators/active_record/migration.rb +22 -3
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
  333. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
  335. data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. metadata +141 -57
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  349. data/lib/active_record/attribute_decorators.rb +0 -67
  350. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/attribute_set/builder.rb +0 -132
  353. data/lib/active_record/collection_cache_key.rb +0 -50
  354. data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
  355. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
  356. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  359. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
  360. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  361. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  362. data/lib/active_record/relation/where_clause_factory.rb +0 -38
  363. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,110 +0,0 @@
1
- require 'active_record/attribute_set/builder'
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- delegate :fetch, :except, to: :attributes
6
-
7
- def initialize(attributes)
8
- @attributes = attributes
9
- end
10
-
11
- def [](name)
12
- attributes[name] || Attribute.null(name)
13
- end
14
-
15
- def []=(name, value)
16
- attributes[name] = value
17
- end
18
-
19
- def values_before_type_cast
20
- attributes.transform_values(&:value_before_type_cast)
21
- end
22
-
23
- def to_hash
24
- initialized_attributes.transform_values(&:value)
25
- end
26
- alias_method :to_h, :to_hash
27
-
28
- def key?(name)
29
- attributes.key?(name) && self[name].initialized?
30
- end
31
-
32
- def keys
33
- attributes.each_key.select { |name| self[name].initialized? }
34
- end
35
-
36
- if defined?(JRUBY_VERSION)
37
- # This form is significantly faster on JRuby, and this is one of our biggest hotspots.
38
- # https://github.com/jruby/jruby/pull/2562
39
- def fetch_value(name, &block)
40
- self[name].value(&block)
41
- end
42
- else
43
- def fetch_value(name)
44
- self[name].value { |n| yield n if block_given? }
45
- end
46
- end
47
-
48
- def write_from_database(name, value)
49
- attributes[name] = self[name].with_value_from_database(value)
50
- end
51
-
52
- def write_from_user(name, value)
53
- attributes[name] = self[name].with_value_from_user(value)
54
- end
55
-
56
- def write_cast_value(name, value)
57
- attributes[name] = self[name].with_cast_value(value)
58
- end
59
-
60
- def freeze
61
- @attributes.freeze
62
- super
63
- end
64
-
65
- def deep_dup
66
- dup.tap do |copy|
67
- copy.instance_variable_set(:@attributes, attributes.deep_dup)
68
- end
69
- end
70
-
71
- def initialize_dup(_)
72
- @attributes = attributes.dup
73
- super
74
- end
75
-
76
- def initialize_clone(_)
77
- @attributes = attributes.clone
78
- super
79
- end
80
-
81
- def reset(key)
82
- if key?(key)
83
- write_from_database(key, nil)
84
- end
85
- end
86
-
87
- def accessed
88
- attributes.select { |_, attr| attr.has_been_read? }.keys
89
- end
90
-
91
- def map(&block)
92
- new_attributes = attributes.transform_values(&block)
93
- AttributeSet.new(new_attributes)
94
- end
95
-
96
- def ==(other)
97
- attributes == other.attributes
98
- end
99
-
100
- protected
101
-
102
- attr_reader :attributes
103
-
104
- private
105
-
106
- def initialized_attributes
107
- attributes.select { |_, attr| attr.initialized? }
108
- end
109
- end
110
- end
@@ -1,132 +0,0 @@
1
- require 'active_record/attribute'
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- class Builder # :nodoc:
6
- attr_reader :types, :default_attributes
7
-
8
- def initialize(types, default_attributes = {})
9
- @types = types
10
- @default_attributes = default_attributes
11
- end
12
-
13
- def build_from_database(values = {}, additional_types = {})
14
- attributes = LazyAttributeHash.new(types, values, additional_types, default_attributes)
15
- AttributeSet.new(attributes)
16
- end
17
- end
18
- end
19
-
20
- class LazyAttributeHash # :nodoc:
21
- delegate :transform_values, :each_key, :fetch, :except, to: :materialize
22
-
23
- def initialize(types, values, additional_types, default_attributes, delegate_hash = {})
24
- @types = types
25
- @values = values
26
- @additional_types = additional_types
27
- @materialized = false
28
- @delegate_hash = delegate_hash
29
- @default_attributes = default_attributes
30
- end
31
-
32
- def key?(key)
33
- delegate_hash.key?(key) || values.key?(key) || types.key?(key)
34
- end
35
-
36
- def [](key)
37
- delegate_hash[key] || assign_default_value(key)
38
- end
39
-
40
- def []=(key, value)
41
- if frozen?
42
- raise RuntimeError, "Can't modify frozen hash"
43
- end
44
- delegate_hash[key] = value
45
- end
46
-
47
- def deep_dup
48
- dup.tap do |copy|
49
- copy.instance_variable_set(:@delegate_hash, delegate_hash.transform_values(&:dup))
50
- end
51
- end
52
-
53
- def initialize_dup(_)
54
- @delegate_hash = Hash[delegate_hash]
55
- super
56
- end
57
-
58
- def select
59
- keys = types.keys | values.keys | delegate_hash.keys
60
- keys.each_with_object({}) do |key, hash|
61
- attribute = self[key]
62
- if yield(key, attribute)
63
- hash[key] = attribute
64
- end
65
- end
66
- end
67
-
68
- def ==(other)
69
- if other.is_a?(LazyAttributeHash)
70
- materialize == other.materialize
71
- else
72
- materialize == other
73
- end
74
- end
75
-
76
- def marshal_dump
77
- [@types, @values, @additional_types, @default_attributes, @delegate_hash]
78
- end
79
-
80
- def marshal_load(values)
81
- if values.is_a?(Hash)
82
- empty_hash = {}.freeze
83
- initialize(empty_hash, empty_hash, empty_hash, empty_hash, values)
84
- @materialized = true
85
- else
86
- initialize(*values)
87
- end
88
- end
89
-
90
- def encode_with(coder)
91
- coder["delegate_hash"] = materialize
92
- end
93
-
94
- def init_with(coder)
95
- marshal_load(coder["delegate_hash"])
96
- end
97
-
98
- protected
99
-
100
- attr_reader :types, :values, :additional_types, :delegate_hash, :default_attributes
101
-
102
- def materialize
103
- unless @materialized
104
- values.each_key { |key| self[key] }
105
- types.each_key { |key| self[key] }
106
- unless frozen?
107
- @materialized = true
108
- end
109
- end
110
- delegate_hash
111
- end
112
-
113
- private
114
-
115
- def assign_default_value(name)
116
- type = additional_types.fetch(name, types[name])
117
- value_present = true
118
- value = values.fetch(name) { value_present = false }
119
-
120
- if value_present
121
- delegate_hash[name] = Attribute.from_database(name, value, type)
122
- elsif types.key?(name)
123
- attr = default_attributes[name]
124
- if attr
125
- delegate_hash[name] = attr.dup
126
- else
127
- delegate_hash[name] = Attribute.uninitialized(name, type)
128
- end
129
- end
130
- end
131
- end
132
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- module CollectionCacheKey
3
-
4
- def collection_cache_key(collection = all, timestamp_column = :updated_at) # :nodoc:
5
- query_signature = Digest::MD5.hexdigest(collection.to_sql)
6
- key = "#{collection.model_name.cache_key}/query-#{query_signature}"
7
-
8
- if collection.loaded?
9
- size = collection.size
10
- if size > 0
11
- timestamp = collection.max_by(&timestamp_column)._read_attribute(timestamp_column)
12
- end
13
- else
14
- column_type = type_for_attribute(timestamp_column.to_s)
15
- column = "#{connection.quote_table_name(collection.table_name)}.#{connection.quote_column_name(timestamp_column)}"
16
- select_values = "COUNT(*) AS #{connection.quote_column_name("size")}, MAX(%s) AS timestamp"
17
-
18
- if collection.limit_value || collection.offset_value
19
- query = collection.spawn
20
- query.select_values = [column]
21
- subquery_alias = "subquery_for_cache_key"
22
- subquery_column = "#{subquery_alias}.#{timestamp_column}"
23
- subquery = query.arel.as(subquery_alias)
24
- arel = Arel::SelectManager.new(query.engine).project(select_values % subquery_column).from(subquery)
25
- else
26
- query = collection.unscope(:order)
27
- query.select_values = [select_values % column]
28
- arel = query.arel
29
- end
30
-
31
- result = connection.select_one(arel, nil, query.bound_attributes)
32
-
33
- if result.blank?
34
- size = 0
35
- timestamp = nil
36
- else
37
- size = result["size"]
38
- timestamp = column_type.deserialize(result["timestamp"])
39
- end
40
-
41
- end
42
-
43
- if timestamp
44
- "#{key}-#{size}-#{timestamp.utc.to_s(cache_timestamp_format)}"
45
- else
46
- "#{key}-#{size}"
47
- end
48
- end
49
- end
50
- end
@@ -1,263 +0,0 @@
1
- require 'uri'
2
-
3
- module ActiveRecord
4
- module ConnectionAdapters
5
- class ConnectionSpecification #:nodoc:
6
- attr_reader :name, :config, :adapter_method
7
-
8
- def initialize(name, config, adapter_method)
9
- @name, @config, @adapter_method = name, config, adapter_method
10
- end
11
-
12
- def initialize_dup(original)
13
- @config = original.config.dup
14
- end
15
-
16
- # Expands a connection string into a hash.
17
- class ConnectionUrlResolver # :nodoc:
18
-
19
- # == Example
20
- #
21
- # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
22
- # ConnectionUrlResolver.new(url).to_hash
23
- # # => {
24
- # "adapter" => "postgresql",
25
- # "host" => "localhost",
26
- # "port" => 9000,
27
- # "database" => "foo_test",
28
- # "username" => "foo",
29
- # "password" => "bar",
30
- # "pool" => "5",
31
- # "timeout" => "3000"
32
- # }
33
- def initialize(url)
34
- raise "Database URL cannot be empty" if url.blank?
35
- @uri = uri_parser.parse(url)
36
- @adapter = @uri.scheme && @uri.scheme.tr('-', '_')
37
- @adapter = "postgresql" if @adapter == "postgres"
38
-
39
- if @uri.opaque
40
- @uri.opaque, @query = @uri.opaque.split('?', 2)
41
- else
42
- @query = @uri.query
43
- end
44
- end
45
-
46
- # Converts the given URL to a full connection hash.
47
- def to_hash
48
- config = raw_config.reject { |_,value| value.blank? }
49
- config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String }
50
- config
51
- end
52
-
53
- private
54
-
55
- def uri
56
- @uri
57
- end
58
-
59
- def uri_parser
60
- @uri_parser ||= URI::Parser.new
61
- end
62
-
63
- # Converts the query parameters of the URI into a hash.
64
- #
65
- # "localhost?pool=5&reaping_frequency=2"
66
- # # => { "pool" => "5", "reaping_frequency" => "2" }
67
- #
68
- # returns empty hash if no query present.
69
- #
70
- # "localhost"
71
- # # => {}
72
- def query_hash
73
- Hash[(@query || '').split("&").map { |pair| pair.split("=") }]
74
- end
75
-
76
- def raw_config
77
- if uri.opaque
78
- query_hash.merge({
79
- "adapter" => @adapter,
80
- "database" => uri.opaque })
81
- else
82
- query_hash.merge({
83
- "adapter" => @adapter,
84
- "username" => uri.user,
85
- "password" => uri.password,
86
- "port" => uri.port,
87
- "database" => database_from_path,
88
- "host" => uri.hostname })
89
- end
90
- end
91
-
92
- # Returns name of the database.
93
- def database_from_path
94
- if @adapter == 'sqlite3'
95
- # 'sqlite3:/foo' is absolute, because that makes sense. The
96
- # corresponding relative version, 'sqlite3:foo', is handled
97
- # elsewhere, as an "opaque".
98
-
99
- uri.path
100
- else
101
- # Only SQLite uses a filename as the "database" name; for
102
- # anything else, a leading slash would be silly.
103
-
104
- uri.path.sub(%r{^/}, "")
105
- end
106
- end
107
- end
108
-
109
- ##
110
- # Builds a ConnectionSpecification from user input.
111
- class Resolver # :nodoc:
112
- attr_reader :configurations
113
-
114
- # Accepts a hash two layers deep, keys on the first layer represent
115
- # environments such as "production". Keys must be strings.
116
- def initialize(configurations)
117
- @configurations = configurations
118
- end
119
-
120
- # Returns a hash with database connection information.
121
- #
122
- # == Examples
123
- #
124
- # Full hash Configuration.
125
- #
126
- # configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
127
- # Resolver.new(configurations).resolve(:production)
128
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
129
- #
130
- # Initialized with URL configuration strings.
131
- #
132
- # configurations = { "production" => "postgresql://localhost/foo" }
133
- # Resolver.new(configurations).resolve(:production)
134
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
135
- #
136
- def resolve(config)
137
- if config
138
- resolve_connection config
139
- elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
140
- resolve_symbol_connection env.to_sym
141
- else
142
- raise AdapterNotSpecified
143
- end
144
- end
145
-
146
- # Expands each key in @configurations hash into fully resolved hash
147
- def resolve_all
148
- config = configurations.dup
149
- config.each do |key, value|
150
- config[key] = resolve(value) if value
151
- end
152
- config
153
- end
154
-
155
- # Returns an instance of ConnectionSpecification for a given adapter.
156
- # Accepts a hash one layer deep that contains all connection information.
157
- #
158
- # == Example
159
- #
160
- # config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
161
- # spec = Resolver.new(config).spec(:production)
162
- # spec.adapter_method
163
- # # => "sqlite3_connection"
164
- # spec.config
165
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
166
- #
167
- def spec(config, name = nil)
168
- spec = resolve(config).symbolize_keys
169
-
170
- raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
171
-
172
- path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
173
- begin
174
- require path_to_adapter
175
- rescue Gem::LoadError => e
176
- raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
177
- rescue LoadError => e
178
- raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
179
- end
180
-
181
- adapter_method = "#{spec[:adapter]}_connection"
182
-
183
- name ||=
184
- if config.is_a?(Symbol)
185
- config.to_s
186
- else
187
- "primary"
188
- end
189
- ConnectionSpecification.new(name, spec, adapter_method)
190
- end
191
-
192
- private
193
-
194
- # Returns fully resolved connection, accepts hash, string or symbol.
195
- # Always returns a hash.
196
- #
197
- # == Examples
198
- #
199
- # Symbol representing current environment.
200
- #
201
- # Resolver.new("production" => {}).resolve_connection(:production)
202
- # # => {}
203
- #
204
- # One layer deep hash of connection values.
205
- #
206
- # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
207
- # # => { "adapter" => "sqlite3" }
208
- #
209
- # Connection URL.
210
- #
211
- # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
212
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
213
- #
214
- def resolve_connection(spec)
215
- case spec
216
- when Symbol
217
- resolve_symbol_connection spec
218
- when String
219
- resolve_url_connection spec
220
- when Hash
221
- resolve_hash_connection spec
222
- end
223
- end
224
-
225
- # Takes the environment such as +:production+ or +:development+.
226
- # This requires that the @configurations was initialized with a key that
227
- # matches.
228
- #
229
- # Resolver.new("production" => {}).resolve_symbol_connection(:production)
230
- # # => {}
231
- #
232
- def resolve_symbol_connection(spec)
233
- if config = configurations[spec.to_s]
234
- resolve_connection(config)
235
- else
236
- raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}")
237
- end
238
- end
239
-
240
- # Accepts a hash. Expands the "url" key that contains a
241
- # URL database connection to a full connection
242
- # hash and merges with the rest of the hash.
243
- # Connection details inside of the "url" key win any merge conflicts
244
- def resolve_hash_connection(spec)
245
- if spec["url"] && spec["url"] !~ /^jdbc:/
246
- connection_hash = resolve_url_connection(spec.delete("url"))
247
- spec.merge!(connection_hash)
248
- end
249
- spec
250
- end
251
-
252
- # Takes a connection URL.
253
- #
254
- # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
255
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
256
- #
257
- def resolve_url_connection(url)
258
- ConnectionUrlResolver.new(url).to_hash
259
- end
260
- end
261
- end
262
- end
263
- end