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,48 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Tasks # :nodoc:
3
5
  class MySQLDatabaseTasks # :nodoc:
4
- ACCESS_DENIED_ERROR = 1045
6
+ ER_DB_CREATE_EXISTS = 1007
5
7
 
6
8
  delegate :connection, :establish_connection, to: ActiveRecord::Base
7
9
 
8
- def initialize(configuration)
9
- @configuration = configuration
10
+ def self.using_database_configurations?
11
+ true
12
+ end
13
+
14
+ def initialize(db_config)
15
+ @db_config = db_config
16
+ @configuration_hash = db_config.configuration_hash
10
17
  end
11
18
 
12
19
  def create
13
- establish_connection configuration_without_database
14
- connection.create_database configuration['database'], creation_options
15
- establish_connection configuration
16
- rescue ActiveRecord::StatementInvalid => error
17
- if /database exists/ === error.message
18
- raise DatabaseAlreadyExists
19
- else
20
- raise
21
- end
22
- rescue error_class => error
23
- if error.respond_to?(:errno) && error.errno == ACCESS_DENIED_ERROR
24
- $stdout.print error.message
25
- establish_connection root_configuration_without_database
26
- connection.create_database configuration['database'], creation_options
27
- if configuration['username'] != 'root'
28
- connection.execute grant_statement.gsub(/\s+/, ' ').strip
29
- end
30
- establish_connection configuration
31
- else
32
- $stderr.puts error.inspect
33
- $stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}"
34
- $stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['encoding']
35
- end
20
+ establish_connection(configuration_hash_without_database)
21
+ connection.create_database(db_config.database, creation_options)
22
+ establish_connection(db_config)
36
23
  end
37
24
 
38
25
  def drop
39
- establish_connection configuration
40
- connection.drop_database configuration['database']
26
+ establish_connection(db_config)
27
+ connection.drop_database(db_config.database)
41
28
  end
42
29
 
43
30
  def purge
44
- establish_connection configuration
45
- connection.recreate_database configuration['database'], creation_options
31
+ establish_connection(db_config)
32
+ connection.recreate_database(db_config.database, creation_options)
46
33
  end
47
34
 
48
35
  def charset
@@ -53,99 +40,74 @@ module ActiveRecord
53
40
  connection.collation
54
41
  end
55
42
 
56
- def structure_dump(filename)
43
+ def structure_dump(filename, extra_flags)
57
44
  args = prepare_command_options
58
45
  args.concat(["--result-file", "#{filename}"])
59
46
  args.concat(["--no-data"])
60
47
  args.concat(["--routines"])
61
- args.concat(["#{configuration['database']}"])
48
+ args.concat(["--skip-comments"])
62
49
 
63
- run_cmd('mysqldump', args, 'dumping')
64
- end
50
+ ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
51
+ if ignore_tables.any?
52
+ args += ignore_tables.map { |table| "--ignore-table=#{db_config.database}.#{table}" }
53
+ end
65
54
 
66
- def structure_load(filename)
67
- args = prepare_command_options
68
- args.concat(['--execute', %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}])
69
- args.concat(["--database", "#{configuration['database']}"])
55
+ args.concat([db_config.database.to_s])
56
+ args.unshift(*extra_flags) if extra_flags
70
57
 
71
- run_cmd('mysql', args, 'loading')
58
+ run_cmd("mysqldump", args, "dumping")
72
59
  end
73
60
 
