activerecord 4.2.8 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (372) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +612 -1583
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +13 -12
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record.rb +41 -22
  8. data/lib/active_record/aggregations.rb +267 -251
  9. data/lib/active_record/association_relation.rb +11 -6
  10. data/lib/active_record/associations.rb +1737 -1597
  11. data/lib/active_record/associations/alias_tracker.rb +29 -35
  12. data/lib/active_record/associations/association.rb +125 -58
  13. data/lib/active_record/associations/association_scope.rb +103 -132
  14. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -40
  17. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  18. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +52 -66
  20. data/lib/active_record/associations/builder/has_many.rb +8 -4
  21. data/lib/active_record/associations/builder/has_one.rb +46 -5
  22. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  23. data/lib/active_record/associations/collection_association.rb +134 -286
  24. data/lib/active_record/associations/collection_proxy.rb +241 -146
  25. data/lib/active_record/associations/foreign_association.rb +10 -1
  26. data/lib/active_record/associations/has_many_association.rb +34 -97
  27. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  28. data/lib/active_record/associations/has_one_association.rb +61 -49
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +137 -167
  31. data/lib/active_record/associations/join_dependency/join_association.rb +38 -88
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +90 -92
  35. data/lib/active_record/associations/preloader/association.rb +90 -123
  36. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  37. data/lib/active_record/associations/singular_association.rb +18 -39
  38. data/lib/active_record/associations/through_association.rb +38 -18
  39. data/lib/active_record/attribute_assignment.rb +56 -183
  40. data/lib/active_record/attribute_decorators.rb +39 -15
  41. data/lib/active_record/attribute_methods.rb +120 -135
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -8
  43. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  44. data/lib/active_record/attribute_methods/primary_key.rb +91 -83
  45. data/lib/active_record/attribute_methods/query.rb +6 -5
  46. data/lib/active_record/attribute_methods/read.rb +20 -76
  47. data/lib/active_record/attribute_methods/serialization.rb +40 -20
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +58 -36
  49. data/lib/active_record/attribute_methods/write.rb +32 -54
  50. data/lib/active_record/attributes.rb +214 -82
  51. data/lib/active_record/autosave_association.rb +91 -37
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +100 -74
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +24 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +796 -296
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +234 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -23
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -46
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +356 -227
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +664 -244
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +191 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +460 -204
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +510 -627
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -152
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -188
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  86. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -58
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  93. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  94. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
  96. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
  101. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
  102. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
  103. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  105. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +10 -5
  106. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +470 -290
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +551 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +290 -345
  127. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  128. data/lib/active_record/connection_handling.rb +176 -41
  129. data/lib/active_record/core.rb +251 -231
  130. data/lib/active_record/counter_cache.rb +67 -49
  131. data/lib/active_record/database_configurations.rb +233 -0
  132. data/lib/active_record/database_configurations/database_config.rb +37 -0
  133. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  134. data/lib/active_record/database_configurations/url_config.rb +79 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -105
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +23 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +153 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  147. data/lib/active_record/fixtures.rb +228 -499
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +158 -112
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +87 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +626 -283
  162. data/lib/active_record/migration/command_recorder.rb +177 -90
  163. data/lib/active_record/migration/compatibility.rb +244 -0
  164. data/lib/active_record/migration/join_table.rb +8 -6
  165. data/lib/active_record/model_schema.rb +314 -112
  166. data/lib/active_record/nested_attributes.rb +264 -222
  167. data/lib/active_record/no_touching.rb +14 -1
  168. data/lib/active_record/null_relation.rb +24 -37
  169. data/lib/active_record/persistence.rb +557 -125
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +43 -29
  172. data/lib/active_record/railtie.rb +147 -46
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +330 -197
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +428 -279
  179. data/lib/active_record/relation.rb +518 -341
  180. data/lib/active_record/relation/batches.rb +207 -55
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  182. data/lib/active_record/relation/calculations.rb +267 -253
  183. data/lib/active_record/relation/delegation.rb +70 -80
  184. data/lib/active_record/relation/finder_methods.rb +277 -241
  185. data/lib/active_record/relation/from_clause.rb +26 -0
  186. data/lib/active_record/relation/merger.rb +78 -87
  187. data/lib/active_record/relation/predicate_builder.rb +114 -119
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  189. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  190. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  193. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  195. data/lib/active_record/relation/query_attribute.rb +50 -0
  196. data/lib/active_record/relation/query_methods.rb +575 -394
  197. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  198. data/lib/active_record/relation/spawn_methods.rb +11 -13
  199. data/lib/active_record/relation/where_clause.rb +190 -0
  200. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  201. data/lib/active_record/result.rb +79 -42
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping.rb +45 -26
  208. data/lib/active_record/scoping/default.rb +101 -85
  209. data/lib/active_record/scoping/named.rb +86 -33
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +75 -0
  216. data/lib/active_record/tasks/database_tasks.rb +308 -99
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -99
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +38 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +224 -0
  222. data/lib/active_record/timestamp.rb +86 -40
  223. data/lib/active_record/touch_later.rb +66 -0
  224. data/lib/active_record/transactions.rb +216 -150
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type.rb +78 -23
  227. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  228. data/lib/active_record/type/date.rb +4 -45
  229. data/lib/active_record/type/date_time.rb +4 -49
  230. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  231. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  232. data/lib/active_record/type/internal/timezone.rb +17 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +24 -15
  235. data/lib/active_record/type/text.rb +2 -2
  236. data/lib/active_record/type/time.rb +11 -16
  237. data/lib/active_record/type/type_map.rb +15 -17
  238. data/lib/active_record/type/unsigned_integer.rb +9 -7
  239. data/lib/active_record/type_caster.rb +9 -0
  240. data/lib/active_record/type_caster/connection.rb +34 -0
  241. data/lib/active_record/type_caster/map.rb +20 -0
  242. data/lib/active_record/validations.rb +39 -35
  243. data/lib/active_record/validations/absence.rb +25 -0
  244. data/lib/active_record/validations/associated.rb +13 -4
  245. data/lib/active_record/validations/length.rb +26 -0
  246. data/lib/active_record/validations/presence.rb +14 -13
  247. data/lib/active_record/validations/uniqueness.rb +42 -55
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/arel.rb +51 -0
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/attributes/attribute.rb +37 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes.rb +68 -0
  266. data/lib/arel/nodes/and.rb +32 -0
  267. data/lib/arel/nodes/ascending.rb +23 -0
  268. data/lib/arel/nodes/binary.rb +52 -0
  269. data/lib/arel/nodes/bind_param.rb +36 -0
  270. data/lib/arel/nodes/case.rb +55 -0
  271. data/lib/arel/nodes/casted.rb +50 -0
  272. data/lib/arel/nodes/comment.rb +29 -0
  273. data/lib/arel/nodes/count.rb +12 -0
  274. data/lib/arel/nodes/delete_statement.rb +45 -0
  275. data/lib/arel/nodes/descending.rb +23 -0
  276. data/lib/arel/nodes/equality.rb +18 -0
  277. data/lib/arel/nodes/extract.rb +24 -0
  278. data/lib/arel/nodes/false.rb +16 -0
  279. data/lib/arel/nodes/full_outer_join.rb +8 -0
  280. data/lib/arel/nodes/function.rb +44 -0
  281. data/lib/arel/nodes/grouping.rb +8 -0
  282. data/lib/arel/nodes/in.rb +8 -0
  283. data/lib/arel/nodes/infix_operation.rb +80 -0
  284. data/lib/arel/nodes/inner_join.rb +8 -0
  285. data/lib/arel/nodes/insert_statement.rb +37 -0
  286. data/lib/arel/nodes/join_source.rb +20 -0
  287. data/lib/arel/nodes/matches.rb +18 -0
  288. data/lib/arel/nodes/named_function.rb +23 -0
  289. data/lib/arel/nodes/node.rb +50 -0
  290. data/lib/arel/nodes/node_expression.rb +13 -0
  291. data/lib/arel/nodes/outer_join.rb +8 -0
  292. data/lib/arel/nodes/over.rb +15 -0
  293. data/lib/arel/nodes/regexp.rb +16 -0
  294. data/lib/arel/nodes/right_outer_join.rb +8 -0
  295. data/lib/arel/nodes/select_core.rb +67 -0
  296. data/lib/arel/nodes/select_statement.rb +41 -0
  297. data/lib/arel/nodes/sql_literal.rb +16 -0
  298. data/lib/arel/nodes/string_join.rb +11 -0
  299. data/lib/arel/nodes/table_alias.rb +27 -0
  300. data/lib/arel/nodes/terminal.rb +16 -0
  301. data/lib/arel/nodes/true.rb +16 -0
  302. data/lib/arel/nodes/unary.rb +45 -0
  303. data/lib/arel/nodes/unary_operation.rb +20 -0
  304. data/lib/arel/nodes/unqualified_column.rb +22 -0
  305. data/lib/arel/nodes/update_statement.rb +41 -0
  306. data/lib/arel/nodes/values_list.rb +9 -0
  307. data/lib/arel/nodes/window.rb +126 -0
  308. data/lib/arel/nodes/with.rb +11 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +257 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors.rb +20 -0
  316. data/lib/arel/visitors/depth_first.rb +204 -0
  317. data/lib/arel/visitors/dot.rb +297 -0
  318. data/lib/arel/visitors/ibm_db.rb +34 -0
  319. data/lib/arel/visitors/informix.rb +62 -0
  320. data/lib/arel/visitors/mssql.rb +157 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +159 -0
  323. data/lib/arel/visitors/oracle12.rb +66 -0
  324. data/lib/arel/visitors/postgresql.rb +110 -0
  325. data/lib/arel/visitors/sqlite.rb +39 -0
  326. data/lib/arel/visitors/to_sql.rb +889 -0
  327. data/lib/arel/visitors/visitor.rb +46 -0
  328. data/lib/arel/visitors/where_sql.rb +23 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +7 -5
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration.rb +31 -1
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  335. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  336. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  337. data/lib/rails/generators/active_record/model/model_generator.rb +19 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. metadata +164 -60
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -163
  349. data/lib/active_record/attribute_set.rb +0 -81
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  352. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  353. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  354. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  355. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  356. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  359. data/lib/active_record/type/big_integer.rb +0 -13
  360. data/lib/active_record/type/binary.rb +0 -50
  361. data/lib/active_record/type/boolean.rb +0 -31
  362. data/lib/active_record/type/decimal.rb +0 -58
  363. data/lib/active_record/type/decorator.rb +0 -14
  364. data/lib/active_record/type/float.rb +0 -19
  365. data/lib/active_record/type/integer.rb +0 -59
  366. data/lib/active_record/type/mutable.rb +0 -16
  367. data/lib/active_record/type/numeric.rb +0 -36
  368. data/lib/active_record/type/string.rb +0 -40
  369. data/lib/active_record/type/time_value.rb +0 -38
  370. data/lib/active_record/type/value.rb +0 -110
  371. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  372. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,491 +0,0 @@
