activerecord 3.2.6 → 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 (371) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +611 -6417
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +44 -47
  5. data/examples/performance.rb +79 -71
  6. data/examples/simple.rb +6 -5
  7. data/lib/active_record/aggregations.rb +268 -238
  8. data/lib/active_record/association_relation.rb +40 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -42
  10. data/lib/active_record/associations/association.rb +173 -81
  11. data/lib/active_record/associations/association_scope.rb +124 -92
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -38
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +11 -9
  14. data/lib/active_record/associations/builder/association.rb +113 -32
  15. data/lib/active_record/associations/builder/belongs_to.rb +105 -60
  16. data/lib/active_record/associations/builder/collection_association.rb +53 -56
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +98 -41
  18. data/lib/active_record/associations/builder/has_many.rb +11 -63
  19. data/lib/active_record/associations/builder/has_one.rb +47 -45
  20. data/lib/active_record/associations/builder/singular_association.rb +30 -18
  21. data/lib/active_record/associations/collection_association.rb +217 -295
  22. data/lib/active_record/associations/collection_proxy.rb +1074 -77
  23. data/lib/active_record/associations/foreign_association.rb +20 -0
  24. data/lib/active_record/associations/has_many_association.rb +78 -50
  25. data/lib/active_record/associations/has_many_through_association.rb +99 -61
  26. data/lib/active_record/associations/has_one_association.rb +75 -30
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +45 -119
  29. data/lib/active_record/associations/join_dependency/join_base.rb +11 -12
  30. data/lib/active_record/associations/join_dependency/join_part.rb +35 -42
  31. data/lib/active_record/associations/join_dependency.rb +208 -164
  32. data/lib/active_record/associations/preloader/association.rb +93 -87
  33. data/lib/active_record/associations/preloader/through_association.rb +87 -38
  34. data/lib/active_record/associations/preloader.rb +134 -110
  35. data/lib/active_record/associations/singular_association.rb +19 -24
  36. data/lib/active_record/associations/through_association.rb +61 -27
  37. data/lib/active_record/associations.rb +1766 -1505
  38. data/lib/active_record/attribute_assignment.rb +57 -193
  39. data/lib/active_record/attribute_decorators.rb +90 -0
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +58 -8
  41. data/lib/active_record/attribute_methods/dirty.rb +187 -67
  42. data/lib/active_record/attribute_methods/primary_key.rb +100 -78
  43. data/lib/active_record/attribute_methods/query.rb +10 -8
  44. data/lib/active_record/attribute_methods/read.rb +29 -118
  45. data/lib/active_record/attribute_methods/serialization.rb +60 -72
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +69 -42
  47. data/lib/active_record/attribute_methods/write.rb +36 -44
  48. data/lib/active_record/attribute_methods.rb +306 -161
  49. data/lib/active_record/attributes.rb +279 -0
  50. data/lib/active_record/autosave_association.rb +324 -238
  51. data/lib/active_record/base.rb +114 -507
  52. data/lib/active_record/callbacks.rb +147 -83
  53. data/lib/active_record/coders/json.rb +15 -0
  54. data/lib/active_record/coders/yaml_column.rb +32 -23
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +962 -279
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +32 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +331 -209
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +95 -23
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +201 -65
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +510 -289
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1182 -313
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +585 -120
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +610 -463
  68. data/lib/active_record/connection_adapters/column.rb +58 -233
  69. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +75 -207
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +182 -0
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +695 -1052
  116. data/lib/active_record/connection_adapters/schema_cache.rb +115 -24
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +528 -26
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +267 -0
  128. data/lib/active_record/core.rb +599 -0
  129. data/lib/active_record/counter_cache.rb +177 -103
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +107 -64
  136. data/lib/active_record/enum.rb +274 -0
  137. data/lib/active_record/errors.rb +254 -61
  138. data/lib/active_record/explain.rb +35 -70
  139. data/lib/active_record/explain_registry.rb +32 -0
  140. data/lib/active_record/explain_subscriber.rb +18 -8
  141. data/lib/active_record/fixture_set/file.rb +82 -0
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +291 -475
  147. data/lib/active_record/gem_version.rb +17 -0
  148. data/lib/active_record/inheritance.rb +219 -100
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +175 -17
  151. data/lib/active_record/internal_metadata.rb +53 -0
  152. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  153. data/lib/active_record/locale/en.yml +9 -1
  154. data/lib/active_record/locking/optimistic.rb +106 -92
  155. data/lib/active_record/locking/pessimistic.rb +23 -11
  156. data/lib/active_record/log_subscriber.rb +80 -30
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  159. data/lib/active_record/middleware/database_selector.rb +75 -0
  160. data/lib/active_record/migration/command_recorder.rb +235 -56
  161. data/lib/active_record/migration/compatibility.rb +244 -0
  162. data/lib/active_record/migration/join_table.rb +17 -0
  163. data/lib/active_record/migration.rb +917 -301
  164. data/lib/active_record/model_schema.rb +351 -175
  165. data/lib/active_record/nested_attributes.rb +366 -235
  166. data/lib/active_record/no_touching.rb +65 -0
  167. data/lib/active_record/null_relation.rb +68 -0
  168. data/lib/active_record/persistence.rb +761 -166
  169. data/lib/active_record/query_cache.rb +22 -44
  170. data/lib/active_record/querying.rb +55 -31
  171. data/lib/active_record/railtie.rb +185 -47
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +5 -4
  174. data/lib/active_record/railties/controller_runtime.rb +35 -33
  175. data/lib/active_record/railties/databases.rake +366 -463
  176. data/lib/active_record/readonly_attributes.rb +4 -6
  177. data/lib/active_record/reflection.rb +736 -228
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  179. data/lib/active_record/relation/batches.rb +252 -52
  180. data/lib/active_record/relation/calculations.rb +340 -270
  181. data/lib/active_record/relation/delegation.rb +117 -36
  182. data/lib/active_record/relation/finder_methods.rb +439 -286
  183. data/lib/active_record/relation/from_clause.rb +26 -0
  184. data/lib/active_record/relation/merger.rb +184 -0
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder.rb +131 -39
  193. data/lib/active_record/relation/query_attribute.rb +50 -0
  194. data/lib/active_record/relation/query_methods.rb +1163 -221
  195. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  196. data/lib/active_record/relation/spawn_methods.rb +49 -120
  197. data/lib/active_record/relation/where_clause.rb +190 -0
  198. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  199. data/lib/active_record/relation.rb +671 -349
  200. data/lib/active_record/result.rb +149 -15
  201. data/lib/active_record/runtime_registry.rb +24 -0
  202. data/lib/active_record/sanitization.rb +153 -133
  203. data/lib/active_record/schema.rb +22 -19
  204. data/lib/active_record/schema_dumper.rb +178 -112
  205. data/lib/active_record/schema_migration.rb +60 -0
  206. data/lib/active_record/scoping/default.rb +107 -98
  207. data/lib/active_record/scoping/named.rb +130 -115
  208. data/lib/active_record/scoping.rb +77 -123
  209. data/lib/active_record/secure_token.rb +40 -0
  210. data/lib/active_record/serialization.rb +10 -6
  211. data/lib/active_record/statement_cache.rb +148 -0
  212. data/lib/active_record/store.rb +256 -16
  213. data/lib/active_record/suppressor.rb +61 -0
  214. data/lib/active_record/table_metadata.rb +75 -0
  215. data/lib/active_record/tasks/database_tasks.rb +506 -0
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +224 -0
  221. data/lib/active_record/timestamp.rb +93 -39
  222. data/lib/active_record/touch_later.rb +66 -0
  223. data/lib/active_record/transactions.rb +260 -129
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  226. data/lib/active_record/type/date.rb +9 -0
  227. data/lib/active_record/type/date_time.rb +9 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  230. data/lib/active_record/type/internal/timezone.rb +17 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +71 -0
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +21 -0
  235. data/lib/active_record/type/type_map.rb +62 -0
  236. data/lib/active_record/type/unsigned_integer.rb +17 -0
  237. data/lib/active_record/type.rb +78 -0
  238. data/lib/active_record/type_caster/connection.rb +34 -0
  239. data/lib/active_record/type_caster/map.rb +20 -0
  240. data/lib/active_record/type_caster.rb +9 -0
  241. data/lib/active_record/validations/absence.rb +25 -0
  242. data/lib/active_record/validations/associated.rb +35 -18
  243. data/lib/active_record/validations/length.rb +26 -0
  244. data/lib/active_record/validations/presence.rb +68 -0
  245. data/lib/active_record/validations/uniqueness.rb +123 -77
  246. data/lib/active_record/validations.rb +54 -43
  247. data/lib/active_record/version.rb +7 -7
  248. data/lib/active_record.rb +97 -49
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +257 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +204 -0
  315. data/lib/arel/visitors/dot.rb +297 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +157 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +159 -0
  321. data/lib/arel/visitors/oracle12.rb +66 -0
  322. data/lib/arel/visitors/postgresql.rb +110 -0
  323. data/lib/arel/visitors/sqlite.rb +39 -0
  324. data/lib/arel/visitors/to_sql.rb +889 -0
  325. data/lib/arel/visitors/visitor.rb +46 -0
  326. data/lib/arel/visitors/where_sql.rb +23 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +51 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  331. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +59 -9
  333. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  334. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  335. data/lib/rails/generators/active_record/migration.rb +41 -8
  336. data/lib/rails/generators/active_record/model/model_generator.rb +24 -22
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +1 -1
  339. data/lib/rails/generators/active_record.rb +10 -16
  340. metadata +285 -149
  341. data/examples/associations.png +0 -0
  342. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
  343. data/lib/active_record/associations/join_helper.rb +0 -55
  344. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  345. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  346. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  347. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  348. data/lib/active_record/associations/preloader/has_many_through.rb +0 -15
  349. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  350. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  351. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  352. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
  353. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -188
  354. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -426
  355. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -579
  356. data/lib/active_record/dynamic_finder_match.rb +0 -68
  357. data/lib/active_record/dynamic_scope_match.rb +0 -23
  358. data/lib/active_record/fixtures/file.rb +0 -65
  359. data/lib/active_record/identity_map.rb +0 -162
  360. data/lib/active_record/observer.rb +0 -121
  361. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  362. data/lib/active_record/serializers/xml_serializer.rb +0 -203
  363. data/lib/active_record/session_store.rb +0 -358
  364. data/lib/active_record/test_case.rb +0 -73
  365. data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -34
  366. data/lib/rails/generators/active_record/model/templates/migration.rb +0 -15
  367. data/lib/rails/generators/active_record/model/templates/model.rb +0 -12
  368. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  369. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  370. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  371. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,107 +1,36 @@
