ibm_db 3.0.5-x86-mingw32 → 5.0.5-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,15 @@
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ module Coders
5
+ class JSONTest < ActiveRecord::TestCase
6
+ def test_returns_nil_if_empty_string_given
7
+ assert_nil JSON.load("")
8
+ end
9
+
10
+ def test_returns_nil_if_nil_given
11
+ assert_nil JSON.load(nil)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,115 @@
1
+ require "cases/helper"
2
+ require "models/computer"
3
+ require "models/developer"
4
+ require "models/project"
5
+ require "models/topic"
6
+ require "models/post"
7
+ require "models/comment"
8
+
9
+ module ActiveRecord
10
+ class CollectionCacheKeyTest < ActiveRecord::TestCase
11
+ fixtures :developers, :projects, :developers_projects, :topics, :comments, :posts
12
+
13
+ test "collection_cache_key on model" do
14
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, Developer.collection_cache_key)
15
+ end
16
+
17
+ test "cache_key for relation" do
18
+ developers = Developer.where(salary: 100000).order(updated_at: :desc)
19
+ last_developer_timestamp = developers.first.updated_at
20
+
21
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, developers.cache_key)
22
+
23
+ /\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/ =~ developers.cache_key
24
+
25
+ assert_equal Digest::MD5.hexdigest(developers.to_sql), $1
26
+ assert_equal developers.count.to_s, $2
27
+ assert_equal last_developer_timestamp.to_s(ActiveRecord::Base.cache_timestamp_format), $3
28
+ end
29
+
30
+ test "cache_key for relation with limit" do
31
+ developers = Developer.where(salary: 100000).order(updated_at: :desc).limit(5)
32
+ last_developer_timestamp = developers.first.updated_at
33
+
34
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, developers.cache_key)
35
+
36
+ /\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/ =~ developers.cache_key
37
+
38
+ assert_equal Digest::MD5.hexdigest(developers.to_sql), $1
39
+ assert_equal developers.count.to_s, $2
40
+ assert_equal last_developer_timestamp.to_s(ActiveRecord::Base.cache_timestamp_format), $3
41
+ end
42
+
43
+ test "cache_key for loaded relation" do
44
+ developers = Developer.where(salary: 100000).order(updated_at: :desc).limit(5).load
45
+ last_developer_timestamp = developers.first.updated_at
46
+
47
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, developers.cache_key)
48
+
49
+ /\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/ =~ developers.cache_key
50
+
51
+ assert_equal Digest::MD5.hexdigest(developers.to_sql), $1
52
+ assert_equal developers.count.to_s, $2
53
+ assert_equal last_developer_timestamp.to_s(ActiveRecord::Base.cache_timestamp_format), $3
54
+ end
55
+
56
+ test "it triggers at most one query" do
57
+ developers = Developer.where(name: "David")
58
+
59
+ assert_queries(1) { developers.cache_key }
60
+ assert_queries(0) { developers.cache_key }
61
+ end
62
+
63
+ test "it doesn't trigger any query if the relation is already loaded" do
64
+ developers = Developer.where(name: "David").load
65
+ assert_queries(0) { developers.cache_key }
66
+ end
67
+
68
+ test "relation cache_key changes when the sql query changes" do
69
+ developers = Developer.where(name: "David")
70
+ other_relation = Developer.where(name: "David").where("1 = 1")
71
+
72
+ assert_not_equal developers.cache_key, other_relation.cache_key
73
+ end
74
+
75
+ test "cache_key for empty relation" do
76
+ developers = Developer.where(name: "Non Existent Developer")
77
+ assert_match(/\Adevelopers\/query-(\h+)-0\Z/, developers.cache_key)
78
+ end
79
+
80
+ test "cache_key with custom timestamp column" do
81
+ topics = Topic.where("title like ?", "%Topic%")
82
+ last_topic_timestamp = topics(:fifth).written_on.utc.to_s(:usec)
83
+ assert_match(last_topic_timestamp, topics.cache_key(:written_on))
84
+ end
85
+
86
+ test "cache_key with unknown timestamp column" do
87
+ topics = Topic.where("title like ?", "%Topic%")
88
+ assert_raises(ActiveRecord::StatementInvalid) { topics.cache_key(:published_at) }
89
+ end
90
+
91
+ test "collection proxy provides a cache_key" do
92
+ developers = projects(:active_record).developers
93
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, developers.cache_key)
94
+ end
95
+
96
+ test "cache_key for loaded collection with zero size" do
97
+ Comment.delete_all
98
+ posts = Post.includes(:comments)
99
+ empty_loaded_collection = posts.first.comments
100
+
101
+ assert_match(/\Acomments\/query-(\h+)-0\Z/, empty_loaded_collection.cache_key)
102
+ end
103
+
104
+ test "cache_key for queries with offset which return 0 rows" do
105
+ developers = Developer.offset(20)
106
+ assert_match(/\Adevelopers\/query-(\h+)-0\Z/, developers.cache_key)
107
+ end
108
+
109
+ test "cache_key with a relation having selected columns" do
110
+ developers = Developer.select(:salary)
111
+
112
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\Z/, developers.cache_key)
113
+ end
114
+ end
115
+ end
@@ -14,7 +14,7 @@ module ActiveRecord
14
14
  # Avoid column definitions in create table statements like:
