ibm_db 5.2.0-x86-mingw32 → 5.4.0-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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -0,0 +1,586 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/person"
5
+
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ class LegacyConnectionHandlersShardingDbTest < ActiveRecord::TestCase
9
+ self.use_transactional_tests = false
10
+
11
+ fixtures :people
12
+
13
+ def setup
14
+ @legacy_setting = ActiveRecord::Base.legacy_connection_handling
15
+ ActiveRecord::Base.legacy_connection_handling = true
16
+ ActiveRecord::Base.connection_handlers = { writing: ActiveRecord::Base.default_connection_handler }
17
+
18
+ @handlers = { writing: ConnectionHandler.new, reading: ConnectionHandler.new }
19
+ @rw_handler = @handlers[:writing]
20
+ @ro_handler = @handlers[:reading]
21
+ @owner_name = "ActiveRecord::Base"
22
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
23
+
24
+ @rw_pool = @handlers[:writing].establish_connection(db_config)
25
+ @ro_pool = @handlers[:reading].establish_connection(db_config)
26
+ end
27
+
28
+ def teardown
29
+ clean_up_legacy_connection_handlers
30
+ ActiveRecord::Base.legacy_connection_handling = @legacy_setting
31
+ end
32
+
33
+ unless in_memory_db?
34
+ def test_establishing_a_connection_in_connected_to_block_uses_current_role_and_shard
35
+ ActiveRecord::Base.connected_to(role: :writing, shard: :shard_one) do
36
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
37
+ SecondaryBase.establish_connection(db_config)
38
+
39
+ assert_equal [:shard_one], ActiveRecord::Base.connection_handlers[:writing].send(:owner_to_pool_manager).fetch("ActiveRecord::ConnectionAdapters::LegacyConnectionHandlersShardingDbTest::SecondaryBase").instance_variable_get(:@name_to_pool_config).keys
40
+ end
41
+ end
42
+
43
+ def test_establish_connection_using_3_levels_config
44
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
45
+
46
+ config = {
47
+ "default_env" => {
48
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
49
+ "primary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3" },
50
+ }
51
+ }
52
+
53
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
54
+
55
+ ActiveRecord::Base.connects_to(shards: {
56
+ default: { writing: :primary },
57
+ shard_one: { writing: :primary_shard_one }
58
+ })
59
+
60
+ connection_handlers = ActiveRecord::Base.connection_handlers
61
+
62
+ base_pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base")
63
+ default_pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base", shard: :default)
64
+
65
+ assert_equal base_pool, default_pool
66
+ assert_equal "test/db/primary.sqlite3", default_pool.db_config.database
67
+ assert_equal "primary", default_pool.db_config.name
68
+
69
+ assert_not_nil pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base", shard: :shard_one)
70
+ assert_equal "test/db/primary_shard_one.sqlite3", pool.db_config.database
71
+ assert_equal "primary_shard_one", pool.db_config.name
72
+ ensure
73
+ ActiveRecord::Base.configurations = @prev_configs
74
+ ActiveRecord::Base.establish_connection(:arunit)
75
+ ENV["RAILS_ENV"] = previous_env
76
+ end
77
+
78
+ def test_establish_connection_using_3_levels_config_with_shards_and_replica
79
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
80
+
81
+ config = {
82
+ "default_env" => {
83
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
84
+ "primary_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3", "replica" => true },
85
+ "primary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3" },
86
+ "primary_shard_one_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3", "replica" => true }
87
+ }
88
+ }
89
+
90
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
91
+
92
+ ActiveRecord::Base.connects_to(shards: {
93
+ default: { writing: :primary, reading: :primary_replica },
94
+ shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
95
+ })
96
+
97
+ connection_handlers = ActiveRecord::Base.connection_handlers
98
+
99
+ default_writing_pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base", shard: :default)
100
+ base_writing_pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base")
101
+ assert_equal base_writing_pool, default_writing_pool
102
+ assert_equal "test/db/primary.sqlite3", default_writing_pool.db_config.database
103
+ assert_equal "primary", default_writing_pool.db_config.name
104
+
105
+ default_reading_pool = connection_handlers[:reading].retrieve_connection_pool("ActiveRecord::Base", shard: :default)
106
+ base_reading_pool = connection_handlers[:reading].retrieve_connection_pool("ActiveRecord::Base")
107
+ assert_equal base_reading_pool, default_reading_pool
108
+ assert_equal "test/db/primary.sqlite3", default_reading_pool.db_config.database
109
+ assert_equal "primary_replica", default_reading_pool.db_config.name
110
+
111
+ assert_not_nil pool = connection_handlers[:writing].retrieve_connection_pool("ActiveRecord::Base", shard: :shard_one)
112
+ assert_equal "test/db/primary_shard_one.sqlite3", pool.db_config.database
113
+ assert_equal "primary_shard_one", pool.db_config.name
114
+
115
+ assert_not_nil pool = connection_handlers[:reading].retrieve_connection_pool("ActiveRecord::Base", shard: :shard_one)
116
+ assert_equal "test/db/primary_shard_one.sqlite3", pool.db_config.database
117
+ assert_equal "primary_shard_one_replica", pool.db_config.name
118
+ ensure
119
+ ActiveRecord::Base.configurations = @prev_configs
120
+ ActiveRecord::Base.establish_connection(:arunit)
121
+ ENV["RAILS_ENV"] = previous_env
122
+ end
123
+
124
+ def test_switching_connections_via_handler
125
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
126
+
127
+ config = {
128
+ "default_env" => {
129
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
130
+ "primary_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3", "replica" => true },
131
+ "primary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3" },
132
+ "primary_shard_one_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3", "replica" => true }
133
+ }
134
+ }
135
+
136
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
137
+
138
+ ActiveRecord::Base.connects_to(shards: {
139
+ default: { writing: :primary, reading: :primary_replica },
140
+ shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
141
+ })
142
+
143
+ ActiveRecord::Base.connected_to(role: :reading, shard: :default) do
144
+ @ro_handler = ActiveRecord::Base.connection_handler
145
+ assert_equal ActiveRecord::Base.connection_handler, ActiveRecord::Base.connection_handlers[:reading]
146
+ assert_equal :reading, ActiveRecord::Base.current_role
147
+ assert ActiveRecord::Base.connected_to?(role: :reading, shard: :default)
148
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :default)
149
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :shard_one)
150
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :shard_one)
151
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
152
+ end
153
+
154
+ ActiveRecord::Base.connected_to(role: :writing, shard: :default) do
155
+ assert_equal ActiveRecord::Base.connection_handler, ActiveRecord::Base.connection_handlers[:writing]
156
+ assert_not_equal @ro_handler, ActiveRecord::Base.connection_handler
157
+ assert_equal :writing, ActiveRecord::Base.current_role
158
+ assert ActiveRecord::Base.connected_to?(role: :writing, shard: :default)
159
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :default)
160
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :shard_one)
161
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :shard_one)
162
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
163
+ end
164
+
165
+ ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
166
+ @ro_handler = ActiveRecord::Base.connection_handler
167
+ assert_equal ActiveRecord::Base.connection_handler, ActiveRecord::Base.connection_handlers[:reading]
168
+ assert_equal :reading, ActiveRecord::Base.current_role
169
+ assert ActiveRecord::Base.connected_to?(role: :reading, shard: :shard_one)
170
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :shard_one)
171
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :default)
172
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :default)
173
+ assert_predicate ActiveRecord::Base.connection, :preventing_writes?
174
+ end
175
+
176
+ ActiveRecord::Base.connected_to(role: :writing, shard: :shard_one) do
177
+ assert_equal ActiveRecord::Base.connection_handler, ActiveRecord::Base.connection_handlers[:writing]
178
+ assert_not_equal @ro_handler, ActiveRecord::Base.connection_handler
179
+ assert_equal :writing, ActiveRecord::Base.current_role
180
+ assert ActiveRecord::Base.connected_to?(role: :writing, shard: :shard_one)
181
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :shard_one)
182
+ assert_not ActiveRecord::Base.connected_to?(role: :reading, shard: :default)
183
+ assert_not ActiveRecord::Base.connected_to?(role: :writing, shard: :default)
184
+ assert_not_predicate ActiveRecord::Base.connection, :preventing_writes?
185
+ end
186
+ ensure
187
+ ActiveRecord::Base.configurations = @prev_configs
188
+ ActiveRecord::Base.establish_connection(:arunit)
189
+ ENV["RAILS_ENV"] = previous_env
190
+ end
191
+
192
+ def test_retrieves_proper_connection_with_nested_connected_to
193
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
194
+
195
+ config = {
196
+ "default_env" => {
197
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
198
+ "primary_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3", "replica" => true },
199
+ "primary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3" },
200
+ "primary_shard_one_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3", "replica" => true }
201
+ }
202
+ }
203
+
204
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
205
+
206
+ ActiveRecord::Base.connects_to(shards: {
207
+ default: { writing: :primary, reading: :primary_replica },
208
+ shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
209
+ })
210
+
211
+ ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
212
+ # Uses the correct connection
213
+ assert_equal "primary_shard_one_replica", ActiveRecord::Base.connection_pool.db_config.name
214
+
215
+ # Uses the shard currently in use
216
+ ActiveRecord::Base.connected_to(role: :writing) do
217
+ assert_equal "primary_shard_one", ActiveRecord::Base.connection_pool.db_config.name
218
+ end
219
+
220
+ # Allows overriding the shard as well
221
+ ActiveRecord::Base.connected_to(role: :reading, shard: :default) do
222
+ assert_equal "primary_replica", ActiveRecord::Base.connection_pool.db_config.name
223
+ end
224
+
225
+ # Resets correctly
226
+ assert_equal "primary_shard_one_replica", ActiveRecord::Base.connection_pool.db_config.name
227
+ end
228
+ ensure
229
+ ActiveRecord::Base.configurations = @prev_configs
230
+ ActiveRecord::Base.establish_connection(:arunit)
231
+ ENV["RAILS_ENV"] = previous_env
232
+ end
233
+
234
+ def test_connected_to_raises_without_a_shard_or_role
235
+ error = assert_raises(ArgumentError) do
236
+ ActiveRecord::Base.connected_to { }
237
+ end
238
+ assert_equal "must provide a `shard` and/or `role`.", error.message
239
+ end
240
+
241
+ def test_connects_to_raises_with_a_shard_and_database_key
242
+ error = assert_raises(ArgumentError) do
243
+ ActiveRecord::Base.connects_to(database: { writing: :arunit }, shards: { shard_one: { writing: :arunit } })
244
+ end
245
+ assert_equal "`connects_to` can only accept a `database` or `shards` argument, but not both arguments.", error.message
246
+ end
247
+
248
+ def test_retrieve_connection_pool_with_invalid_shard
249
+ assert_not_nil @rw_handler.retrieve_connection_pool("ActiveRecord::Base")
250
+ assert_nil @rw_handler.retrieve_connection_pool("ActiveRecord::Base", shard: :foo)
251
+
252
+ assert_not_nil @ro_handler.retrieve_connection_pool("ActiveRecord::Base")
253
+ assert_nil @ro_handler.retrieve_connection_pool("ActiveRecord::Base", shard: :foo)
254
+ end
255
+
256
+ def test_calling_connected_to_on_a_non_existent_shard_raises
257
+ ActiveRecord::Base.connects_to(shards: {
258
+ default: { writing: :arunit, reading: :arunit }
259
+ })
260
+
261
+ error = assert_raises ActiveRecord::ConnectionNotEstablished do
262
+ ActiveRecord::Base.connected_to(role: :reading, shard: :foo) do
263
+ Person.first
264
+ end
265
+ end
266
+
267
+ assert_equal "No connection pool for 'ActiveRecord::Base' found for the 'foo' shard.", error.message
268
+ end
269
+
270
+ def test_retrieves_proper_connection_with_nested_connected_to_on_abstract_classes
271
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
272
+
273
+ config = {
274
+ "default_env" => {
275
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
276
+ "primary_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3", "replica" => true },
277
+ "primary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3" },
278
+ "primary_shard_one_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_one.sqlite3", "replica" => true },
279
+ "primary_shard_two" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_two.sqlite3" },
280
+ "primary_shard_two_replica" => { "adapter" => "sqlite3", "database" => "test/db/primary_shard_two.sqlite3", "replica" => true },
281
+ "secondary" => { "adapter" => "sqlite3", "database" => "test/db/secondary.sqlite3" },
282
+ "secondary_replica" => { "adapter" => "sqlite3", "database" => "test/db/secondary.sqlite3", "replica" => true },
283
+ "secondary_shard_one" => { "adapter" => "sqlite3", "database" => "test/db/secondary_shard_one.sqlite3" },
284
+ "secondary_shard_one_replica" => { "adapter" => "sqlite3", "database" => "test/db/secondary_shard_one.sqlite3", "replica" => true },
285
+ "secondary_shard_two" => { "adapter" => "sqlite3", "database" => "test/db/secondary_shard_two.sqlite3" },
286
+ "secondary_shard_two_replica" => { "adapter" => "sqlite3", "database" => "test/db/secondary_shard_two.sqlite3", "replica" => true }
287
+ }
288
+ }
289
+
290
+ @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config
291
+
292
+ ActiveRecord::Base.connects_to(shards: {
293
+ default: { writing: :primary, reading: :primary_replica },
294
+ shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
295
+ })
296
+
297
+ SecondaryBase.connects_to(shards: {
298
+ default: { writing: :secondary, reading: :secondary_replica },
299
+ shard_one: { writing: :secondary_shard_one, reading: :secondary_shard_one_replica },
300
+ shard_two: { writing: :secondary_shard_two, reading: :secondary_shard_two_replica }
301
+ })
302
+
303
+ assert_equal "primary", ActiveRecord::Base.connection_pool.db_config.name
304
+ assert_equal "secondary", SecondaryBase.connection_pool.db_config.name
305
+
306
+ ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
307
+ # ActiveRecord:Base is a global switch for passed values
308
+ assert_equal "primary_shard_one_replica", ActiveRecord::Base.connection_pool.db_config.name
309
+ assert_equal "secondary_shard_one_replica", SecondaryBase.connection_pool.db_config.name
310
+
311
+ ActiveRecord::Base.connected_to(role: :writing, shard: :default) do
312
+ assert_equal "primary", ActiveRecord::Base.connection_pool.db_config.name
313
+ assert_equal "secondary", SecondaryBase.connection_pool.db_config.name
314
+
315
+ ActiveRecord::Base.connected_to(role: :reading, shard: :shard_two) do
316
+ # ActiveRecord::Base has no shard_two
317
+ assert_equal "secondary_shard_two_replica", SecondaryBase.connection_pool.db_config.name
318
+ end
319
+
320
+ ActiveRecord::Base.connected_to(role: :writing) do
321
+ assert_equal "primary", ActiveRecord::Base.connection_pool.db_config.name
322
+ assert_equal "secondary", SecondaryBase.connection_pool.db_config.name
323
+ end
324
+ end
325
+ end
326
+
327
+ assert_equal "primary", ActiveRecord::Base.connection_pool.db_config.name
328
+ assert_equal "secondary", SecondaryBase.connection_pool.db_config.name
329
+ ensure
330
+ ActiveRecord::Base.configurations = @prev_configs
331
+ ActiveRecord::Base.establish_connection(:arunit)
332
+ ENV["RAILS_ENV"] = previous_env
333
+ end
334
+ end
335
+
336
+ class SecondaryBase < ActiveRecord::Base
337
+ self.abstract_class = true
338
+ end
339
+
340
+ class ShardConnectionTestModel < SecondaryBase
341
+ end
342
+
343
+ class SomeOtherBase < ActiveRecord::Base
344
+ self.abstract_class = true
345
+ end
346
+
347
+ class ShardConnectionTestModelB < SomeOtherBase
348
+ end
349
+
350
+ def test_same_shards_across_clusters
351
+ SecondaryBase.connects_to shards: { one: { writing: { database: ":memory:", adapter: "sqlite3" } } }
352
+ SomeOtherBase.connects_to shards: { one: { writing: { database: ":memory:", adapter: "sqlite3" } } }
353
+
354
+ ActiveRecord::Base.connected_to(role: :writing, shard: :one) do
355
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
356
+ ShardConnectionTestModel.create!(shard_key: "test_model_default")
357
+
358
+ ShardConnectionTestModelB.connection.execute("CREATE TABLE `shard_connection_test_model_bs` (shard_key VARCHAR (255))")
359
+ ShardConnectionTestModelB.create!(shard_key: "test_model_b_default")
360
+
361
+ assert_equal "test_model_default", ShardConnectionTestModel.where(shard_key: "test_model_default").first.shard_key
362
+ assert_equal "test_model_b_default", ShardConnectionTestModelB.where(shard_key: "test_model_b_default").first.shard_key
363
+ end
364
+ end
365
+
366
+ def test_sharding_separation
367
+ SecondaryBase.connects_to shards: {
368
+ default: { writing: { database: ":memory:", adapter: "sqlite3" } },
369
+ one: { writing: { database: ":memory:", adapter: "sqlite3" } }
370
+ }
371
+
372
+ [:default, :one].each do |shard_name|
373
+ ActiveRecord::Base.connected_to(role: :writing, shard: shard_name) do
374
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
375
+ end
376
+ end
377
+
378
+ ActiveRecord::Base.connected_to(role: :writing) do
379
+ # Create a record on :default
380
+ ShardConnectionTestModel.create!(shard_key: "foo")
381
+ end
382
+
383
+ # Make sure we can read it when explicitly connecting to :default
384
+ ActiveRecord::Base.connected_to(role: :writing, shard: :default) do
385
+ assert ShardConnectionTestModel.find_by_shard_key("foo")
386
+ end
387
+
388
+ # Switch to shard and make sure we can't read the record from :default
389
+ # Also add a new record on :one
390
+ ActiveRecord::Base.connected_to(role: :writing, shard: :one) do
391
+ assert_not ShardConnectionTestModel.find_by_shard_key("foo")
392
+ ShardConnectionTestModel.create!(shard_key: "bar")
393
+ end
394
+
395
+ # Make sure we can't read the record from :one but can read the record
396
+ # from :default
397
+ assert_not ShardConnectionTestModel.find_by_shard_key("bar")
398
+ assert ShardConnectionTestModel.find_by_shard_key("foo")
399
+ end
400
+
401
+ def test_swapping_shards_globally_in_a_multi_threaded_environment
402
+ tf_default = Tempfile.open "shard_key_default"
403
+ tf_shard_one = Tempfile.open "shard_key_one"
404
+
405
+ SecondaryBase.connects_to shards: {
406
+ default: { writing: { database: tf_default.path, adapter: "sqlite3" } },
407
+ one: { writing: { database: tf_shard_one.path, adapter: "sqlite3" } }
408
+ }
409
+
410
+ [:default, :one].each do |shard_name|
411
+ ActiveRecord::Base.connected_to(role: :writing, shard: shard_name) do
412
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
413
+ ShardConnectionTestModel.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}')")
414
+ end
415
+ end
416
+
417
+ shard_one_latch = Concurrent::CountDownLatch.new
418
+ shard_default_latch = Concurrent::CountDownLatch.new
419
+
420
+ ActiveRecord::Base.connected_to(role: :writing) do
421
+ ShardConnectionTestModel.connection
422
+ end
423
+
424
+ thread = Thread.new do
425
+ ActiveRecord::Base.connected_to(role: :writing) do
426
+ ShardConnectionTestModel.connection
427
+
428
+ shard_default_latch.wait
429
+ assert_equal "shard_key_default", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
430
+ shard_one_latch.count_down
431
+ end
432
+ end
433
+
434
+ ActiveRecord::Base.connected_to(role: :writing, shard: :one) do
435
+ shard_default_latch.count_down
436
+ assert_equal "shard_key_one", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
437
+ shard_one_latch.wait
438
+ end
439
+
440
+ thread.join
441
+ ensure
442
+ tf_shard_one.close
443
+ tf_shard_one.unlink
444
+ tf_default.close
445
+ tf_default.unlink
446
+ end
447
+
448
+ def test_swapping_shards_and_roles_in_a_multi_threaded_environment
449
+ tf_default = Tempfile.open "shard_key_default"
450
+ tf_shard_one = Tempfile.open "shard_key_one"
451
+ tf_default_reading = Tempfile.open "shard_key_default_reading"
452
+ tf_shard_one_reading = Tempfile.open "shard_key_one_reading"
453
+
454
+ SecondaryBase.connects_to shards: {
455
+ default: { writing: { database: tf_default.path, adapter: "sqlite3" }, secondary: { database: tf_default_reading.path, adapter: "sqlite3" } },
456
+ one: { writing: { database: tf_shard_one.path, adapter: "sqlite3" }, secondary: { database: tf_shard_one_reading.path, adapter: "sqlite3" } }
457
+ }
458
+
459
+ [:default, :one].each do |shard_name|
460
+ ActiveRecord::Base.connected_to(role: :writing, shard: shard_name) do
461
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
462
+ ShardConnectionTestModel.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}')")
463
+ end
464
+
465
+ ActiveRecord::Base.connected_to(role: :secondary, shard: shard_name) do
466
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
467
+ ShardConnectionTestModel.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}_secondary')")
468
+ end
469
+ end
470
+
471
+ shard_one_latch = Concurrent::CountDownLatch.new
472
+ shard_default_latch = Concurrent::CountDownLatch.new
473
+
474
+ ShardConnectionTestModel.connection
475
+
476
+ thread = Thread.new do
477
+ ShardConnectionTestModel.connection
478
+
479
+ shard_default_latch.wait
480
+ assert_equal "shard_key_default", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
481
+ shard_one_latch.count_down
482
+ end
483
+
484
+ ActiveRecord::Base.connected_to(shard: :one, role: :secondary) do
485
+ shard_default_latch.count_down
486
+ assert_equal "shard_key_one_secondary", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
487
+ shard_one_latch.wait
488
+ end
489
+
490
+ thread.join
491
+ ensure
492
+ tf_shard_one.close
493
+ tf_shard_one.unlink
494
+ tf_default.close
495
+ tf_default.unlink
496
+ tf_shard_one_reading.close
497
+ tf_shard_one_reading.unlink
498
+ tf_default_reading.close
499
+ tf_default_reading.unlink
500
+ end
501
+
502
+ def test_swapping_granular_shards_and_roles_in_a_multi_threaded_environment
503
+ tf_default = Tempfile.open "shard_key_default"
504
+ tf_shard_one = Tempfile.open "shard_key_one"
505
+ tf_default_reading = Tempfile.open "shard_key_default_reading"
506
+ tf_shard_one_reading = Tempfile.open "shard_key_one_reading"
507
+ tf_default2 = Tempfile.open "shard_key_default2"
508
+ tf_shard_one2 = Tempfile.open "shard_key_one2"
509
+ tf_default_reading2 = Tempfile.open "shard_key_default_reading2"
510
+ tf_shard_one_reading2 = Tempfile.open "shard_key_one_reading2"
511
+
512
+ SecondaryBase.connects_to shards: {
513
+ default: { writing: { database: tf_default.path, adapter: "sqlite3" }, secondary: { database: tf_default_reading.path, adapter: "sqlite3" } },
514
+ one: { writing: { database: tf_shard_one.path, adapter: "sqlite3" }, secondary: { database: tf_shard_one_reading.path, adapter: "sqlite3" } }
515
+ }
516
+
517
+ SomeOtherBase.connects_to shards: {
518
+ default: { writing: { database: tf_default2.path, adapter: "sqlite3" }, secondary: { database: tf_default_reading2.path, adapter: "sqlite3" } },
519
+ one: { writing: { database: tf_shard_one2.path, adapter: "sqlite3" }, secondary: { database: tf_shard_one_reading2.path, adapter: "sqlite3" } }
520
+ }
521
+
522
+ [:default, :one].each do |shard_name|
523
+ ActiveRecord::Base.connected_to(role: :writing, shard: shard_name) do
524
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
525
+ ShardConnectionTestModel.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}')")
526
+ ShardConnectionTestModelB.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
527
+ ShardConnectionTestModelB.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}_b')")
528
+ end
529
+
530
+ ActiveRecord::Base.connected_to(role: :secondary, shard: shard_name) do
531
+ ShardConnectionTestModel.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
532
+ ShardConnectionTestModel.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}_secondary')")
533
+ ShardConnectionTestModelB.connection.execute("CREATE TABLE `shard_connection_test_models` (shard_key VARCHAR (255))")
534
+ ShardConnectionTestModelB.connection.execute("INSERT INTO `shard_connection_test_models` VALUES ('shard_key_#{shard_name}_secondary_b')")
535
+ end
536
+ end
537
+
538
+ shard_one_latch = Concurrent::CountDownLatch.new
539
+ shard_default_latch = Concurrent::CountDownLatch.new
540
+
541
+ ShardConnectionTestModel.connection
542
+
543
+ thread = Thread.new do
544
+ ShardConnectionTestModel.connection
545
+
546
+ shard_default_latch.wait
547
+ assert_equal "shard_key_default", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
548
+ assert_equal "shard_key_default_b", ShardConnectionTestModelB.connection.select_value("SELECT shard_key from shard_connection_test_models")
549
+ shard_one_latch.count_down
550
+ end
551
+
552
+ ActiveRecord::Base.connected_to(shard: :one, role: :secondary) do
553
+ shard_default_latch.count_down
554
+
555
+ assert_equal "shard_key_one_secondary", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
556
+ assert_equal "shard_key_one_secondary_b", ShardConnectionTestModelB.connection.select_value("SELECT shard_key from shard_connection_test_models")
557
+
558
+ ActiveRecord::Base.connected_to(shard: :one, role: :secondary) do
559
+ assert_equal "shard_key_one_secondary", ShardConnectionTestModel.connection.select_value("SELECT shard_key from shard_connection_test_models")
560
+ assert_equal "shard_key_one_secondary_b", ShardConnectionTestModelB.connection.select_value("SELECT shard_key from shard_connection_test_models")
561
+ end
562
+
563
+ shard_one_latch.wait
564
+ end
565
+ thread.join
566
+ ensure
567
+ tf_shard_one.close
568
+ tf_shard_one.unlink
569
+ tf_default.close
570
+ tf_default.unlink
571
+ tf_shard_one_reading.close
572
+ tf_shard_one_reading.unlink
573
+ tf_default_reading.close
574
+ tf_default_reading.unlink
575
+ tf_shard_one2.close
576
+ tf_shard_one2.unlink
577
+ tf_default2.close
578
+ tf_default2.unlink
579
+ tf_shard_one_reading2.close
580
+ tf_shard_one_reading2.unlink
581
+ tf_default_reading2.close
582
+ tf_default_reading2.unlink
583
+ end
584
+ end
585
+ end
586
+ end