1
- require 'set'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
4
  # :stopdoc:
5
5
  module ConnectionAdapters
6
6
  # An abstract definition of a column in a table.
7
7
  class Column
8
- TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].to_set
9
- FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF'].to_set
8
+ attr_reader :name, :default, :sql_type_metadata, :null, :default_function, :collation, :comment
10
9
 
11
- module Format
12
- ISO_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
13
- ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?\z/
14
- end
15
-
16
- attr_reader :name, :default, :type, :limit, :null, :sql_type, :precision, :scale
17
- attr_accessor :primary, :coder
18
-
19
- alias :encoded? :coder
10
+ delegate :precision, :scale, :limit, :type, :sql_type, to: :sql_type_metadata, allow_nil: true
20
11
 
21
12
  # Instantiates a new column in the table.
22
13
  #
23
- # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int(11)</tt>.
14
+ # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id bigint</tt>.
24
15
  # +default+ is the type-casted default value, such as +new+ in <tt>sales_stage varchar(20) default 'new'</tt>.
25
- # +sql_type+ is used to extract the column's length, if necessary. For example +60+ in
26
- # <tt>company_name varchar(60)</tt>.
27
- # It will be mapped to one of the standard Rails SQL types in the <tt>type</tt> attribute.
16
+ # +sql_type_metadata+ is various information about the type of the column
28
17
  # +null+ determines if this column allows +NULL+ values.