15
15
  # `title` varchar(255) DEFAULT NULL
16
16
  def test_should_not_include_default_clause_when_default_is_null
17
- column = Column.new("title", nil, Type::String.new(limit: 20))
17
+ column = Column.new("title", nil, SqlTypeMetadata.new(limit: 20))
18
18
  column_def = ColumnDefinition.new(
19
19
  column.name, "string",
20
20
  column.limit, column.precision, column.scale, column.default, column.null)
@@ -22,7 +22,7 @@ module ActiveRecord
22
22
  end
23
23
 
24
24
  def test_should_include_default_clause_when_default_is_present
25
- column = Column.new("title", "Hello", Type::String.new(limit: 20))
25
+ column = Column.new("title", "Hello", SqlTypeMetadata.new(limit: 20))
26
26
  column_def = ColumnDefinition.new(
27
27
  column.name, "string",
28
28
  column.limit, column.precision, column.scale, column.default, column.null)
@@ -30,94 +30,63 @@ module ActiveRecord
30
30
  end
31
31
 
32
32
  def test_should_specify_not_null_if_null_option_is_false
33
- column = Column.new("title", "Hello", Type::String.new(limit: 20), "varchar(20)", false)
33
+ type_metadata = SqlTypeMetadata.new(limit: 20)
34
+ column = Column.new("title", "Hello", type_metadata, false)
34
35
  column_def = ColumnDefinition.new(
35
36
  column.name, "string",
36
37
  column.limit, column.precision, column.scale, column.default, column.null)
37
38
  assert_equal %Q{title varchar(20) DEFAULT 'Hello' NOT NULL}, @viz.accept(column_def)
38
39
  end
39
40
 
40
- if current_adapter?(:MysqlAdapter)
41
+ if current_adapter?(:Mysql2Adapter)
41
42
  def test_should_set_default_for_mysql_binary_data_types
42
- binary_column = MysqlAdapter::Column.new("title", "a", Type::Binary.new, "binary(1)")
43
+ type = SqlTypeMetadata.new(type: :binary, sql_type: "binary(1)")
44
+ binary_column = MySQL::Column.new("title", "a", type)
43
45
  assert_equal "a", binary_column.default
44
46
 
45
- varbinary_column = MysqlAdapter::Column.new("title", "a", Type::Binary.new, "varbinary(1)")
47
+ type = SqlTypeMetadata.new(type: :binary, sql_type: "varbinary")
48
+ varbinary_column = MySQL::Column.new("title", "a", type)
46
49
  assert_equal "a", varbinary_column.default