74
- private
61
+ def structure_load(filename, extra_flags)
62
+ args = prepare_command_options
63
+ args.concat(["--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}])
64
+ args.concat(["--database", db_config.database.to_s])
65
+ args.unshift(*extra_flags) if extra_flags
75
66
 
76
- def configuration
77
- @configuration
67
+ run_cmd("mysql", args, "loading")
78
68
  end
79
69
 
80
- def configuration_without_database
81
- configuration.merge('database' => nil)
82
- end
70
+ private
71
+ attr_reader :db_config, :configuration_hash
83
72
 
84
- def creation_options
85
- Hash.new.tap do |options|
86
- options[:charset] = configuration['encoding'] if configuration.include? 'encoding'
87
- options[:collation] = configuration['collation'] if configuration.include? 'collation'
73
+ def configuration_hash_without_database
74
+ configuration_hash.merge(database: nil)
88
75
  end
89
- end
90
76
 
91
- def error_class
92
- if configuration['adapter'] =~ /jdbc/
93
- require 'active_record/railties/jdbcmysql_error'
94
- ArJdbcMySQL::Error
95
- elsif defined?(Mysql2)
96
- Mysql2::Error
97
- else
98
- StandardError
77
+ def creation_options
78
+ Hash.new.tap do |options|
79
+ options[:charset] = configuration_hash[:encoding] if configuration_hash.include?(:encoding)
80
+ options[:collation] = configuration_hash[:collation] if configuration_hash.include?(:collation)
81
+ end
99
82
  end
100
- end
101
-
102
- def grant_statement
103
- <<-SQL
104
- GRANT ALL PRIVILEGES ON #{configuration['database']}.*
105
- TO '#{configuration['username']}'@'localhost'
106
- IDENTIFIED BY '#{configuration['password']}' WITH GRANT OPTION;
107
- SQL
108
- end
109
-
110
- def root_configuration_without_database
111
- configuration_without_database.merge(
112
- 'username' => 'root',
113
- 'password' => root_password
114
- )
115
- end
116
-
117
- def root_password
118
- $stdout.print "Please provide the root password for your MySQL installation\n>"
119
- $stdin.gets.strip
120
- end
121
83
 
122
- def prepare_command_options
123
- args = {
124
- 'host' => '--host',
125
- 'port' => '--port',
126
- 'socket' => '--socket',
127
- 'username' => '--user',
128
- 'password' => '--password',
129
- 'encoding' => '--default-character-set',
130
- 'sslca' => '--ssl-ca',
131
- 'sslcert' => '--ssl-cert',
132
- 'sslcapath' => '--ssl-capath',
133
- 'sslcipher' => '--ssl-cipher',
134
- 'sslkey' => '--ssl-key'
135
- }.map { |opt, arg| "#{arg}=#{configuration[opt]}" if configuration[opt] }.compact
136
-
137
- args
138
- end
84
+ def prepare_command_options
85
+ args = {
86
+ host: "--host",
87
+ port: "--port",
88
+ socket: "--socket",
89
+ username: "--user",
90
+ password: "--password",
91
+ encoding: "--default-character-set",
92
+ sslca: "--ssl-ca",
93
+ sslcert: "--ssl-cert",
94
+ sslcapath: "--ssl-capath",
95
+ sslcipher: "--ssl-cipher",
96
+ sslkey: "--ssl-key"
97
+ }.map { |opt, arg| "#{arg}=#{configuration_hash[opt]}" if configuration_hash[opt] }.compact
98
+
99
+ args
100
+ end
139
101
 
140
- def run_cmd(cmd, args, action)
141
- fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
142
- end
102
+ def run_cmd(cmd, args, action)
103
+ fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
104
+ end
143
105
 
144
- def run_cmd_error(cmd, args, action)
145
- msg = "failed to execute: `#{cmd}`\n"
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"
147
- msg
148
- end
106
+ def run_cmd_error(cmd, args, action)
107
+ msg = +"failed to execute: `#{cmd}`\n"
108
+ 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"
109
+ msg
110
+ end
149
111
  end
150
112
  end
151
113
  end
@@ -1,31 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tempfile"
4
+
1
5
  module ActiveRecord
2
6
  module Tasks # :nodoc:
3
7
  class PostgreSQLDatabaseTasks # :nodoc:
4
- DEFAULT_ENCODING = ENV['CHARSET'] || 'utf8'
8
+ DEFAULT_ENCODING = ENV["CHARSET"] || "utf8"
9
+ ON_ERROR_STOP_1 = "ON_ERROR_STOP=1"
10
+ SQL_COMMENT_BEGIN = "--"
5
11
 
6
12
  delegate :connection, :establish_connection, :clear_active_connections!,
7
13
  to: ActiveRecord::Base
8
14
 
9
- def initialize(configuration)
10
- @configuration = configuration
15
+ def self.using_database_configurations?
16
+ true
17
+ end
18
+
19
+ def initialize(db_config)
20
+ @db_config = db_config
21
+ @configuration_hash = db_config.configuration_hash
11
22
  end
12
23
 
13
24
  def create(master_established = false)
14
25
  establish_master_connection unless master_established
15
- connection.create_database configuration['database'],
16
- configuration.merge('encoding' => encoding)
17
- establish_connection configuration
18
- rescue ActiveRecord::StatementInvalid => error
19
- if error.cause.is_a?(PG::DuplicateDatabase)
20
- raise DatabaseAlreadyExists
21
- else
22
- raise
23
- end
26
+ connection.create_database(db_config.database, configuration_hash.merge(encoding: encoding))
27
+ establish_connection(db_config)
24
28
  end
25
29
 
26
30
  def drop
27
31
  establish_master_connection
28
- connection.drop_database configuration['database']
32
+ connection.drop_database(db_config.database)
29
33
  end
30
34
 
31
35
  def charset
@@ -42,69 +46,93 @@ module ActiveRecord
42
46
  create true
43
47
  end
44
48
 
45
- def structure_dump(filename)
49
+ def structure_dump(filename, extra_flags)
46
50
  set_psql_env
47
51
 
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
52
+ search_path = \
53
+ case ActiveRecord::Base.dump_schemas
54
+ when :schema_search_path
55
+ configuration_hash[:schema_search_path]
56
+ when :all
57
+ nil
58
+ when String
59
+ ActiveRecord::Base.dump_schemas
60
+ end
56
61
 
57
- args = ['-s', '-x', '-O', '-f', filename]
62
+ args = ["--schema-only", "--no-privileges", "--no-owner", "--file", filename]
63
+ args.concat(Array(extra_flags)) if extra_flags
58
64
  unless search_path.blank?
59
- args += search_path.split(',').map do |part|
65
+ args += search_path.split(",").map do |part|
60
66
  "--schema=#{part.strip}"
61
67
  end
62
68
  end
63
- args << configuration['database']
64
- run_cmd('pg_dump', args, 'dumping')
69
+
70
+ ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
71
+ if ignore_tables.any?
72
+ args += ignore_tables.flat_map { |table| ["-T", table] }
73
+ end
74
+
75
+ args << db_config.database
76
+ run_cmd("pg_dump", args, "dumping")
77
+ remove_sql_header_comments(filename)
65
78
  File.open(filename, "a") { |f| f << "SET search_path TO #{connection.schema_search_path};\n\n" }
66
79
  end
67
80
 
68
- def structure_load(filename)
81
+ def structure_load(filename, extra_flags)
69
82
  set_psql_env
70
- args = [ '-q', '-f', filename, configuration['database'] ]
71
- run_cmd('psql', args, 'loading' )
83
+ args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--file", filename]
84
+ args.concat(Array(extra_flags)) if extra_flags
85
+ args << db_config.database
86
+ run_cmd("psql", args, "loading")
72
87
  end
73
88
 
74
89
  private
90
+ attr_reader :db_config, :configuration_hash
75
91
 
76
- def configuration
77
- @configuration
78
- end
92
+ def encoding
93
+ configuration_hash[:encoding] || DEFAULT_ENCODING
94
+ end
79
95
 
80
- def encoding
81
- configuration['encoding'] || DEFAULT_ENCODING
82
- end
96
+ def establish_master_connection
97
+ establish_connection configuration_hash.merge(
98
+ database: "postgres",
99
+ schema_search_path: "public"
100
+ )
101
+ end
83
102
 
84
- def establish_master_connection
85
- establish_connection configuration.merge(
86
- 'database' => 'postgres',
87
- 'schema_search_path' => 'public'
88
- )
89
- end
103
+ def set_psql_env
104
+ ENV["PGHOST"] = db_config.host if db_config.host
105
+ ENV["PGPORT"] = configuration_hash[:port].to_s if configuration_hash[:port]
106
+ ENV["PGPASSWORD"] = configuration_hash[:password].to_s if configuration_hash[:password]
107
+ ENV["PGUSER"] = configuration_hash[:username].to_s if configuration_hash[:username]
108
+ end
90
109
 
91
- def set_psql_env
92
- ENV['PGHOST'] = configuration['host'] if configuration['host']
93
- ENV['PGPORT'] = configuration['port'].to_s if configuration['port']
94
- ENV['PGPASSWORD'] = configuration['password'].to_s if configuration['password']
95
- ENV['PGUSER'] = configuration['username'].to_s if configuration['username']
96
- end
110
+ def run_cmd(cmd, args, action)
111
+ fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
112
+ end
97
113
 
98
- def run_cmd(cmd, args, action)
99
- fail run_cmd_error(cmd, args, action) unless Kernel.system(cmd, *args)
100
- end
114
+ def run_cmd_error(cmd, args, action)
115
+ msg = +"failed to execute:\n"
116
+ msg << "#{cmd} #{args.join(' ')}\n\n"
117
+ 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"
118
+ msg
119
+ end
101
120
 
102
- def run_cmd_error(cmd, args, action)
103
- msg = "failed to execute:\n"
104
- msg << "#{cmd} #{args.join(' ')}\n\n"
105
- 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"
106
- msg
107
- end
121
+ def remove_sql_header_comments(filename)
122
+ removing_comments = true
123
+ tempfile = Tempfile.open("uncommented_structure.sql")
124
+ begin
125
+ File.foreach(filename) do |line|
126
+ unless removing_comments && (line.start_with?(SQL_COMMENT_BEGIN) || line.blank?)
127
+ tempfile << line
128
+ removing_comments = false
129
+ end
130
+ end
131
+ ensure
132
+ tempfile.close
133
+ end
134
+ FileUtils.cp(tempfile.path, filename)
135
+ end
108
136
  end
109
137
  end
110
138
  end
@@ -1,27 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Tasks # :nodoc:
3
5
  class SQLiteDatabaseTasks # :nodoc:
4
6
  delegate :connection, :establish_connection, to: ActiveRecord::Base
5
7
 
6
- def initialize(configuration, root = ActiveRecord::Tasks::DatabaseTasks.root)
7
- @configuration, @root = configuration, root
8
+ def self.using_database_configurations?
9
+ true
10
+ end
11
+
12
+ def initialize(db_config, root = ActiveRecord::Tasks::DatabaseTasks.root)
13
+ @db_config = db_config
14
+ @root = root
8
15
  end
9
16
 
10
17
  def create
11
- raise DatabaseAlreadyExists if File.exist?(configuration['database'])
18
+ raise DatabaseAlreadyExists if File.exist?(db_config.database)
12
19
 
13
- establish_connection configuration
20
+ establish_connection(db_config)
14
21
  connection
15
22
  end
16
23
 
17
24
  def drop
18
- require 'pathname'
19
- path = Pathname.new configuration['database']
25
+ require "pathname"
26
+ path = Pathname.new(db_config.database)
20
27
  file = path.absolute? ? path.to_s : File.join(root, path)
21
28
 
22
29
  FileUtils.rm(file)
23
30
  rescue Errno::ENOENT => error
24
- raise NoDatabaseError.new(error.message, error)
31
+ raise NoDatabaseError.new(error.message)
25
32
  end
26
33
 
27
34
  def purge
@@ -35,25 +42,39 @@ module ActiveRecord
35
42
  connection.encoding
36
43
  end
37
44
 
38
- def structure_dump(filename)
39
- dbfile = configuration['database']
40
- `sqlite3 #{dbfile} .schema > #{filename}`
45
+ def structure_dump(filename, extra_flags)
46
+ args = []
47
+ args.concat(Array(extra_flags)) if extra_flags
48
+ args << db_config.database
49
+
50
+ ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
51
+ if ignore_tables.any?
52
+ condition = ignore_tables.map { |table| connection.quote(table) }.join(", ")
53
+ args << "SELECT sql FROM sqlite_master WHERE tbl_name NOT IN (#{condition}) ORDER BY tbl_name, type DESC, name"
54
+ else
55
+ args << ".schema"
56
+ end
57
+ run_cmd("sqlite3", args, filename)
41
58
  end
42
59
 
43
- def structure_load(filename)
44
- dbfile = configuration['database']
45
- `sqlite3 #{dbfile} < "#{filename}"`
60
+ def structure_load(filename, extra_flags)
61
+ flags = extra_flags.join(" ") if extra_flags
62
+ `sqlite3 #{flags} #{db_config.database} < "#{filename}"`
46
63
  end
47
64
 
48
65
  private
66
+ attr_reader :db_config, :root
49
67
 
50
- def configuration
51
- @configuration
52
- end
68
+ def run_cmd(cmd, args, out)
69
+ fail run_cmd_error(cmd, args) unless Kernel.system(cmd, *args, out: out)
70
+ end
53
71
 
54
- def root
55
- @root
56
- end
72
+ def run_cmd_error(cmd, args)
73
+ msg = +"failed to execute:\n"
74
+ msg << "#{cmd} #{args.join(' ')}\n\n"
75
+ 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"
76
+ msg
77
+ end
57
78
  end
58
79
  end
59
80
  end