29
- def initialize(name, default, sql_type = nil, null = true)
30
- @name = name
31
- @sql_type = sql_type
32
- @null = null
33
- @limit = extract_limit(sql_type)
34
- @precision = extract_precision(sql_type)
35
- @scale = extract_scale(sql_type)
36
- @type = simplified_type(sql_type)
37
- @default = extract_default(default)
38
- @primary = nil
39
- @coder = nil
40
- end
41
-
42
- # Returns +true+ if the column is either of type string or text.
43
- def text?
44
- type == :string || type == :text
45
- end
46
-
47
- # Returns +true+ if the column is either of type integer, float or decimal.
48
- def number?
49
- type == :integer || type == :float || type == :decimal
18
+ def initialize(name, default, sql_type_metadata = nil, null = true, default_function = nil, collation: nil, comment: nil, **)
19
+ @name = name.freeze
20
+ @sql_type_metadata = sql_type_metadata
21
+ @null = null
22
+ @default = default
23
+ @default_function = default_function
24
+ @collation = collation
25
+ @comment = comment
50
26
  end
51
27
 
52
28
  def has_default?
53
- !default.nil?
29
+ !default.nil? || default_function
54
30
  end
55
31
 
56
- # Returns the Ruby class that corresponds to the abstract data type.
57
- def klass
58
- case type
59
- when :integer then Fixnum
60
- when :float then Float
61
- when :decimal then BigDecimal
62
- when :datetime, :timestamp, :time then Time
63
- when :date then Date
64
- when :text, :string, :binary then String
65
- when :boolean then Object
66
- end
67
- end
68
-
69
- # Casts value (which is a String) to an appropriate instance.
70
- def type_cast(value)
71
- return nil if value.nil?
72
- return coder.load(value) if encoded?
73
-
74
- klass = self.class
75
-
76
- case type
77
- when :string, :text then value
78
- when :integer then value.to_i rescue value ? 1 : 0
79
- when :float then value.to_f
80
- when :decimal then klass.value_to_decimal(value)
81
- when :datetime, :timestamp then klass.string_to_time(value)
82
- when :time then klass.string_to_dummy_time(value)
83
- when :date then klass.string_to_date(value)
84
- when :binary then klass.binary_to_string(value)
85
- when :boolean then klass.value_to_boolean(value)
86
- else value
87
- end
88
- end
89
-
90
- def type_cast_code(var_name)
91
- klass = self.class.name
92
-
93
- case type
94
- when :string, :text then var_name
95
- when :integer then "(#{var_name}.to_i rescue #{var_name} ? 1 : 0)"
96
- when :float then "#{var_name}.to_f"
97
- when :decimal then "#{klass}.value_to_decimal(#{var_name})"
98
- when :datetime, :timestamp then "#{klass}.string_to_time(#{var_name})"
99
- when :time then "#{klass}.string_to_dummy_time(#{var_name})"
100
- when :date then "#{klass}.string_to_date(#{var_name})"
101
- when :binary then "#{klass}.binary_to_string(#{var_name})"
102
- when :boolean then "#{klass}.value_to_boolean(#{var_name})"
103
- else var_name
104
- end
32
+ def bigint?
33
+ /\Abigint\b/.match?(sql_type)
105
34
  end