47
50
  end
48
51
 
49
- def test_should_not_set_default_for_blob_and_text_data_types
50
- assert_raise ArgumentError do
51
- MysqlAdapter::Column.new("title", "a", Type::Binary.new, "blob")
52
- end
53
-
54
- assert_raise ArgumentError do
55
- MysqlAdapter::Column.new("title", "Hello", Type::Text.new)
56
- end
52
+ def test_should_be_empty_string_default_for_mysql_binary_data_types
53
+ type = SqlTypeMetadata.new(type: :binary, sql_type: "binary(1)")
54
+ binary_column = MySQL::Column.new("title", "", type, false)
55
+ assert_equal "", binary_column.default
57
56
 
58
- text_column = MysqlAdapter::Column.new("title", nil, Type::Text.new)
59
- assert_equal nil, text_column.default
60
-
61
- not_null_text_column = MysqlAdapter::Column.new("title", nil, Type::Text.new, "text", false)
62
- assert_equal "", not_null_text_column.default
63
- end
64
-
65
- def test_has_default_should_return_false_for_blob_and_text_data_types
66
- blob_column = MysqlAdapter::Column.new("title", nil, Type::Binary.new, "blob")
67
- assert !blob_column.has_default?
68
-
69
- text_column = MysqlAdapter::Column.new("title", nil, Type::Text.new)
70
- assert !text_column.has_default?
71
- end
72
- end
73
-
74
- if current_adapter?(:Mysql2Adapter)
75
- def test_should_set_default_for_mysql_binary_data_types
76
- binary_column = Mysql2Adapter::Column.new("title", "a", Type::Binary.new, "binary(1)")
77
- assert_equal "a", binary_column.default
78
-
79
- varbinary_column = Mysql2Adapter::Column.new("title", "a", Type::Binary.new, "varbinary(1)")
80
- assert_equal "a", varbinary_column.default
57
+ type = SqlTypeMetadata.new(type: :binary, sql_type: "varbinary")
58
+ varbinary_column = MySQL::Column.new("title", "", type, false)
59
+ assert_equal "", varbinary_column.default
81
60
  end
82
61
 
83
62
  def test_should_not_set_default_for_blob_and_text_data_types
84
63
  assert_raise ArgumentError do
85
- Mysql2Adapter::Column.new("title", "a", Type::Binary.new, "blob")
64
+ MySQL::Column.new("title", "a", SqlTypeMetadata.new(sql_type: "blob"))
86
65
  end
87
66
 
67
+ text_type = MySQL::TypeMetadata.new(
68
+ SqlTypeMetadata.new(type: :text))
88
69
  assert_raise ArgumentError do
89
- Mysql2Adapter::Column.new("title", "Hello", Type::Text.new)
70
+ MySQL::Column.new("title", "Hello", text_type)
90
71
  end
91
72
 
92
- text_column = Mysql2Adapter::Column.new("title", nil, Type::Text.new)
73
+ text_column = MySQL::Column.new("title", nil, text_type)
93
74
  assert_equal nil, text_column.default
94
75
 
95
- not_null_text_column = Mysql2Adapter::Column.new("title", nil, Type::Text.new, "text", false)
76
+ not_null_text_column = MySQL::Column.new("title", nil, text_type, false)
96
77
  assert_equal "", not_null_text_column.default
97
78
  end
98
79
 
99
80
  def test_has_default_should_return_false_for_blob_and_text_data_types
100
- blob_column = Mysql2Adapter::Column.new("title", nil, Type::Binary.new, "blob")
81
+ binary_type = SqlTypeMetadata.new(sql_type: "blob")
82
+ blob_column = MySQL::Column.new("title", nil, binary_type)
101
83
  assert !blob_column.has_default?
102
84
 
103
- text_column = Mysql2Adapter::Column.new("title", nil, Type::Text.new)
85
+ text_type = SqlTypeMetadata.new(type: :text)
86
+ text_column = MySQL::Column.new("title", nil, text_type)
104
87
  assert !text_column.has_default?
