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,426 +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.8.1'
6
- require 'mysql'
7
-
8
- class Mysql
9
- class Time
10
- ###
11
- # This monkey patch is for test_additional_columns_from_join_table
12
- def to_date
13
- Date.new(year, month, day)
14
- end
15
- end
16
- class Stmt; include Enumerable end
17
- class Result; include Enumerable end
18
- end
19
-
20
- module ActiveRecord
21
- class Base
22
- # Establishes a connection to the database that's used by all Active Record objects.
23
- def self.mysql_connection(config) # :nodoc:
24
- config = config.symbolize_keys
25
- host = config[:host]
26
- port = config[:port]
27
- socket = config[:socket]
28
- username = config[:username] ? config[:username].to_s : 'root'
29
- password = config[:password].to_s
30
- database = config[:database]
31
-
32
- mysql = Mysql.init
33
- mysql.ssl_set(config[:sslkey], config[:sslcert], config[:sslca], config[:sslcapath], config[:sslcipher]) if config[:sslca] || config[:sslkey]
34
-
35
- default_flags = Mysql.const_defined?(:CLIENT_MULTI_RESULTS) ? Mysql::CLIENT_MULTI_RESULTS : 0
36
- default_flags |= Mysql::CLIENT_FOUND_ROWS if Mysql.const_defined?(:CLIENT_FOUND_ROWS)
37
- options = [host, username, password, database, port, socket, default_flags]
38
- ConnectionAdapters::MysqlAdapter.new(mysql, logger, options, config)
39
- end
40
- end
41
-
42
- module ConnectionAdapters
43
- # The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with
44
- # the faster C-based MySQL/Ruby adapter (available both as a gem and from http://www.tmtm.org/en/mysql/ruby/).
45
- #
46
- # Options:
47
- #
48
- # * <tt>:host</tt> - Defaults to "localhost".
49
- # * <tt>:port</tt> - Defaults to 3306.
50
- # * <tt>:socket</tt> - Defaults to "/tmp/mysql.sock".
51
- # * <tt>:username</tt> - Defaults to "root"
52
- # * <tt>:password</tt> - Defaults to nothing.
53
- # * <tt>:database</tt> - The name of the database. No default, must be provided.
54
- # * <tt>:encoding</tt> - (Optional) Sets the client encoding by executing "SET NAMES <encoding>" after connection.
55
- # * <tt>:reconnect</tt> - Defaults to false (See MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).
56
- # * <tt>:sslca</tt> - Necessary to use MySQL with an SSL connection.
57
- # * <tt>:sslkey</tt> - Necessary to use MySQL with an SSL connection.
58
- # * <tt>:sslcert</tt> - Necessary to use MySQL with an SSL connection.
59
- # * <tt>:sslcapath</tt> - Necessary to use MySQL with an SSL connection.
60
- # * <tt>:sslcipher</tt> - Necessary to use MySQL with an SSL connection.
61
- #
62
- class MysqlAdapter < AbstractMysqlAdapter
63
-
64
- class Column < AbstractMysqlAdapter::Column #:nodoc:
65
- def self.string_to_time(value)
66
- return super unless Mysql::Time === value
67
- new_time(
68
- value.year,
69
- value.month,
70
- value.day,
71
- value.hour,
72
- value.minute,
73
- value.second,
74
- value.second_part)
75
- end
76
-
77
- def self.string_to_dummy_time(v)
78
- return super unless Mysql::Time === v
79
- new_time(2000, 01, 01, v.hour, v.minute, v.second, v.second_part)
80
- end
81
-
82
- def self.string_to_date(v)
83
- return super unless Mysql::Time === v
84
- new_date(v.year, v.month, v.day)
85
- end
86
-
87
- def adapter
88
- MysqlAdapter
89
- end
90
- end
91
-
92
- ADAPTER_NAME = 'MySQL'
93
-
94
- class StatementPool < ConnectionAdapters::StatementPool
95
- def initialize(connection, max = 1000)
96
- super
97
- @cache = Hash.new { |h,pid| h[pid] = {} }
98
- end
99
-
100
- def each(&block); cache.each(&block); end
101
- def key?(key); cache.key?(key); end
102
- def [](key); cache[key]; end
103
- def length; cache.length; end
104
- def delete(key); cache.delete(key); end
105
-
106
- def []=(sql, key)
107
- while @max <= cache.size
108
- cache.shift.last[:stmt].close
109
- end
110
- cache[sql] = key
111
- end
112
-
113
- def clear
114
- cache.values.each do |hash|
115
- hash[:stmt].close
116
- end
117
- cache.clear
118
- end
119
-
120
- private
121
- def cache
122
- @cache[$$]
123
- end
124
- end
125
-
126
- def initialize(connection, logger, connection_options, config)
127
- super
128
- @statements = StatementPool.new(@connection,
129
- config.fetch(:statement_limit) { 1000 })
130
- @client_encoding = nil
131
- connect
132
- end
133
-
134
- # Returns true, since this connection adapter supports prepared statement
135
- # caching.
136
- def supports_statement_cache?
137
- true
138
- end
139
-
140
- # HELPER METHODS ===========================================
141
-
142
- def each_hash(result) # :nodoc:
143
- if block_given?
144
- result.each_hash do |row|
145
- row.symbolize_keys!
146
- yield row
147
- end
148
- else
149
- to_enum(:each_hash, result)
150
- end
151
- end
152
-
153
- def new_column(field, default, type, null, collation) # :nodoc:
154
- Column.new(field, default, type, null, collation)
155
- end
156
-
157
- def error_number(exception) # :nodoc:
158
- exception.errno if exception.respond_to?(:errno)
159
- end
160
-
161
- # QUOTING ==================================================
162
-
163
- def type_cast(value, column)
164
- return super unless value == true || value == false
165
-
166
- value ? 1 : 0
167
- end
168
-
169
- def quote_string(string) #:nodoc:
170
- @connection.quote(string)
171
- end
172
-
173
- # CONNECTION MANAGEMENT ====================================
174
-
175
- def active?
176
- if @connection.respond_to?(:stat)
177
- @connection.stat
178
- else
179
- @connection.query 'select 1'
180
- end
181
-
182
- # mysql-ruby doesn't raise an exception when stat fails.
183
- if @connection.respond_to?(:errno)
184
- @connection.errno.zero?
185
- else
186
- true
187
- end
188
- rescue Mysql::Error
189
- false
190
- end
191
-
192
- def reconnect!
193
- disconnect!
194
- clear_cache!
195
- connect
196
- end
197
-
198
- # Disconnects from the database if already connected. Otherwise, this
199
- # method does nothing.
200
- def disconnect!
201
- @connection.close rescue nil
202
- end
203
-
204
- def reset!
205
- if @connection.respond_to?(:change_user)
206
- # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to
207
- # reset the connection is to change the user to the same user.
208
- @connection.change_user(@config[:username], @config[:password], @config[:database])
209
- configure_connection
210
- end
211
- end
212
-
213
- # DATABASE STATEMENTS ======================================
214
-
215
- def select_rows(sql, name = nil)
216
- @connection.query_with_result = true
217
- rows = exec_without_stmt(sql, name).rows
218
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
219
- rows
220
- end
221
-
222
- # Clears the prepared statements cache.
223
- def clear_cache!
224
- @statements.clear
225
- end
226
-
227
- if "<3".respond_to?(:encode)
228
- # Taken from here:
229
- # https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb
230
- # Author: TOMITA Masahiro <tommy@tmtm.org>
231
- ENCODINGS = {
232
- "armscii8" => nil,
233
- "ascii" => Encoding::US_ASCII,
234
- "big5" => Encoding::Big5,
235
- "binary" => Encoding::ASCII_8BIT,
236
- "cp1250" => Encoding::Windows_1250,
237
- "cp1251" => Encoding::Windows_1251,
238
- "cp1256" => Encoding::Windows_1256,
239
- "cp1257" => Encoding::Windows_1257,
240
- "cp850" => Encoding::CP850,
241
- "cp852" => Encoding::CP852,
242
- "cp866" => Encoding::IBM866,
243
- "cp932" => Encoding::Windows_31J,
244
- "dec8" => nil,
245
- "eucjpms" => Encoding::EucJP_ms,
246
- "euckr" => Encoding::EUC_KR,
247
- "gb2312" => Encoding::EUC_CN,
248
- "gbk" => Encoding::GBK,
249
- "geostd8" => nil,
250
- "greek" => Encoding::ISO_8859_7,
251
- "hebrew" => Encoding::ISO_8859_8,
252
- "hp8" => nil,
253
- "keybcs2" => nil,
254
- "koi8r" => Encoding::KOI8_R,
255
- "koi8u" => Encoding::KOI8_U,
256
- "latin1" => Encoding::ISO_8859_1,
257
- "latin2" => Encoding::ISO_8859_2,
258
- "latin5" => Encoding::ISO_8859_9,
259
- "latin7" => Encoding::ISO_8859_13,
260
- "macce" => Encoding::MacCentEuro,
261
- "macroman" => Encoding::MacRoman,
262
- "sjis" => Encoding::SHIFT_JIS,
263
- "swe7" => nil,
264
- "tis620" => Encoding::TIS_620,
265
- "ucs2" => Encoding::UTF_16BE,
266
- "ujis" => Encoding::EucJP_ms,
267
- "utf8" => Encoding::UTF_8,
268
- "utf8mb4" => Encoding::UTF_8,
269
- }
270
- else
271
- ENCODINGS = Hash.new { |h,k| h[k] = k }
272
- end
273
-
274
- # Get the client encoding for this database
275
- def client_encoding
276
- return @client_encoding if @client_encoding
277
-
278
- result = exec_query(
279
- "SHOW VARIABLES WHERE Variable_name = 'character_set_client'",
280
- 'SCHEMA')
281
- @client_encoding = ENCODINGS[result.rows.last.last]
282
- end
283
-
284
- def exec_query(sql, name = 'SQL', binds = [])
285
- log(sql, name, binds) do
286
- exec_stmt(sql, name, binds) do |cols, stmt|
287
- ActiveRecord::Result.new(cols, stmt.to_a) if cols
288
- end
289
- end
290
- end
291
-
292
- def last_inserted_id(result)
293
- @connection.insert_id
294
- end
295
-
296
- def exec_without_stmt(sql, name = 'SQL') # :nodoc:
297
- # Some queries, like SHOW CREATE TABLE don't work through the prepared
298
- # statement API. For those queries, we need to use this method. :'(
299
- log(sql, name) do
300
- result = @connection.query(sql)
301
- cols = []
302
- rows = []
303
-
304
- if result
305
- cols = result.fetch_fields.map { |field| field.name }
306
- rows = result.to_a
307
- result.free
308
- end
309
- ActiveRecord::Result.new(cols, rows)
310
- end
311
- end
312
-
313
- def execute_and_free(sql, name = nil)
314
- result = execute(sql, name)
315
- ret = yield result
316
- result.free
317
- ret
318
- end
319
-
320
- def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
321
- super sql, name
322
- id_value || @connection.insert_id
323
- end
324
- alias :create :insert_sql
325
-
326
- def exec_delete(sql, name, binds)
327
- log(sql, name, binds) do
328
- exec_stmt(sql, name, binds) do |cols, stmt|
329
- stmt.affected_rows
330
- end
331
- end
332
- end
333
- alias :exec_update :exec_delete
334
-
335
- def begin_db_transaction #:nodoc:
336
- exec_without_stmt "BEGIN"
337
- rescue Mysql::Error
338
- # Transactions aren't supported
339
- end
340
-
341
- private
342
-
343
- def exec_stmt(sql, name, binds)
344
- cache = {}
345
- if binds.empty?
346
- stmt = @connection.prepare(sql)
347
- else
348
- cache = @statements[sql] ||= {
349
- :stmt => @connection.prepare(sql)
350
- }
351
- stmt = cache[:stmt]
352
- end
353
-
354
- begin
355
- stmt.execute(*binds.map { |col, val| type_cast(val, col) })
356
- rescue Mysql::Error => e
357
- # Older versions of MySQL leave the prepared statement in a bad
358
- # place when an error occurs. To support older mysql versions, we
359
- # need to close the statement and delete the statement from the
360
- # cache.
361
- stmt.close
362
- @statements.delete sql
363
- raise e
364
- end
365
-
366
- cols = nil
367
- if metadata = stmt.result_metadata
368
- cols = cache[:cols] ||= metadata.fetch_fields.map { |field|
369
- field.name
370
- }
371
- end
372
-
373
- result = yield [cols, stmt]
374
-
375
- stmt.result_metadata.free if cols
376
- stmt.free_result
377
- stmt.close if binds.empty?
378
-
379
- result
380
- end
381
-
382
- def connect
383
- encoding = @config[:encoding]
384
- if encoding
385
- @connection.options(Mysql::SET_CHARSET_NAME, encoding) rescue nil
386
- end
387
-
388
- if @config[:sslca] || @config[:sslkey]
389
- @connection.ssl_set(@config[:sslkey], @config[:sslcert], @config[:sslca], @config[:sslcapath], @config[:sslcipher])
390
- end
391
-
392
- @connection.options(Mysql::OPT_CONNECT_TIMEOUT, @config[:connect_timeout]) if @config[:connect_timeout]
393
- @connection.options(Mysql::OPT_READ_TIMEOUT, @config[:read_timeout]) if @config[:read_timeout]
394
- @connection.options(Mysql::OPT_WRITE_TIMEOUT, @config[:write_timeout]) if @config[:write_timeout]
395
-
396
- @connection.real_connect(*@connection_options)
397
-
398
- # reconnect must be set after real_connect is called, because real_connect sets it to false internally
399
- @connection.reconnect = !!@config[:reconnect] if @connection.respond_to?(:reconnect=)
400
-
401
- configure_connection
402
- end
403
-
404
- def configure_connection
405
- encoding = @config[:encoding]
406
- execute("SET NAMES '#{encoding}'", :skip_logging) if encoding
407
-
408
- # By default, MySQL 'where id is null' selects the last inserted id.
409
- # Turn this off. http://dev.rubyonrails.org/ticket/6778
410
- execute("SET SQL_AUTO_IS_NULL=0", :skip_logging)
411
- end
412
-
413
- def select(sql, name = nil, binds = [])
414
- @connection.query_with_result = true
415
- rows = exec_query(sql, name, binds).to_a
416
- @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
417
- rows
418
- end
419
-
420
- # Returns the version of the connected MySQL server.
421
- def version
422
- @version ||= @connection.server_info.scan(/^(\d+)\.(\d+)\.(\d+)/).flatten.map { |v| v.to_i }
423
- end
424
- end
425
- end
426
- end