106
35
 
107
36
  # Returns the human name of the column name.
@@ -112,158 +41,54 @@ module ActiveRecord
112
41
  Base.human_attribute_name(@name)
113
42
  end
114
43
 
115
- def extract_default(default)
116
- type_cast(default)
44
+ def init_with(coder)
45
+ @name = coder["name"]
46
+ @sql_type_metadata = coder["sql_type_metadata"]
47
+ @null = coder["null"]
48
+ @default = coder["default"]
49
+ @default_function = coder["default_function"]
50
+ @collation = coder["collation"]
51
+ @comment = coder["comment"]
117
52
  end
118
53
 
119
- # Used to convert from Strings to BLOBs
120
- def string_to_binary(value)
121
- self.class.string_to_binary(value)
54
+ def encode_with(coder)
55
+ coder["name"] = @name
56
+ coder["sql_type_metadata"] = @sql_type_metadata
57
+ coder["null"] = @null
58
+ coder["default"] = @default
59
+ coder["default_function"] = @default_function
60
+ coder["collation"] = @collation
61
+ coder["comment"] = @comment
122
62
  end
123
63
 
124
- class << self
125
- # Used to convert from Strings to BLOBs
126
- def string_to_binary(value)
127
- value
128
- end
129
-
130
- # Used to convert from BLOBs to Strings
131
- def binary_to_string(value)
132
- value
133
- end
134
-
135
- def string_to_date(string)
136
- return string unless string.is_a?(String)
137
- return nil if string.empty?
138
-
139
- fast_string_to_date(string) || fallback_string_to_date(string)
140
- end
141
-
142
- def string_to_time(string)
143
- return string unless string.is_a?(String)
144
- return nil if string.empty?
145
-
146
- fast_string_to_time(string) || fallback_string_to_time(string)
147
- end
148
-
149
- def string_to_dummy_time(string)
150
- return string unless string.is_a?(String)
151
- return nil if string.empty?
152
-
153
- string_to_time "2000-01-01 #{string}"
154
- end
155
-
156
- # convert something to a boolean
157
- def value_to_boolean(value)
158
- if value.is_a?(String) && value.blank?
159
- nil
160
- else
161
- TRUE_VALUES.include?(value)
162
- end
163
- end
164
-
165
- # convert something to a BigDecimal
166
- def value_to_decimal(value)
167
- # Using .class is faster than .is_a? and
168
- # subclasses of BigDecimal will be handled
169
- # in the else clause
170
- if value.class == BigDecimal
171
- value
172
- elsif value.respond_to?(:to_d)
173
- value.to_d
174
- else
175
- value.to_s.to_d
176
- end
177
- end
178
-
179
- protected
180
- # '0.123456' -> 123456
181
- # '1.123456' -> 123456
182
- def microseconds(time)
183
- ((time[:sec_fraction].to_f % 1) * 1_000_000).to_i
184
- end
185
-
186
- def new_date(year, mon, mday)
187
- if year && year != 0
188
- Date.new(year, mon, mday) rescue nil
189
- end
190
- end
191
-
192
- def new_time(year, mon, mday, hour, min, sec, microsec)
193
- # Treat 0000-00-00 00:00:00 as nil.
194
- return nil if year.nil? || (year == 0 && mon == 0 && mday == 0)
195
-
196
- Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
197
- end
198
-
199
- def fast_string_to_date(string)
200
- if string =~ Format::ISO_DATE
201
- new_date $1.to_i, $2.to_i, $3.to_i
202
- end
203
- end
204
-
205
- # Doesn't handle time zones.
206
- def fast_string_to_time(string)
207
- if string =~ Format::ISO_DATETIME
208
- microsec = ($7.to_f * 1_000_000).to_i
209
- new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
210
- end
211
- end
212
-
213
- def fallback_string_to_date(string)
214
- new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
215
- end
216
-
217
- def fallback_string_to_time(string)
218
- time_hash = Date._parse(string)
219
- time_hash[:sec_fraction] = microseconds(time_hash)
220
-
221
- new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
222
- end
64
+ def ==(other)
65
+ other.is_a?(Column) &&
66
+ name == other.name &&
67
+ default == other.default &&
68
+ sql_type_metadata == other.sql_type_metadata &&
69
+ null == other.null &&
70
+ default_function == other.default_function &&
71
+ collation == other.collation &&
72
+ comment == other.comment
223
73
  end
