activerecord 2.3.18 → 3.2.22

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 (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -0,0 +1,296 @@
1
+ require 'set'
2
+
3
+ module ActiveRecord
4
+ # :stopdoc:
5
+ module ConnectionAdapters
6
+ # An abstract definition of a column in a table.
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
10
+
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
20
+
21
+ # Instantiates a new column in the table.
22
+ #
23
+ # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int(11)</tt>.
24
+ # +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.
28
+ # +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
50
+ end
51
+
52
+ def has_default?
53
+ !default.nil?
54
+ end
55
+
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 klass.value_to_integer(value)
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 "#{klass}.value_to_integer(#{var_name})"
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
105
+ end
106
+
107
+ # Returns the human name of the column name.
108
+ #
109
+ # ===== Examples
110
+ # Column.new('sales_stage', ...).human_name # => 'Sales stage'
111
+ def human_name
112
+ Base.human_attribute_name(@name)
113
+ end
114
+
115
+ def extract_default(default)
116
+ type_cast(default)
117
+ end
118
+
119
+ # Used to convert from Strings to BLOBs
120
+ def string_to_binary(value)
121
+ self.class.string_to_binary(value)
122
+ end
123
+
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
+ dummy_time_string = "2000-01-01 #{string}"
154
+
155
+ fast_string_to_time(dummy_time_string) || begin
156
+ time_hash = Date._parse(dummy_time_string)
157
+ return nil if time_hash[:hour].nil?
158
+ new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
159
+ end
160
+ end
161
+
162
+ # convert something to a boolean
163
+ def value_to_boolean(value)
164
+ if value.is_a?(String) && value.blank?
165
+ nil
166
+ else
167
+ TRUE_VALUES.include?(value)
168
+ end
169
+ end
170
+
171
+ # Used to convert values to integer.
172
+ # handle the case when an integer column is used to store boolean values
173
+ def value_to_integer(value)
174
+ case value
175
+ when TrueClass, FalseClass
176
+ value ? 1 : 0
177
+ else
178
+ value.to_i rescue nil
179
+ end
180
+ end
181
+
182
+ # convert something to a BigDecimal
183
+ def value_to_decimal(value)
184
+ # Using .class is faster than .is_a? and
185
+ # subclasses of BigDecimal will be handled
186
+ # in the else clause
187
+ if value.class == BigDecimal
188
+ value
189
+ elsif value.respond_to?(:to_d)
190
+ value.to_d
191
+ else
192
+ value.to_s.to_d
193
+ end
194
+ end
195
+
196
+ protected
197
+ # '0.123456' -> 123456
198
+ # '1.123456' -> 123456
199
+ def microseconds(time)
200
+ time[:sec_fraction] ? (time[:sec_fraction] * 1_000_000).to_i : 0
201
+ end
202
+
203
+ def new_date(year, mon, mday)
204
+ if year && year != 0
205
+ Date.new(year, mon, mday) rescue nil
206
+ end
207
+ end
208
+
209
+ def new_time(year, mon, mday, hour, min, sec, microsec)
210
+ # Treat 0000-00-00 00:00:00 as nil.
211
+ return nil if year.nil? || (year == 0 && mon == 0 && mday == 0)
212
+
213
+ Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
214
+ end
215
+
216
+ def fast_string_to_date(string)
217
+ if string =~ Format::ISO_DATE
218
+ new_date $1.to_i, $2.to_i, $3.to_i
219
+ end
220
+ end
221
+
222
+ if RUBY_VERSION >= '1.9'
223
+ # Doesn't handle time zones.
224
+ def fast_string_to_time(string)
225
+ if string =~ Format::ISO_DATETIME
226
+ microsec = ($7.to_r * 1_000_000).to_i
227
+ new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
228
+ end
229
+ end
230
+ else
231
+ def fast_string_to_time(string)
232
+ if string =~ Format::ISO_DATETIME
233
+ microsec = ($7.to_f * 1_000_000).round.to_i
234
+ new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
235
+ end
236
+ end
237
+ end
238
+
239
+ def fallback_string_to_date(string)
240
+ new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
241
+ end
242
+
243
+ def fallback_string_to_time(string)
244
+ time_hash = Date._parse(string)
245
+ time_hash[:sec_fraction] = microseconds(time_hash)
246
+
247
+ new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
248
+ end
249
+ end
250
+
251
+ private
252
+ def extract_limit(sql_type)
253
+ $1.to_i if sql_type =~ /\((.*)\)/
254
+ end
255
+
256
+ def extract_precision(sql_type)
257
+ $2.to_i if sql_type =~ /^(numeric|decimal|number)\((\d+)(,\d+)?\)/i
258
+ end
259
+
260
+ def extract_scale(sql_type)
261
+ case sql_type
262
+ when /^(numeric|decimal|number)\((\d+)\)/i then 0
263
+ when /^(numeric|decimal|number)\((\d+)(,(\d+))\)/i then $4.to_i
264
+ end
265
+ end
266
+
267
+ def simplified_type(field_type)
268
+ case field_type
269
+ when /int/i
270
+ :integer
271
+ when /float|double/i
272
+ :float
273
+ when /decimal|numeric|number/i
274
+ extract_scale(field_type) == 0 ? :integer : :decimal
275
+ when /datetime/i
276
+ :datetime
277
+ when /timestamp/i
278
+ :timestamp
279
+ when /time/i
280
+ :time
281
+ when /date/i
282
+ :date
283
+ when /clob/i, /text/i
284
+ :text
285
+ when /blob/i, /binary/i
286
+ :binary
287
+ when /char/i, /string/i
288
+ :string
289
+ when /boolean/i
290
+ :boolean
291
+ end
292
+ end
293
+ end
294
+ end
295
+ # :startdoc:
296
+ end
@@ -0,0 +1,280 @@
1
+ require 'active_record/connection_adapters/abstract_mysql_adapter'
2
+
3
+ gem 'mysql2', '~> 0.3.10'
4
+ require 'mysql2'
5
+
6
+ module ActiveRecord
7
+ class Base
8
+ # Establishes a connection to the database that's used by all Active Record objects.
9
+ def self.mysql2_connection(config)
10
+ config[:username] = 'root' if config[:username].nil?
11
+
12
+ if Mysql2::Client.const_defined? :FOUND_ROWS
13
+ config[:flags] = Mysql2::Client::FOUND_ROWS
14
+ end
15
+
16
+ client = Mysql2::Client.new(config.symbolize_keys)
17
+ options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
18
+ ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
19
+ end
20
+ end
21
+
22
+ module ConnectionAdapters
23
+ class Mysql2Adapter < AbstractMysqlAdapter
24
+
25
+ class Column < AbstractMysqlAdapter::Column # :nodoc:
26
+ def adapter
27
+ Mysql2Adapter
28
+ end
29
+ end
30
+
31
+ ADAPTER_NAME = 'Mysql2'
32
+
33
+ def initialize(connection, logger, connection_options, config)
34
+ super
35
+ @visitor = BindSubstitution.new self
36
+ configure_connection
37
+ end
38
+
39
+ def supports_explain?
40
+ true
41
+ end
42
+
43
+ # HELPER METHODS ===========================================
44
+
45
+ def each_hash(result) # :nodoc:
46
+ if block_given?
47
+ result.each(:as => :hash, :symbolize_keys => true) do |row|
48
+ yield row
49
+ end
50
+ else
51
+ to_enum(:each_hash, result)
52
+ end
53
+ end
54
+
55
+ def new_column(field, default, type, null, collation) # :nodoc:
56
+ Column.new(field, default, type, null, collation)
57
+ end
58
+
59
+ def error_number(exception)
60
+ exception.error_number if exception.respond_to?(:error_number)
61
+ end
62
+
63
+ # QUOTING ==================================================
64
+
65
+ def quote_string(string)
66
+ @connection.escape(string)
67
+ end
68
+
69
+ # CONNECTION MANAGEMENT ====================================
70
+
71
+ def active?
72
+ return false unless @connection
73
+ @connection.ping
74
+ end
75
+
76
+ def reconnect!
77
+ disconnect!
78
+ connect
79
+ end
80
+
81
+ # Disconnects from the database if already connected.
82
+ # Otherwise, this method does nothing.
83
+ def disconnect!
84
+ unless @connection.nil?
85
+ @connection.close
86
+ @connection = nil
87
+ end
88
+ end
89
+
90
+ def reset!
91
+ disconnect!
92
+ connect
93
+ end
94
+
95
+ # DATABASE STATEMENTS ======================================
96
+
97
+ def explain(arel, binds = [])
98
+ sql = "EXPLAIN #{to_sql(arel, binds.dup)}"
99
+ start = Time.now
100
+ result = exec_query(sql, 'EXPLAIN', binds)
101
+ elapsed = Time.now - start
102
+
103
+ ExplainPrettyPrinter.new.pp(result, elapsed)
104
+ end
105
+
106
+ class ExplainPrettyPrinter # :nodoc:
107
+ # Pretty prints the result of a EXPLAIN in a way that resembles the output of the
108
+ # MySQL shell:
109
+ #
110
+ # +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
111
+ # | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
112
+ # +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
113
+ # | 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |
114
+ # | 1 | SIMPLE | posts | ALL | NULL | NULL | NULL | NULL | 1 | Using where |
115
+ # +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
116
+ # 2 rows in set (0.00 sec)
117
+ #
118
+ # This is an exercise in Ruby hyperrealism :).
119
+ def pp(result, elapsed)
120
+ widths = compute_column_widths(result)
121
+ separator = build_separator(widths)
122
+
123
+ pp = []
124
+
125
+ pp << separator
126
+ pp << build_cells(result.columns, widths)
127
+ pp << separator
128
+
129
+ result.rows.each do |row|
130
+ pp << build_cells(row, widths)
131
+ end
132
+
133
+ pp << separator
134
+ pp << build_footer(result.rows.length, elapsed)
135
+
136
+ pp.join("\n") + "\n"
137
+ end
138
+
139
+ private
140
+
141
+ def compute_column_widths(result)
142
+ [].tap do |widths|
143
+ result.columns.each_with_index do |column, i|
144
+ cells_in_column = [column] + result.rows.map {|r| r[i].nil? ? 'NULL' : r[i].to_s}
145
+ widths << cells_in_column.map(&:length).max
146
+ end
147
+ end
148
+ end
149
+
150
+ def build_separator(widths)
151
+ padding = 1
152
+ '+' + widths.map {|w| '-' * (w + (padding*2))}.join('+') + '+'
153
+ end
154
+
155
+ def build_cells(items, widths)
156
+ cells = []
157
+ items.each_with_index do |item, i|
158
+ item = 'NULL' if item.nil?
159
+ justifier = item.is_a?(Numeric) ? 'rjust' : 'ljust'
160
+ cells << item.to_s.send(justifier, widths[i])
161
+ end
162
+ '| ' + cells.join(' | ') + ' |'
163
+ end
164
+
165
+ def build_footer(nrows, elapsed)
166
+ rows_label = nrows == 1 ? 'row' : 'rows'
167
+ "#{nrows} #{rows_label} in set (%.2f sec)" % elapsed
168
+ end
169
+ end
170
+
171
+ # FIXME: re-enable the following once a "better" query_cache solution is in core
172
+ #
173
+ # The overrides below perform much better than the originals in AbstractAdapter
174
+ # because we're able to take advantage of mysql2's lazy-loading capabilities
175
+ #
176
+ # # Returns a record hash with the column names as keys and column values
177
+ # # as values.
178
+ # def select_one(sql, name = nil)
179
+ # result = execute(sql, name)
180
+ # result.each(:as => :hash) do |r|
181
+ # return r
182
+ # end
183
+ # end
184
+ #
185
+ # # Returns a single value from a record
186
+ # def select_value(sql, name = nil)
187
+ # result = execute(sql, name)
188
+ # if first = result.first
189
+ # first.first
190
+ # end
191
+ # end
192
+ #
193
+ # # Returns an array of the values of the first column in a select:
194
+ # # select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
195
+ # def select_values(sql, name = nil)
196
+ # execute(sql, name).map { |row| row.first }
197
+ # end
198
+
199
+ # Returns an array of arrays containing the field values.
200
+ # Order is the same as that returned by +columns+.
201
+ def select_rows(sql, name = nil)
202
+ execute(sql, name).to_a
203
+ end
204
+
205
+ # Executes the SQL statement in the context of this connection.
206
+ def execute(sql, name = nil)
207
+ if @connection
208
+ # make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
209
+ # made since we established the connection
210
+ @connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
211
+ end
212
+
213
+ super
214
+ end
215
+
216
+ def exec_query(sql, name = 'SQL', binds = [])
217
+ result = execute(sql, name)
218
+ ActiveRecord::Result.new(result.fields, result.to_a)
219
+ end
220
+
221
+ alias exec_without_stmt exec_query
222
+
223
+ # Returns an array of record hashes with the column names as keys and
224
+ # column values as values.
225
+ def select(sql, name = nil, binds = [])
226
+ exec_query(sql, name).to_a
227
+ end
228
+
229
+ def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
230
+ super
231
+ id_value || @connection.last_id
232
+ end
233
+ alias :create :insert_sql
234
+
235
+ def exec_insert(sql, name, binds)
236
+ execute to_sql(sql, binds), name
237
+ end
238
+
239
+ def exec_delete(sql, name, binds)
240
+ execute to_sql(sql, binds), name
241
+ @connection.affected_rows
242
+ end
243
+ alias :exec_update :exec_delete
244
+
245
+ def last_inserted_id(result)
246
+ @connection.last_id
247
+ end
248
+
249
+ private
250
+
251
+ def connect
252
+ @connection = Mysql2::Client.new(@config)
253
+ configure_connection
254
+ end
255
+
256
+ def configure_connection
257
+ @connection.query_options.merge!(:as => :array)
258
+
259
+ # By default, MySQL 'where id is null' selects the last inserted id.
260
+ # Turn this off. http://dev.rubyonrails.org/ticket/6778
261
+ variable_assignments = ['SQL_AUTO_IS_NULL=0']
262
+ encoding = @config[:encoding]
263
+
264
+ # make sure we set the encoding
265
+ variable_assignments << "NAMES '#{encoding}'" if encoding
266
+
267
+ # increase timeout so mysql server doesn't disconnect us
268
+ wait_timeout = @config[:wait_timeout]
269
+ wait_timeout = 2147483 unless wait_timeout.is_a?(Fixnum)
270
+ variable_assignments << "@@wait_timeout = #{wait_timeout}"
271
+
272
+ execute("SET #{variable_assignments.join(', ')}", :skip_logging)
273
+ end
274
+
275
+ def version
276
+ @version ||= @connection.info[:version].scan(/^(\d+)\.(\d+)\.(\d+)/).flatten.map { |v| v.to_i }
277
+ end
278
+ end
279
+ end
280
+ end