1
- require 'active_record/connection_adapters/abstract_mysql_adapter'
2
- require 'active_record/connection_adapters/statement_pool'
3
- require 'active_support/core_ext/hash/keys'
4
-
5
- gem 'mysql', '~> 2.9'
6
- require 'mysql'
7
-
8
- class Mysql
9
- class Time
10
- def to_date
11
- Date.new(year, month, day)
12
- end
13
- end
14
- class Stmt; include Enumerable end
15
- class Result; include Enumerable end
16
- end
17
-
18
- module ActiveRecord
19
- module ConnectionHandling # :nodoc:
20
- # Establishes a connection to the database that's used by all Active Record objects.
21
- def mysql_connection(config)
22
- config = config.symbolize_keys
23
- host = config[:host]
24
- port = config[:port]
25
- socket = config[:socket]
26
- username = config[:username] ? config[:username].to_s : 'root'
27
- password = config[:password].to_s
28
- database = config[:database]
29
-
30
- mysql = Mysql.init
31
- mysql.ssl_set(config[:sslkey], config[:sslcert], config[:sslca], config[:sslcapath], config[:sslcipher]) if config[:sslca] || config[:sslkey]
32
-
33
- default_flags = Mysql.const_defined?(:CLIENT_MULTI_RESULTS) ? Mysql::CLIENT_MULTI_RESULTS : 0
34
- default_flags |= Mysql::CLIENT_FOUND_ROWS if Mysql.const_defined?(:CLIENT_FOUND_ROWS)
35
- options = [host, username, password, database, port, socket, default_flags]
36
- ConnectionAdapters::MysqlAdapter.new(mysql, logger, options, config)
37
- rescue Mysql::Error => error
38
- if error.message.include?("Unknown database")
39
- raise ActiveRecord::NoDatabaseError.new(error.message, error)
40
- else
41
- raise
42
- end
43
- end
44
- end
45
-
46
- module ConnectionAdapters
47
- # The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with
48
- # the faster C-based MySQL/Ruby adapter (available both as a gem and from http://www.tmtm.org/en/mysql/ruby/).
49
- #
50
- # Options:
51
- #
52
- # * <tt>:host</tt> - Defaults to "localhost".
53
- # * <tt>:port</tt> - Defaults to 3306.
54
- # * <tt>:socket</tt> - Defaults to "/tmp/mysql.sock".
55
- # * <tt>:username</tt> - Defaults to "root"
56
- # * <tt>:password</tt> - Defaults to nothing.
57
- # * <tt>:database</tt> - The name of the database. No default, must be provided.
58
- # * <tt>:encoding</tt> - (Optional) Sets the client encoding by executing "SET NAMES <encoding>" after connection.
59
- # * <tt>:reconnect</tt> - Defaults to false (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).
60
- # * <tt>:strict</tt> - Defaults to true. Enable STRICT_ALL_TABLES. (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html)
61
- # * <tt>:variables</tt> - (Optional) A hash session variables to send as <tt>SET @@SESSION.key = value</tt> on each database connection. Use the value +:default+ to set a variable to its DEFAULT value. (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/set-statement.html).
62
- # * <tt>:sslca</tt> - Necessary to use MySQL with an SSL connection.
63
- # * <tt>:sslkey</tt> - Necessary to use MySQL with an SSL connection.
64
- # * <tt>:sslcert</tt> - Necessary to use MySQL with an SSL connection.
65
- # * <tt>:sslcapath</tt> - Necessary to use MySQL with an SSL connection.
66
- # * <tt>:sslcipher</tt> - Necessary to use MySQL with an SSL connection.
67
- #
68
- class MysqlAdapter < AbstractMysqlAdapter
69
- ADAPTER_NAME = 'MySQL'.freeze
70
-
71
- class StatementPool < ConnectionAdapters::StatementPool
72
- def initialize(connection, max = 1000)
73
- super
74
- @cache = Hash.new { |h,pid| h[pid] = {} }
75
- end
76
-
77
- def each(&block); cache.each(&block); end
78
- def key?(key); cache.key?(key); end
79
- def [](key); cache[key]; end
80
- def length; cache.length; end
81
- def delete(key); cache.delete(key); end
82
-
83
- def []=(sql, key)
84
- while @max <= cache.size
85
- cache.shift.last[:stmt].close
86
- end
87
- cache[sql] = key
88
- end
89
-
90
- def clear
91
- cache.each_value do |hash|
92
- hash[:stmt].close
93
- end
94
- cache.clear
95
- end
96
-
97
- private
98
- def cache
99
- @cache[Process.pid]
100
- end
101
- end
102
-
103
- def initialize(connection, logger, connection_options, config)
104
- super
105
- @statements = StatementPool.new(@connection,
106
- self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }))
107
- @client_encoding = nil
108
- connect
109
- end
110
-
111
- # Returns true, since this connection adapter supports prepared statement
112
- # caching.
113
- def supports_statement_cache?
114
- true
115
- end
116
-
117
- # HELPER METHODS ===========================================
118
-
119
- def each_hash(result) # :nodoc:
120
- if block_given?
121
- result.each_hash do |row|
122
- row.symbolize_keys!
123
- yield row
124
- end
125
- else
126
- to_enum(:each_hash, result)
127
- end
128
- end
129
-
130
- def error_number(exception) # :nodoc:
131
- exception.errno if exception.respond_to?(:errno)
132
- end
133
-
134
- # QUOTING ==================================================
135
-
136
- def quote_string(string) #:nodoc:
137
- @connection.quote(string)
138
- end
139
-
140
- #--
141
- # CONNECTION MANAGEMENT ====================================
142
- #++
143
-
144
- def active?
145
- if @connection.respond_to?(:stat)
146
- @connection.stat
147
- else
148
- @connection.query 'select 1'
149
- end
150
-
151
- # mysql-ruby doesn't raise an exception when stat fails.
152
- if @connection.respond_to?(:errno)
153
- @connection.errno.zero?
154
- else
155
- true
156
- end
157
- rescue Mysql::Error
158
- false
159
- end
160
-
161
- def reconnect!
162
- super
163
- disconnect!
164
- connect
165
- end
166
-
167
- # Disconnects from the database if already connected. Otherwise, this
168
- # method does nothing.
169
- def disconnect!
170
- super
171
- @connection.close rescue nil
172
- end
173
-
174
- def reset!
175
- if @connection.respond_to?(:change_user)
176
- # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to
177
- # reset the connection is to change the user to the same user.
178
- @connection.change_user(@config[:username], @config[:password], @config[:database])
179
- configure_connection
180
- end
181
- end
182
-
183
- #--
184
- # DATABASE STATEMENTS ======================================
185
- #++
186
-
187
- def select_rows(sql, name = nil, binds = [])
188
- @connection.query_with_result = true
189
- rows = exec_query(sql, name, binds).rows
190
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
191
- rows
192
- end
193
-
194
- # Clears the prepared statements cache.
195
- def clear_cache!
196
- super
197
- @statements.clear
198
- end
199
-
200
- # Taken from here:
201
- # https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb
202
- # Author: TOMITA Masahiro <tommy@tmtm.org>
203
- ENCODINGS = {
204
- "armscii8" => nil,
205
- "ascii" => Encoding::US_ASCII,
206
- "big5" => Encoding::Big5,
207
- "binary" => Encoding::ASCII_8BIT,
208
- "cp1250" => Encoding::Windows_1250,
209
- "cp1251" => Encoding::Windows_1251,
210
- "cp1256" => Encoding::Windows_1256,
211
- "cp1257" => Encoding::Windows_1257,
212
- "cp850" => Encoding::CP850,
213
- "cp852" => Encoding::CP852,
214
- "cp866" => Encoding::IBM866,
215
- "cp932" => Encoding::Windows_31J,
216
- "dec8" => nil,
217
- "eucjpms" => Encoding::EucJP_ms,
218
- "euckr" => Encoding::EUC_KR,
219
- "gb2312" => Encoding::EUC_CN,
220
- "gbk" => Encoding::GBK,
221
- "geostd8" => nil,
222
- "greek" => Encoding::ISO_8859_7,
223
- "hebrew" => Encoding::ISO_8859_8,
224
- "hp8" => nil,
225
- "keybcs2" => nil,
226
- "koi8r" => Encoding::KOI8_R,
227
- "koi8u" => Encoding::KOI8_U,
228
- "latin1" => Encoding::ISO_8859_1,
229
- "latin2" => Encoding::ISO_8859_2,
230
- "latin5" => Encoding::ISO_8859_9,
231
- "latin7" => Encoding::ISO_8859_13,
232
- "macce" => Encoding::MacCentEuro,
233
- "macroman" => Encoding::MacRoman,
234
- "sjis" => Encoding::SHIFT_JIS,
235
- "swe7" => nil,
236
- "tis620" => Encoding::TIS_620,
237
- "ucs2" => Encoding::UTF_16BE,
238
- "ujis" => Encoding::EucJP_ms,
239
- "utf8" => Encoding::UTF_8,
240
- "utf8mb4" => Encoding::UTF_8,
241
- }
242
-
243
- # Get the client encoding for this database
244
- def client_encoding
245
- return @client_encoding if @client_encoding
246
-
247
- result = exec_query(
248
- "select @@character_set_client",
249
- 'SCHEMA')
250
- @client_encoding = ENCODINGS[result.rows.last.last]
251
- end
252
-
253
- def exec_query(sql, name = 'SQL', binds = [])
254
- if without_prepared_statement?(binds)
255
- result_set, affected_rows = exec_without_stmt(sql, name)
256
- else
257
- result_set, affected_rows = exec_stmt(sql, name, binds)
258
- end
259
-
260
- yield affected_rows if block_given?
261
-
262
- result_set
263
- end
264
-
265
- def last_inserted_id(result)
266
- @connection.insert_id
267
- end
268
-
269
- module Fields # :nodoc:
270
- class DateTime < Type::DateTime # :nodoc:
271
- def cast_value(value)
272
- if Mysql::Time === value
273
- new_time(
274
- value.year,
275
- value.month,
276
- value.day,
277
- value.hour,
278
- value.minute,
279
- value.second,
280
- value.second_part)
281
- else
282
- super
283
- end
284
- end
285
- end
286
-
287
- class Time < Type::Time # :nodoc:
288
- def cast_value(value)
289
- if Mysql::Time === value
290
- new_time(
291
- 2000,
292
- 01,
293
- 01,
294
- value.hour,
295
- value.minute,
296
- value.second,
297
- value.second_part)
298
- else
299
- super
300
- end
301
- end
302
- end
303
-
304
- class << self
305
- TYPES = Type::HashLookupTypeMap.new # :nodoc:
306
-
307
- delegate :register_type, :alias_type, to: :TYPES
308
-
309
- def find_type(field)
310
- if field.type == Mysql::Field::TYPE_TINY && field.length > 1
311
- TYPES.lookup(Mysql::Field::TYPE_LONG)
312
- else
313
- TYPES.lookup(field.type)
314
- end
315
- end
316
- end
317
-
318
- register_type Mysql::Field::TYPE_TINY, Type::Boolean.new
319
- register_type Mysql::Field::TYPE_LONG, Type::Integer.new
320
- alias_type Mysql::Field::TYPE_LONGLONG, Mysql::Field::TYPE_LONG
321
- alias_type Mysql::Field::TYPE_NEWDECIMAL, Mysql::Field::TYPE_LONG
322
-
323
- register_type Mysql::Field::TYPE_DATE, Type::Date.new
324
- register_type Mysql::Field::TYPE_DATETIME, Fields::DateTime.new
325
- register_type Mysql::Field::TYPE_TIME, Fields::Time.new
326
- register_type Mysql::Field::TYPE_FLOAT, Type::Float.new
327
- end
328
-
329
- def initialize_type_map(m) # :nodoc:
330
- super
331
- m.register_type %r(datetime)i, Fields::DateTime.new
332
- m.register_type %r(time)i, Fields::Time.new
333
- end
334
-
335
- def exec_without_stmt(sql, name = 'SQL') # :nodoc:
336
- # Some queries, like SHOW CREATE TABLE don't work through the prepared
337
- # statement API. For those queries, we need to use this method. :'(
338
- log(sql, name) do
339
- result = @connection.query(sql)
340
- affected_rows = @connection.affected_rows
341
-
342
- if result
343
- types = {}
344
- fields = []
345
- result.fetch_fields.each { |field|
346
- field_name = field.name
347
- fields << field_name
348
-
349
- if field.decimals > 0
350
- types[field_name] = Type::Decimal.new
351
- else
352
- types[field_name] = Fields.find_type field
353
- end
354
- }
355
-
356
- result_set = ActiveRecord::Result.new(fields, result.to_a, types)
357
- result.free
358
- else
359
- result_set = ActiveRecord::Result.new([], [])
360
- end
361
-
362
- [result_set, affected_rows]
363
- end
364
- end
365
-
366
- def execute_and_free(sql, name = nil) # :nodoc:
367
- result = execute(sql, name)
368
- ret = yield result
369
- result.free
370
- ret
371
- end
372
-
373
- def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
374
- super sql, name
375
- id_value || @connection.insert_id
376
- end
377
- alias :create :insert_sql
378
-
379
- def exec_delete(sql, name, binds) # :nodoc:
380
- affected_rows = 0
381
-
382
- exec_query(sql, name, binds) do |n|
383
- affected_rows = n
384
- end
385
-
386
- affected_rows
387
- end
388
- alias :exec_update :exec_delete
389
-
390
- def begin_db_transaction #:nodoc:
391
- exec_query "BEGIN"
392
- end
393
-
394
- private
395
-
396
- def exec_stmt(sql, name, binds)
397
- cache = {}
398
- type_casted_binds = binds.map { |col, val|
399
- [col, type_cast(val, col)]
400
- }
401
-
402
- log(sql, name, type_casted_binds) do
403
- if binds.empty?
404
- stmt = @connection.prepare(sql)
405
- else
406
- cache = @statements[sql] ||= {
407
- :stmt => @connection.prepare(sql)
408
- }
409
- stmt = cache[:stmt]
410
- end
411
-
412
- begin
413
- stmt.execute(*type_casted_binds.map { |_, val| val })
414
- rescue Mysql::Error => e
415
- # Older versions of MySQL leave the prepared statement in a bad
416
- # place when an error occurs. To support older MySQL versions, we
417
- # need to close the statement and delete the statement from the
418
- # cache.
419
- stmt.close
420
- @statements.delete sql
421
- raise e
422
- end
423
-
424
- cols = nil
425
- if metadata = stmt.result_metadata
426
- cols = cache[:cols] ||= metadata.fetch_fields.map { |field|
427
- field.name
428
- }
429
- metadata.free
430
- end
431
-
432
- result_set = ActiveRecord::Result.new(cols, stmt.to_a) if cols
433
- affected_rows = stmt.affected_rows
434
-
435
- stmt.free_result
436
- stmt.close if binds.empty?
437
-
438
- [result_set, affected_rows]
439
- end
440
- end
441
-
442
- def connect
443
- encoding = @config[:encoding]
444
- if encoding
445
- @connection.options(Mysql::SET_CHARSET_NAME, encoding) rescue nil
446
- end
447
-
448
- if @config[:sslca] || @config[:sslkey]
449
- @connection.ssl_set(@config[:sslkey], @config[:sslcert], @config[:sslca], @config[:sslcapath], @config[:sslcipher])
450
- end
451
-
452
- @connection.options(Mysql::OPT_CONNECT_TIMEOUT, @config[:connect_timeout]) if @config[:connect_timeout]
453
- @connection.options(Mysql::OPT_READ_TIMEOUT, @config[:read_timeout]) if @config[:read_timeout]
454
- @connection.options(Mysql::OPT_WRITE_TIMEOUT, @config[:write_timeout]) if @config[:write_timeout]
455
-
456
- @connection.real_connect(*@connection_options)
457
-
458
- # reconnect must be set after real_connect is called, because real_connect sets it to false internally
459
- @connection.reconnect = !!@config[:reconnect] if @connection.respond_to?(:reconnect=)
460
-
461
- configure_connection
462
- end
463
-
464
- # Many Rails applications monkey-patch a replacement of the configure_connection method
465
- # and don't call 'super', so leave this here even though it looks superfluous.
466
- def configure_connection
467
- super
468
- end
469
-
470
- def select(sql, name = nil, binds = [])
471
- @connection.query_with_result = true
472
- rows = super
473
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
474
- rows
475
- end
476
-
477
- # Returns the full version of the connected MySQL server.
478
- def full_version
479
- @full_version ||= @connection.server_info
480
- end
481
-
482
- def set_field_encoding field_name
483
- field_name.force_encoding(client_encoding)
484
- if internal_enc = Encoding.default_internal
485
- field_name = field_name.encode!(internal_enc)
486
- end
487
- field_name
488
- end
489
- end
490
- end
491
- end