74
+ alias :eql? :==
75
+
76
+ def hash
77
+ Column.hash ^
78
+ name.hash ^
79
+ default.hash ^
80
+ sql_type_metadata.hash ^
81
+ null.hash ^
82
+ default_function.hash ^
83
+ collation.hash ^
84
+ comment.hash
85
+ end
86
+ end
224
87
 
225
- private
226
- def extract_limit(sql_type)
227
- $1.to_i if sql_type =~ /\((.*)\)/
228
- end
229
-
230
- def extract_precision(sql_type)
231
- $2.to_i if sql_type =~ /^(numeric|decimal|number)\((\d+)(,\d+)?\)/i
232
- end
233
-
234
- def extract_scale(sql_type)
235
- case sql_type
236
- when /^(numeric|decimal|number)\((\d+)\)/i then 0
237
- when /^(numeric|decimal|number)\((\d+)(,(\d+))\)/i then $4.to_i
238
- end
239
- end
240
-
241
- def simplified_type(field_type)
242
- case field_type
243
- when /int/i
244
- :integer
245
- when /float|double/i
246
- :float
247
- when /decimal|numeric|number/i
248
- extract_scale(field_type) == 0 ? :integer : :decimal
249
- when /datetime/i
250
- :datetime
251
- when /timestamp/i
252
- :timestamp
253
- when /time/i
254
- :time
255
- when /date/i
256
- :date
257
- when /clob/i, /text/i
258
- :text
259
- when /blob/i, /binary/i
260
- :binary
261
- when /char/i, /string/i
262
- :string
263
- when /boolean/i
264
- :boolean
265
- end
266
- end
88
+ class NullColumn < Column
89
+ def initialize(name)
90
+ super(name, nil)
91
+ end
267
92
  end