105
88
  end
106
89
  end
107
-
108
- if current_adapter?(:PostgreSQLAdapter)
109
- def test_bigint_column_should_map_to_integer
110
- oid = PostgreSQLAdapter::OID::Integer.new
111
- bigint_column = PostgreSQLColumn.new('number', nil, oid, "bigint")
112
- assert_equal :integer, bigint_column.type
113
- end
114
-
115
- def test_smallint_column_should_map_to_integer
116
- oid = PostgreSQLAdapter::OID::Integer.new
117
- smallint_column = PostgreSQLColumn.new('number', nil, oid, "smallint")
118
- assert_equal :integer, smallint_column.type
119
- end
120
- end
121
90
  end
122
91
  end
123
92
  end
@@ -0,0 +1,145 @@
1
+ require 'cases/helper'
2
+ require 'support/schema_dumping_helper'
3
+
4
+ if ActiveRecord::Base.connection.supports_comments?
5
+
6
+ class CommentTest < ActiveRecord::TestCase
7
+ include SchemaDumpingHelper
8
+
9
+ class Commented < ActiveRecord::Base
10
+ self.table_name = 'commenteds'
11
+ end
12
+
13
+ class BlankComment < ActiveRecord::Base
14
+ end
15
+
16
+ setup do
17
+ @connection = ActiveRecord::Base.connection
18
+
19
+ @connection.create_table('commenteds', comment: 'A table with comment', force: true) do |t|
20
+ t.string 'name', comment: 'Comment should help clarify the column purpose'
21
+ t.boolean 'obvious', comment: 'Question is: should you comment obviously named objects?'
22
+ t.string 'content'
23
+ t.index 'name', comment: %Q["Very important" index that powers all the performance.\nAnd it's fun!]
24
+ end
25
+
26
+ @connection.create_table('blank_comments', comment: ' ', force: true) do |t|
27
+ t.string :space_comment, comment: ' '
28
+ t.string :empty_comment, comment: ''
29
+ t.string :nil_comment, comment: nil
30
+ t.string :absent_comment
31
+ t.index :space_comment, comment: ' '
32
+ t.index :empty_comment, comment: ''
33
+ t.index :nil_comment, comment: nil
34
+ t.index :absent_comment
35
+ end
36
+
37
+ Commented.reset_column_information
38
+ BlankComment.reset_column_information
39
+ end
40
+
41
+ teardown do
42
+ @connection.drop_table 'commenteds'
43
+ #, if_exists: true
44
+ @connection.drop_table 'blank_comments'
45
+ #, if_exists: true
46
+ end
47
+
48
+ def test_column_created_in_block
49
+ column = Commented.columns_hash['name']
50
+ assert_equal :string, column.type
51
+ assert_equal 'Comment should help clarify the column purpose', column.comment
52
+ end
53
+
54
+ def test_blank_columns_created_in_block
55
+ %w[ space_comment empty_comment nil_comment absent_comment ].each do |field|
56
+ column = BlankComment.columns_hash[field]
57
+ assert_equal :string, column.type
58
+ assert_nil column.comment
59
+ end
60
+ end
61
+
62
+ def test_blank_indexes_created_in_block
63
+ @connection.indexes('blank_comments').each do |index|
64
+ assert_nil index.comment
65
+ end
66
+ end
67
+
68
+ def test_add_column_with_comment_later
69
+ @connection.add_column :commenteds, :rating, :integer, comment: 'I am running out of imagination'
70
+ Commented.reset_column_information
71
+ column = Commented.columns_hash['rating']
72
+
73
+ assert_equal :integer, column.type
74
+ assert_equal 'I am running out of imagination', column.comment
75
+ end
76
+
77
+ def test_add_index_with_comment_later
78
+ unless current_adapter?(:OracleAdapter)
79
+ @connection.add_index :commenteds, :obvious, name: 'idx_obvious', comment: 'We need to see obvious comments'
80
+ index = @connection.indexes('commenteds').find { |idef| idef.name == 'idx_obvious' }
81
+ assert_equal 'We need to see obvious comments', index.comment
82
+ end
83
+ end
84
+
85
+ def test_add_comment_to_column
86
+ @connection.change_column :commenteds, :content, :string, comment: 'Whoa, content describes itself!'
87
+
88
+ Commented.reset_column_information
89
+ column = Commented.columns_hash['content']
90
+
91
+ assert_equal :string, column.type
92
+ assert_equal 'Whoa, content describes itself!', column.comment
93
+ end
94
+
95
+ def test_remove_comment_from_column
96
+ @connection.change_column :commenteds, :obvious, :string, comment: nil
97
+
98
+ Commented.reset_column_information
99
+ column = Commented.columns_hash['obvious']
100
+
101
+ assert_equal :string, column.type
102
+ assert_nil column.comment
103
+ end
104
+
105
+ def test_schema_dump_with_comments
106
+ # Do all the stuff from other tests
107
+ @connection.add_column :commenteds, :rating, :integer, comment: 'I am running out of imagination'
108
+ @connection.change_column :commenteds, :content, :string, comment: 'Whoa, content describes itself!'
109
+ @connection.change_column :commenteds, :obvious, :string, comment: nil
110
+ @connection.add_index :commenteds, :obvious, name: 'idx_obvious', comment: 'We need to see obvious comments'
111
+
112
+ # And check that these changes are reflected in dump
113
+ output = dump_table_schema 'commenteds'
114
+ assert_match %r[create_table "commenteds",.+\s+comment: "A table with comment"], output
115
+ assert_match %r[t\.string\s+"name",\s+comment: "Comment should help clarify the column purpose"], output
116
+ assert_match %r[t\.string\s+"obvious"\n], output
117
+ assert_match %r[t\.string\s+"content",\s+comment: "Whoa, content describes itself!"], output
118
+ assert_match %r[t\.integer\s+"rating",\s+comment: "I am running out of imagination"], output
119
+ unless current_adapter?(:OracleAdapter)
120
+ assert_match %r[t\.index\s+.+\s+comment: "\\\"Very important\\\" index that powers all the performance.\\nAnd it's fun!"], output
121
+ assert_match %r[t\.index\s+.+\s+name: "idx_obvious",.+\s+comment: "We need to see obvious comments"], output
122
+ end
123
+ end
124
+
125
+ def test_schema_dump_omits_blank_comments
126
+ output = dump_table_schema 'blank_comments'
127
+
128
+ assert_match %r[create_table "blank_comments"], output
129
+ assert_no_match %r[create_table "blank_comments",.+comment:], output
130
+
131
+ assert_match %r[t\.string\s+"space_comment"\n], output
132
+ assert_no_match %r[t\.string\s+"space_comment", comment:\n], output
133
+
134
+ assert_match %r[t\.string\s+"empty_comment"\n], output
135
+ assert_no_match %r[t\.string\s+"empty_comment", comment:\n], output
136
+
137
+ assert_match %r[t\.string\s+"nil_comment"\n], output
138
+ assert_no_match %r[t\.string\s+"nil_comment", comment:\n], output
139
+
140
+ assert_match %r[t\.string\s+"absent_comment"\n], output
141
+ assert_no_match %r[t\.string\s+"absent_comment", comment:\n], output
142
+ end
143
+ end
144
+
145
+ end
@@ -6,7 +6,7 @@ module ActiveRecord
6
6
  class Pool < ConnectionPool
7
7
  def insert_connection_for_test!(c)
8
8
  synchronize do
9
- @connections << c
9
+ adopt_connection(c)
10
10
  @available.add c
11
11
  end
12
12
  end
@@ -24,7 +24,9 @@ module ActiveRecord
24
24
 
25
25
  def test_lease_twice
26
26
  assert @adapter.lease, 'should lease adapter'
27
- assert_not @adapter.lease, 'should not lease adapter'
27
+ assert_raises(ActiveRecordError) do
28
+ @adapter.lease
29
+ end
28
30
  end
29
31
 
30
32
  def test_expire_mutates_in_use
@@ -35,7 +37,7 @@ module ActiveRecord
35
37
  end
36
38
 
37
39
  def test_close
38
- pool = Pool.new(ConnectionSpecification.new({}, nil))
40
+ pool = Pool.new(ConnectionSpecification.new("primary", {}, nil))
39
41
  pool.insert_connection_for_test! @adapter
40
42
  @adapter.pool = pool
41
43
 
@@ -4,48 +4,155 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  class ConnectionHandlerTest < ActiveRecord::TestCase
6
6
  def setup
7
- @klass = Class.new(Base) { def self.name; 'klass'; end }
8
- @subklass = Class.new(@klass) { def self.name; 'subklass'; end }
9
-
10
7
  @handler = ConnectionHandler.new
11
- @pool = @handler.establish_connection(@klass, Base.connection_pool.spec)
8
+ resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new Base.configurations
9
+ @spec_name = "primary"
10
+ @pool = @handler.establish_connection(resolver.spec(:arunit, @spec_name))
11
+ end
12
+
13
+ def test_establish_connection_uses_spec_name
14
+ config = {"readonly" => {"adapter" => 'sqlite3'}}
15
+ resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new(config)
16
+ spec = resolver.spec(:readonly)
17
+ @handler.establish_connection(spec)
18
+
19
+ assert_not_nil @handler.retrieve_connection_pool('readonly')
20
+ ensure
21
+ @handler.remove_connection('readonly')
12
22
  end
13
23
 
14
24
  def test_retrieve_connection
15
- assert @handler.retrieve_connection(@klass)
25
+ assert @handler.retrieve_connection(@spec_name)
16
26
  end
17
27
 
18
28
  def test_active_connections?
19
29
  assert !@handler.active_connections?
20
- assert @handler.retrieve_connection(@klass)
30
+ assert @handler.retrieve_connection(@spec_name)
21
31
  assert @handler.active_connections?
22
32
  @handler.clear_active_connections!
23
33
  assert !@handler.active_connections?
24
34
  end
25
35
 
26
- def test_retrieve_connection_pool_with_ar_base
27
- assert_nil @handler.retrieve_connection_pool(ActiveRecord::Base)
36
+ def test_retrieve_connection_pool
37
+ assert_not_nil @handler.retrieve_connection_pool(@spec_name)
28
38
  end
29
39
 
30
- def test_retrieve_connection_pool
31
- assert_not_nil @handler.retrieve_connection_pool(@klass)
40
+ def test_retrieve_connection_pool_with_invalid_id
41
+ assert_nil @handler.retrieve_connection_pool("foo")
32
42
  end
33
43
 
34
- def test_retrieve_connection_pool_uses_superclass_when_no_subclass_connection
35
- assert_not_nil @handler.retrieve_connection_pool(@subklass)
44
+ def test_connection_pools
45
+ assert_equal([@pool], @handler.connection_pools)
36
46
  end
37
47
 
38
- def test_retrieve_connection_pool_uses_superclass_pool_after_subclass_establish_and_remove
39
- sub_pool = @handler.establish_connection(@subklass, Base.connection_pool.spec)
40
- assert_same sub_pool, @handler.retrieve_connection_pool(@subklass)
48
+ if Process.respond_to?(:fork)
49
+ def test_connection_pool_per_pid
50
+ object_id = ActiveRecord::Base.connection.object_id
41
51
 
42
- @handler.remove_connection @subklass
43
- assert_same @pool, @handler.retrieve_connection_pool(@subklass)
44
- end
52
+ rd, wr = IO.pipe
53
+ rd.binmode
54
+ wr.binmode
45
55
 
46
- def test_connection_pools
47
- assert_deprecated do
48
- assert_equal({ Base.connection_pool.spec => @pool }, @handler.connection_pools)
56
+ pid = fork {
57
+ rd.close
58
+ wr.write Marshal.dump ActiveRecord::Base.connection.object_id
59
+ wr.close
60
+ exit!
61
+ }
62
+
63
+ wr.close
64
+
65
+ Process.waitpid pid
66
+ assert_not_equal object_id, Marshal.load(rd.read)
67
+ rd.close
68
+ end
69
+
70
+ def test_retrieve_connection_pool_copies_schema_cache_from_ancestor_pool
71
+ @pool.schema_cache = @pool.connection.schema_cache
72
+ @pool.schema_cache.add('posts')
73
+
74
+ rd, wr = IO.pipe
75
+ rd.binmode
76
+ wr.binmode
77
+
78
+ pid = fork {
79
+ rd.close
80
+ pool = @handler.retrieve_connection_pool(@spec_name)
81
+ wr.write Marshal.dump pool.schema_cache.size
82
+ wr.close
83
+ exit!
84
+ }
85
+
86
+ wr.close
87
+
88
+ Process.waitpid pid
89
+ assert_equal @pool.schema_cache.size, Marshal.load(rd.read)
90
+ rd.close
91
+ end
92
+
93
+ def test_pool_from_any_process_for_uses_most_recent_spec
94
+ skip unless current_adapter?(:SQLite3Adapter)
95
+
96
+ file = Tempfile.new "lol.sqlite3"
97
+
98
+ rd, wr = IO.pipe
99
+ rd.binmode
100
+ wr.binmode
101
+
102
+ pid = fork do
103
+ ActiveRecord::Base.configurations["arunit"]["database"] = file.path
104
+ ActiveRecord::Base.establish_connection(:arunit)
105
+
106
+ pid2 = fork do
107
+ wr.write ActiveRecord::Base.connection_config[:database]
108
+ wr.close
109
+ end
110
+
111
+ Process.waitpid pid2
112
+ end
113
+
114
+ Process.waitpid pid
115
+
116
+ wr.close
117
+
118
+ assert_equal file.path, rd.read
119
+
120
+ rd.close
121
+ ensure
122
+ if file
123
+ file.close
124
+ file.unlink
125
+ end
126
+ end
127
+
128
+ def test_a_class_using_custom_pool_and_switching_back_to_primary
129
+ klass2 = Class.new(Base) { def self.name; 'klass2'; end }
130
+
131
+ assert_equal klass2.connection.object_id, ActiveRecord::Base.connection.object_id
132
+
133
+ pool = klass2.establish_connection(ActiveRecord::Base.connection_pool.spec.config)
134
+ assert_equal klass2.connection.object_id, pool.connection.object_id
135
+ refute_equal klass2.connection.object_id, ActiveRecord::Base.connection.object_id
136
+
137
+ klass2.remove_connection
138
+
139
+ assert_equal klass2.connection.object_id, ActiveRecord::Base.connection.object_id
140
+ end
141
+
142
+ def test_connection_specification_name_should_fallback_to_parent
143
+ klassA = Class.new(Base)
144
+ klassB = Class.new(klassA)
145
+
146
+ assert_equal klassB.connection_specification_name, klassA.connection_specification_name
147
+ klassA.connection_specification_name = "readonly"
148
+ assert_equal "readonly", klassB.connection_specification_name
149
+ end
150
+
151
+ def test_remove_connection_should_not_remove_parent
152
+ klass2 = Class.new(Base) { def self.name; 'klass2'; end }
153
+ klass2.remove_connection
154
+ refute_nil ActiveRecord::Base.connection.object_id
155
+ assert_equal klass2.connection.object_id, ActiveRecord::Base.connection.object_id
49
156
  end
50
157
  end
51
158
  end