268
93
  end
269
94
  # :startdoc:
@@ -0,0 +1,297 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+ class ConnectionSpecification #:nodoc:
8
+ attr_reader :name, :config, :adapter_method
9
+
10
+ def initialize(name, config, adapter_method)
11
+ @name, @config, @adapter_method = name, config, adapter_method
12
+ end
13
+
14
+ def initialize_dup(original)
15
+ @config = original.config.dup
16
+ end
17
+
18
+ def to_hash
19
+ @config.merge(name: @name)
20
+ end
21
+
22
+ # Expands a connection string into a hash.
23
+ class ConnectionUrlResolver # :nodoc:
24
+ # == Example
25
+ #
26
+ # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
27
+ # ConnectionUrlResolver.new(url).to_hash
28
+ # # => {
29
+ # "adapter" => "postgresql",
30
+ # "host" => "localhost",
31
+ # "port" => 9000,
32
+ # "database" => "foo_test",
33
+ # "username" => "foo",
34
+ # "password" => "bar",
35
+ # "pool" => "5",
36
+ # "timeout" => "3000"
37
+ # }
38
+ def initialize(url)
39
+ raise "Database URL cannot be empty" if url.blank?
40
+ @uri = uri_parser.parse(url)
41
+ @adapter = @uri.scheme && @uri.scheme.tr("-", "_")
42
+ @adapter = "postgresql" if @adapter == "postgres"
43
+
44
+ if @uri.opaque
45
+ @uri.opaque, @query = @uri.opaque.split("?", 2)
46
+ else
47
+ @query = @uri.query
48
+ end
49
+ end
50
+
51
+ # Converts the given URL to a full connection hash.
52
+ def to_hash
53
+ config = raw_config.reject { |_, value| value.blank? }
54
+ config.map { |key, value| config[key] = uri_parser.unescape(value) if value.is_a? String }
55
+ config
56
+ end
57
+
58
+ private
59
+
60
+ attr_reader :uri
61
+
62
+ def uri_parser
63
+ @uri_parser ||= URI::Parser.new
64
+ end
65
+
66
+ # Converts the query parameters of the URI into a hash.
67
+ #
68
+ # "localhost?pool=5&reaping_frequency=2"
69
+ # # => { "pool" => "5", "reaping_frequency" => "2" }
70
+ #
71
+ # returns empty hash if no query present.
72
+ #
73
+ # "localhost"
74
+ # # => {}
75
+ def query_hash
76
+ Hash[(@query || "").split("&").map { |pair| pair.split("=") }]
77
+ end
78
+
79
+ def raw_config
80
+ if uri.opaque
81
+ query_hash.merge(
82
+ "adapter" => @adapter,
83
+ "database" => uri.opaque)
84
+ else
85
+ query_hash.merge(
86
+ "adapter" => @adapter,
87
+ "username" => uri.user,
88
+ "password" => uri.password,
89
+ "port" => uri.port,
90
+ "database" => database_from_path,
91
+ "host" => uri.hostname)
92
+ end
93
+ end
94
+
95
+ # Returns name of the database.
96
+ def database_from_path
97
+ if @adapter == "sqlite3"
98
+ # 'sqlite3:/foo' is absolute, because that makes sense. The
99
+ # corresponding relative version, 'sqlite3:foo', is handled
100
+ # elsewhere, as an "opaque".
101
+
102
+ uri.path
103
+ else
104
+ # Only SQLite uses a filename as the "database" name; for
105
+ # anything else, a leading slash would be silly.
106
+
107
+ uri.path.sub(%r{^/}, "")
108
+ end
109
+ end
110
+ end
111
+
112
+ ##
113
+ # Builds a ConnectionSpecification from user input.
114
+ class Resolver # :nodoc:
115
+ attr_reader :configurations
116
+
117
+ # Accepts a list of db config objects.
118
+ def initialize(configurations)
119
+ @configurations = configurations
120
+ end
121
+
122
+ # Returns a hash with database connection information.
123
+ #
124
+ # == Examples
125
+ #
126
+ # Full hash Configuration.
127
+ #
128
+ # configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
129
+ # Resolver.new(configurations).resolve(:production)
130
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
131
+ #
132
+ # Initialized with URL configuration strings.
133
+ #
134
+ # configurations = { "production" => "postgresql://localhost/foo" }
135
+ # Resolver.new(configurations).resolve(:production)
136
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
137
+ #
138
+ def resolve(config_or_env, pool_name = nil)
139
+ if config_or_env
140
+ resolve_connection config_or_env, pool_name
141
+ else
142
+ raise AdapterNotSpecified
143
+ end
144
+ end
145
+
146
+ # Returns an instance of ConnectionSpecification for a given adapter.
147
+ # Accepts a hash one layer deep that contains all connection information.
148
+ #
149
+ # == Example
150
+ #
151
+ # config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
152
+ # spec = Resolver.new(config).spec(:production)
153
+ # spec.adapter_method
154
+ # # => "sqlite3_connection"
155
+ # spec.config
156
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
157
+ #
158
+ def spec(config)
159
+ pool_name = config if config.is_a?(Symbol)
160
+
161
+ spec = resolve(config, pool_name).symbolize_keys
162
+
163
+ raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
164
+
165
+ # Require the adapter itself and give useful feedback about
166
+ # 1. Missing adapter gems and
167
+ # 2. Adapter gems' missing dependencies.
168
+ path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
169
+ begin
170
+ require path_to_adapter
171
+ rescue LoadError => e
172
+ # We couldn't require the adapter itself. Raise an exception that
173
+ # points out config typos and missing gems.
174
+ if e.path == path_to_adapter
175
+ # We can assume that a non-builtin adapter was specified, so it's
176
+ # either misspelled or missing from Gemfile.
177
+ raise LoadError, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace
178
+
179
+ # Bubbled up from the adapter require. Prefix the exception message
180
+ # with some guidance about how to address it and reraise.
181
+ else
182
+ raise LoadError, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.message}", e.backtrace
183
+ end
184
+ end
185
+
186
+ adapter_method = "#{spec[:adapter]}_connection"
187
+
188
+ unless ActiveRecord::Base.respond_to?(adapter_method)
189
+ raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
190
+ end
191
+
192
+ ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
193
+ end
194
+
195
+ private
196
+ # Returns fully resolved connection, accepts hash, string or symbol.
197
+ # Always returns a hash.
198
+ #
199
+ # == Examples
200
+ #
201
+ # Symbol representing current environment.
202
+ #
203
+ # Resolver.new("production" => {}).resolve_connection(:production)
204
+ # # => {}
205
+ #
206
+ # One layer deep hash of connection values.
207
+ #
208
+ # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
209
+ # # => { "adapter" => "sqlite3" }
210
+ #
211
+ # Connection URL.
212
+ #
213
+ # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
214
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
215
+ #
216
+ def resolve_connection(config_or_env, pool_name = nil)
217
+ case config_or_env
218
+ when Symbol
219
+ resolve_symbol_connection config_or_env, pool_name
220
+ when String
221
+ resolve_url_connection config_or_env
222
+ when Hash
223
+ resolve_hash_connection config_or_env
224
+ else
225
+ raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config_or_env.inspect}"
226
+ end
227
+ end
228
+
229
+ # Takes the environment such as +:production+ or +:development+ and a
230
+ # pool name the corresponds to the name given by the connection pool
231
+ # to the connection. That pool name is merged into the hash with the
232
+ # name key.
233
+ #
234
+ # This requires that the @configurations was initialized with a key that
235
+ # matches.
236
+ #
237
+ # configurations = #<ActiveRecord::DatabaseConfigurations:0x00007fd9fdace3e0
238
+ # @configurations=[
239
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd9fdace250
240
+ # @env_name="production", @spec_name="primary", @config={"database"=>"my_db"}>
241
+ # ]>
242
+ #
243
+ # Resolver.new(configurations).resolve_symbol_connection(:production, "primary")
244
+ # # => { "database" => "my_db" }
245
+ def resolve_symbol_connection(env_name, pool_name)
246
+ db_config = configurations.find_db_config(env_name)
247
+
248
+ if db_config
249
+ resolve_connection(db_config.config).merge("name" => pool_name.to_s)
250
+ else
251
+ raise AdapterNotSpecified, <<~MSG
252
+ The `#{env_name}` database is not configured for the `#{ActiveRecord::ConnectionHandling::DEFAULT_ENV.call}` environment.
253
+
254
+ Available databases configurations are:
255
+
256
+ #{build_configuration_sentence}
257
+ MSG
258
+ end
259
+ end
260
+
261
+ def build_configuration_sentence # :nodoc:
262
+ configs = configurations.configs_for(include_replicas: true)
263
+
264
+ configs.group_by(&:env_name).map do |env, config|
265
+ namespaces = config.map(&:spec_name)
266
+ if namespaces.size > 1
267
+ "#{env}: #{namespaces.join(", ")}"
268
+ else
269
+ env
270
+ end
271
+ end.join("\n")
272
+ end
273
+
274
+ # Accepts a hash. Expands the "url" key that contains a
275
+ # URL database connection to a full connection
276
+ # hash and merges with the rest of the hash.
277
+ # Connection details inside of the "url" key win any merge conflicts
278
+ def resolve_hash_connection(spec)
279
+ if spec["url"] && spec["url"] !~ /^jdbc:/
280
+ connection_hash = resolve_url_connection(spec.delete("url"))
281
+ spec.merge!(connection_hash)
282
+ end
283
+ spec
284
+ end
285
+
286
+ # Takes a connection URL.
287
+ #
288
+ # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
289
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
290
+ #
291
+ def resolve_url_connection(url)
292
+ ConnectionUrlResolver.new(url).to_hash
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module DetermineIfPreparableVisitor
6
+ attr_accessor :preparable
7
+
8
+ def accept(object, collector)
9
+ @preparable = true
10
+ super
11
+ end
12
+
13
+ def visit_Arel_Nodes_In(o, collector)
14
+ @preparable = false
15
+ super
16
+ end
17
+
18
+ def visit_Arel_Nodes_NotIn(o, collector)
19
+ @preparable = false
20
+ super
21
+ end
22
+
23
+ def visit_Arel_Nodes_SqlLiteral(o, collector)
24
+ @preparable = false
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module MySQL
6
+ class Column < ConnectionAdapters::Column # :nodoc:
7
+ delegate :extra, to: :sql_type_metadata, allow_nil: true
8
+
9
+ def unsigned?
10
+ /\bunsigned(?: zerofill)?\z/.match?(sql_type)
11
+ end
12
+
13
+ def case_sensitive?
14
+ collation && !/_ci\z/.match?(collation)
15
+ end
16
+
17
+ def auto_increment?
18
+ extra == "auto_increment"
19
+ end
20
+
21
+ def virtual?
22
+ /\b(?:VIRTUAL|STORED|PERSISTENT)\b/.match?(extra)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end