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.
- checksums.yaml +5 -5
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +6 -6
- data/README +38 -55
- data/ext/Makefile +269 -0
- data/ext/extconf.rb +34 -3
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db-i386-mingw32.def +2 -0
- data/ext/ibm_db.c +100 -108
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
- data/lib/mswin32/ibm_db.rb +7 -39
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
- data/test/cases/adapter_test.rb +133 -58
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +11 -1
- data/test/cases/ar_schema_test.rb +35 -50
- data/test/cases/associations/association_scope_test.rb +1 -6
- data/test/cases/associations/belongs_to_associations_test.rb +122 -10
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +5 -7
- data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
- data/test/cases/associations/eager_test.rb +158 -73
- data/test/cases/associations/extension_test.rb +7 -2
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
- data/test/cases/associations/has_many_associations_test.rb +362 -43
- data/test/cases/associations/has_many_through_associations_test.rb +108 -41
- data/test/cases/associations/has_one_associations_test.rb +105 -8
- data/test/cases/associations/has_one_through_associations_test.rb +6 -3
- data/test/cases/associations/inner_join_association_test.rb +3 -3
- data/test/cases/associations/inverse_associations_test.rb +38 -11
- data/test/cases/associations/join_model_test.rb +59 -36
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +2 -2
- data/test/cases/associations/required_test.rb +25 -5
- data/test/cases/associations_test.rb +39 -34
- data/test/cases/attribute_decorators_test.rb +9 -8
- data/test/cases/attribute_methods/read_test.rb +5 -5
- data/test/cases/attribute_methods_test.rb +97 -40
- data/test/cases/attribute_set_test.rb +64 -4
- data/test/cases/attribute_test.rb +84 -18
- data/test/cases/attributes_test.rb +151 -34
- data/test/cases/autosave_association_test.rb +149 -36
- data/test/cases/base_test.rb +290 -241
- data/test/cases/batches_test.rb +299 -22
- data/test/cases/binary_test.rb +2 -10
- data/test/cases/bind_parameter_test.rb +76 -66
- data/test/cases/cache_key_test.rb +26 -0
- data/test/cases/calculations_test.rb +167 -15
- data/test/cases/callbacks_test.rb +161 -68
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_definition_test.rb +26 -57
- data/test/cases/comment_test.rb +145 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
- data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
- data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
- data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
- data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
- data/test/cases/connection_management_test.rb +46 -56
- data/test/cases/connection_pool_test.rb +195 -20
- data/test/cases/connection_specification/resolver_test.rb +15 -0
- data/test/cases/counter_cache_test.rb +10 -5
- data/test/cases/custom_locking_test.rb +1 -1
- data/test/cases/database_statements_test.rb +18 -3
- data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
- data/test/cases/date_time_precision_test.rb +107 -0
- data/test/cases/defaults_test.rb +85 -89
- data/test/cases/dirty_test.rb +30 -52
- data/test/cases/disconnected_test.rb +4 -2
- data/test/cases/enum_test.rb +178 -24
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_test.rb +32 -21
- data/test/cases/finder_test.rb +273 -148
- data/test/cases/fixture_set/file_test.rb +18 -0
- data/test/cases/fixtures_test.rb +112 -32
- data/test/cases/forbidden_attributes_protection_test.rb +69 -3
- data/test/cases/helper.rb +10 -16
- data/test/cases/hot_compatibility_test.rb +89 -1
- data/test/cases/inheritance_test.rb +284 -53
- data/test/cases/integration_test.rb +23 -7
- data/test/cases/invalid_connection_test.rb +4 -2
- data/test/cases/invertible_migration_test.rb +124 -32
- data/test/cases/json_serialization_test.rb +11 -2
- data/test/cases/locking_test.rb +22 -6
- data/test/cases/log_subscriber_test.rb +106 -17
- data/test/cases/migration/change_schema_test.rb +60 -114
- data/test/cases/migration/change_table_test.rb +34 -2
- data/test/cases/migration/column_attributes_test.rb +7 -23
- data/test/cases/migration/column_positioning_test.rb +8 -8
- data/test/cases/migration/columns_test.rb +17 -11
- data/test/cases/migration/command_recorder_test.rb +47 -2
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +21 -12
- data/test/cases/migration/foreign_key_test.rb +52 -18
- data/test/cases/migration/index_test.rb +14 -12
- data/test/cases/migration/logger_test.rb +1 -1
- data/test/cases/migration/pending_migrations_test.rb +0 -1
- data/test/cases/migration/references_foreign_key_test.rb +59 -7
- data/test/cases/migration/references_index_test.rb +4 -4
- data/test/cases/migration/references_statements_test.rb +26 -6
- data/test/cases/migration/rename_table_test.rb +25 -25
- data/test/cases/migration_test.rb +279 -81
- data/test/cases/migrator_test.rb +91 -8
- data/test/cases/mixin_test.rb +0 -2
- data/test/cases/modules_test.rb +3 -4
- data/test/cases/multiparameter_attributes_test.rb +24 -2
- data/test/cases/multiple_db_test.rb +11 -4
- data/test/cases/nested_attributes_test.rb +61 -33
- data/test/cases/persistence_test.rb +102 -10
- data/test/cases/pooled_connections_test.rb +3 -3
- data/test/cases/primary_keys_test.rb +170 -31
- data/test/cases/query_cache_test.rb +216 -96
- data/test/cases/quoting_test.rb +65 -19
- data/test/cases/readonly_test.rb +2 -1
- data/test/cases/reflection_test.rb +68 -22
- data/test/cases/relation/delegation_test.rb +3 -8
- data/test/cases/relation/merging_test.rb +10 -14
- data/test/cases/relation/mutation_test.rb +42 -24
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +4 -2
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +23 -99
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +45 -23
- data/test/cases/relation_test.rb +67 -58
- data/test/cases/relations_test.rb +249 -38
- data/test/cases/result_test.rb +10 -0
- data/test/cases/sanitize_test.rb +108 -15
- data/test/cases/schema_dumper_test.rb +119 -125
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +113 -39
- data/test/cases/scoping/named_scoping_test.rb +46 -9
- data/test/cases/scoping/relation_scoping_test.rb +47 -4
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +93 -6
- data/test/cases/statement_cache_test.rb +38 -0
- data/test/cases/store_test.rb +2 -1
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +73 -9
- data/test/cases/tasks/mysql_rake_test.rb +139 -118
- data/test/cases/tasks/postgresql_rake_test.rb +60 -6
- data/test/cases/tasks/sqlite_rake_test.rb +30 -3
- data/test/cases/test_case.rb +28 -20
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +103 -0
- data/test/cases/timestamp_test.rb +44 -10
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +128 -62
- data/test/cases/transaction_isolation_test.rb +2 -2
- data/test/cases/transactions_test.rb +61 -43
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +2 -96
- data/test/cases/type/string_test.rb +0 -14
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +1 -118
- data/test/cases/unconnected_test.rb +1 -1
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +13 -2
- data/test/cases/validations/i18n_validation_test.rb +6 -10
- data/test/cases/validations/length_validation_test.rb +62 -30
- data/test/cases/validations/presence_validation_test.rb +36 -1
- data/test/cases/validations/uniqueness_validation_test.rb +128 -37
- data/test/cases/validations_repair_helper.rb +2 -6
- data/test/cases/validations_test.rb +36 -7
- data/test/cases/view_test.rb +102 -5
- data/test/cases/yaml_serialization_test.rb +21 -26
- data/test/config.example.yml +97 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/books.yml +20 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/price_estimates.yml +10 -1
- data/test/fixtures/trees.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +1 -1
- data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
- data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
- data/test/migrations/missing/1_people_have_last_names.rb +2 -2
- data/test/migrations/missing/3_we_need_reminders.rb +2 -2
- data/test/migrations/missing/4_innocent_jointable.rb +2 -2
- data/test/migrations/rename/1_we_need_things.rb +2 -2
- data/test/migrations/rename/2_rename_things.rb +2 -2
- data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy2/1_create_articles.rb +1 -1
- data/test/migrations/to_copy2/2_create_comments.rb +1 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
- data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/aircraft.rb +1 -0
- data/test/models/author.rb +4 -7
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +5 -0
- data/test/models/bulb.rb +2 -1
- data/test/models/car.rb +3 -0
- data/test/models/cat.rb +10 -0
- data/test/models/chef.rb +1 -0
- data/test/models/club.rb +2 -0
- data/test/models/comment.rb +17 -5
- data/test/models/company.rb +4 -2
- data/test/models/company_in_module.rb +1 -1
- data/test/models/contact.rb +1 -1
- data/test/models/content.rb +40 -0
- data/test/models/customer.rb +8 -2
- data/test/models/developer.rb +19 -0
- data/test/models/face.rb +1 -1
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/member.rb +1 -0
- data/test/models/member_detail.rb +4 -3
- data/test/models/mentor.rb +3 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +4 -1
- data/test/models/parrot.rb +6 -7
- data/test/models/person.rb +0 -1
- data/test/models/pet.rb +3 -0
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +3 -3
- data/test/models/post.rb +18 -9
- data/test/models/project.rb +9 -0
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/recipe.rb +3 -0
- data/test/models/ship.rb +8 -2
- data/test/models/tag.rb +6 -0
- data/test/models/topic.rb +2 -8
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/user.rb +14 -0
- data/test/models/uuid_item.rb +6 -0
- data/test/schema/mysql2_specific_schema.rb +33 -23
- data/test/schema/oracle_specific_schema.rb +1 -4
- data/test/schema/postgresql_specific_schema.rb +36 -124
- data/test/schema/schema.rb +170 -65
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +1 -5
- data/test/support/connection.rb +1 -0
- data/test/support/schema_dumping_helper.rb +1 -1
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- metadata +146 -30
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/mysql_specific_schema.rb +0 -70
@@ -14,9 +14,9 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_exceptional_middleware_clears_and_disables_cache_on_error
|
17
|
-
|
17
|
+
assert_cache :off
|
18
18
|
|
19
|
-
mw =
|
19
|
+
mw = middleware { |env|
|
20
20
|
Task.find 1
|
21
21
|
Task.find 1
|
22
22
|
assert_equal 1, ActiveRecord::Base.connection.query_cache.length
|
@@ -24,25 +24,98 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
24
24
|
}
|
25
25
|
assert_raises(RuntimeError) { mw.call({}) }
|
26
26
|
|
27
|
-
|
28
|
-
assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
|
27
|
+
assert_cache :off
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
32
|
-
ActiveRecord::Base.
|
30
|
+
private def with_temporary_connection_pool
|
31
|
+
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
|
32
|
+
new_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
33
|
+
ActiveRecord::Base.connection_handler.send(:owner_to_pool)["primary"] = new_pool
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
yield
|
36
|
+
ensure
|
37
|
+
ActiveRecord::Base.connection_handler.send(:owner_to_pool)["primary"] = old_pool
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
+
def test_query_cache_across_threads
|
41
|
+
with_temporary_connection_pool do
|
42
|
+
begin
|
43
|
+
if in_memory_db?
|
44
|
+
# Separate connections to an in-memory database create an entirely new database,
|
45
|
+
# with an empty schema etc, so we just stub out this schema on the fly.
|
46
|
+
ActiveRecord::Base.connection_pool.with_connection do |connection|
|
47
|
+
connection.create_table :tasks do |t|
|
48
|
+
t.datetime :starting
|
49
|
+
t.datetime :ending
|
50
|
+
end
|
51
|
+
end
|
52
|
+
ActiveRecord::FixtureSet.create_fixtures(self.class.fixture_path, ["tasks"], {}, ActiveRecord::Base)
|
53
|
+
end
|
54
|
+
|
55
|
+
ActiveRecord::Base.connection_pool.connections.each do |conn|
|
56
|
+
assert_cache :off, conn
|
57
|
+
end
|
58
|
+
|
59
|
+
assert !ActiveRecord::Base.connection.nil?
|
60
|
+
assert_cache :off
|
61
|
+
|
62
|
+
middleware {
|
63
|
+
assert_cache :clean
|
64
|
+
|
65
|
+
Task.find 1
|
66
|
+
assert_cache :dirty
|
67
|
+
|
68
|
+
thread_1_connection = ActiveRecord::Base.connection
|
69
|
+
ActiveRecord::Base.clear_active_connections!
|
70
|
+
assert_cache :off, thread_1_connection
|
71
|
+
|
72
|
+
started = Concurrent::Event.new
|
73
|
+
checked = Concurrent::Event.new
|
74
|
+
|
75
|
+
thread_2_connection = nil
|
76
|
+
thread = Thread.new {
|
77
|
+
thread_2_connection = ActiveRecord::Base.connection
|
78
|
+
|
79
|
+
assert_equal thread_2_connection, thread_1_connection
|
80
|
+
assert_cache :off
|
81
|
+
|
82
|
+
middleware {
|
83
|
+
assert_cache :clean
|
84
|
+
|
85
|
+
Task.find 1
|
86
|
+
assert_cache :dirty
|
87
|
+
|
88
|
+
started.set
|
89
|
+
checked.wait
|
90
|
+
|
91
|
+
ActiveRecord::Base.clear_active_connections!
|
92
|
+
}.call({})
|
93
|
+
}
|
94
|
+
|
95
|
+
started.wait
|
96
|
+
|
97
|
+
thread_1_connection = ActiveRecord::Base.connection
|
98
|
+
assert_not_equal thread_1_connection, thread_2_connection
|
99
|
+
assert_cache :dirty, thread_2_connection
|
100
|
+
checked.set
|
101
|
+
thread.join
|
102
|
+
|
103
|
+
assert_cache :off, thread_2_connection
|
104
|
+
}.call({})
|
105
|
+
|
106
|
+
ActiveRecord::Base.connection_pool.connections.each do |conn|
|
107
|
+
assert_cache :off, conn
|
108
|
+
end
|
109
|
+
ensure
|
110
|
+
ActiveRecord::Base.clear_all_connections!
|
111
|
+
end
|
112
|
+
end
|
40
113
|
end
|
41
114
|
|
42
115
|
def test_exceptional_middleware_assigns_original_connection_id_on_error
|
43
116
|
connection_id = ActiveRecord::Base.connection_id
|
44
117
|
|
45
|
-
mw =
|
118
|
+
mw = middleware { |env|
|
46
119
|
ActiveRecord::Base.connection_id = self.object_id
|
47
120
|
raise "lol borked"
|
48
121
|
}
|
@@ -53,7 +126,7 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
53
126
|
|
54
127
|
def test_middleware_delegates
|
55
128
|
called = false
|
56
|
-
mw =
|
129
|
+
mw = middleware { |env|
|
57
130
|
called = true
|
58
131
|
[200, {}, nil]
|
59
132
|
}
|
@@ -62,7 +135,7 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
62
135
|
end
|
63
136
|
|
64
137
|
def test_middleware_caches
|
65
|
-
mw =
|
138
|
+
mw = middleware { |env|
|
66
139
|
Task.find 1
|
67
140
|
Task.find 1
|
68
141
|
assert_equal 1, ActiveRecord::Base.connection.query_cache.length
|
@@ -72,52 +145,15 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
72
145
|
end
|
73
146
|
|
74
147
|
def test_cache_enabled_during_call
|
75
|
-
|
148
|
+
assert_cache :off
|
76
149
|
|
77
|
-
mw =
|
78
|
-
|
150
|
+
mw = middleware { |env|
|
151
|
+
assert_cache :clean
|
79
152
|
[200, {}, nil]
|
80
153
|
}
|
81
154
|
mw.call({})
|
82
155
|
end
|
83
156
|
|
84
|
-
def test_cache_on_during_body_write
|
85
|
-
streaming = Class.new do
|
86
|
-
def each
|
87
|
-
yield ActiveRecord::Base.connection.query_cache_enabled
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
mw = ActiveRecord::QueryCache.new lambda { |env|
|
92
|
-
[200, {}, streaming.new]
|
93
|
-
}
|
94
|
-
body = mw.call({}).last
|
95
|
-
body.each { |x| assert x, 'cache should be on' }
|
96
|
-
body.close
|
97
|
-
assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_cache_off_after_close
|
101
|
-
mw = ActiveRecord::QueryCache.new lambda { |env| [200, {}, nil] }
|
102
|
-
body = mw.call({}).last
|
103
|
-
|
104
|
-
assert ActiveRecord::Base.connection.query_cache_enabled, 'cache enabled'
|
105
|
-
body.close
|
106
|
-
assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_cache_clear_after_close
|
110
|
-
mw = ActiveRecord::QueryCache.new lambda { |env|
|
111
|
-
Post.first
|
112
|
-
[200, {}, nil]
|
113
|
-
}
|
114
|
-
body = mw.call({}).last
|
115
|
-
|
116
|
-
assert !ActiveRecord::Base.connection.query_cache.empty?, 'cache not empty'
|
117
|
-
body.close
|
118
|
-
assert ActiveRecord::Base.connection.query_cache.empty?, 'cache should be empty'
|
119
|
-
end
|
120
|
-
|
121
157
|
def test_cache_passing_a_relation
|
122
158
|
post = Post.first
|
123
159
|
Post.cache do
|
@@ -181,19 +217,14 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
181
217
|
|
182
218
|
def test_cache_does_not_wrap_string_results_in_arrays
|
183
219
|
Task.cache do
|
184
|
-
# Oracle adapter returns count() as
|
220
|
+
# Oracle adapter returns count() as Integer or Float
|
185
221
|
if current_adapter?(:OracleAdapter)
|
186
222
|
assert_kind_of Numeric, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
187
|
-
elsif current_adapter?(:SQLite3Adapter, :Mysql2Adapter)
|
223
|
+
elsif current_adapter?(:SQLite3Adapter, :Mysql2Adapter, :PostgreSQLAdapter)
|
188
224
|
# Future versions of the sqlite3 adapter will return numeric
|
189
|
-
assert_instance_of
|
190
|
-
|
191
|
-
|
192
|
-
if current_adapter?(:DB2Adapter)
|
193
|
-
assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
194
|
-
else
|
195
|
-
assert_instance_of Fixnum, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
196
|
-
end
|
225
|
+
assert_instance_of 0.class, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
226
|
+
else
|
227
|
+
assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
197
228
|
end
|
198
229
|
end
|
199
230
|
end
|
@@ -217,6 +248,26 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
217
248
|
ActiveRecord::Base.configurations = conf
|
218
249
|
end
|
219
250
|
|
251
|
+
def test_cache_is_available_when_using_a_not_connected_connection
|
252
|
+
skip "In-Memory DB can't test for using a not connected connection" if in_memory_db?
|
253
|
+
with_temporary_connection_pool do
|
254
|
+
spec_name = Task.connection_specification_name
|
255
|
+
resolver = ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new(ActiveRecord::Base.configurations)
|
256
|
+
ActiveRecord::Base.connection_handler.establish_connection(resolver.spec(:arunit, "test2"))
|
257
|
+
Task.connection_specification_name = "test2"
|
258
|
+
refute Task.connected?
|
259
|
+
|
260
|
+
Task.cache do
|
261
|
+
begin
|
262
|
+
assert_queries(1) { Task.find(1); Task.find(1) }
|
263
|
+
ensure
|
264
|
+
ActiveRecord::Base.connection_handler.remove_connection(Task.connection_specification_name)
|
265
|
+
Task.connection_specification_name = spec_name
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
220
271
|
def test_query_cache_doesnt_leak_cached_results_of_rolled_back_queries
|
221
272
|
ActiveRecord::Base.connection.enable_query_cache!
|
222
273
|
post = Post.first
|
@@ -248,6 +299,70 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|
248
299
|
assert_equal 0, Post.where(title: 'rollback').to_a.count
|
249
300
|
end
|
250
301
|
end
|
302
|
+
|
303
|
+
def test_query_cache_does_not_establish_connection_if_unconnected
|
304
|
+
with_temporary_connection_pool do
|
305
|
+
ActiveRecord::Base.clear_active_connections!
|
306
|
+
refute ActiveRecord::Base.connection_handler.active_connections? # sanity check
|
307
|
+
|
308
|
+
middleware {
|
309
|
+
refute ActiveRecord::Base.connection_handler.active_connections?, "QueryCache forced ActiveRecord::Base to establish a connection in setup"
|
310
|
+
}.call({})
|
311
|
+
|
312
|
+
refute ActiveRecord::Base.connection_handler.active_connections?, "QueryCache forced ActiveRecord::Base to establish a connection in cleanup"
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_query_cache_is_enabled_on_connections_established_after_middleware_runs
|
317
|
+
with_temporary_connection_pool do
|
318
|
+
ActiveRecord::Base.clear_active_connections!
|
319
|
+
refute ActiveRecord::Base.connection_handler.active_connections? # sanity check
|
320
|
+
|
321
|
+
middleware {
|
322
|
+
assert ActiveRecord::Base.connection.query_cache_enabled, "QueryCache did not get lazily enabled"
|
323
|
+
}.call({})
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_query_caching_is_local_to_the_current_thread
|
328
|
+
with_temporary_connection_pool do
|
329
|
+
ActiveRecord::Base.clear_active_connections!
|
330
|
+
|
331
|
+
middleware {
|
332
|
+
assert ActiveRecord::Base.connection_pool.query_cache_enabled
|
333
|
+
assert ActiveRecord::Base.connection.query_cache_enabled
|
334
|
+
|
335
|
+
Thread.new {
|
336
|
+
refute ActiveRecord::Base.connection_pool.query_cache_enabled
|
337
|
+
refute ActiveRecord::Base.connection.query_cache_enabled
|
338
|
+
}.join
|
339
|
+
}.call({})
|
340
|
+
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
private
|
345
|
+
def middleware(&app)
|
346
|
+
executor = Class.new(ActiveSupport::Executor)
|
347
|
+
ActiveRecord::QueryCache.install_executor_hooks executor
|
348
|
+
lambda { |env| executor.wrap { app.call(env) } }
|
349
|
+
end
|
350
|
+
|
351
|
+
def assert_cache(state, connection = ActiveRecord::Base.connection)
|
352
|
+
case state
|
353
|
+
when :off
|
354
|
+
assert !connection.query_cache_enabled, "cache should be off"
|
355
|
+
assert connection.query_cache.empty?, "cache should be empty"
|
356
|
+
when :clean
|
357
|
+
assert connection.query_cache_enabled, "cache should be on"
|
358
|
+
assert connection.query_cache.empty?, "cache should be empty"
|
359
|
+
when :dirty
|
360
|
+
assert connection.query_cache_enabled, "cache should be on"
|
361
|
+
assert !connection.query_cache.empty?, "cache should be dirty"
|
362
|
+
else
|
363
|
+
raise "unknown state"
|
364
|
+
end
|
365
|
+
end
|
251
366
|
end
|
252
367
|
|
253
368
|
class QueryCacheExpiryTest < ActiveRecord::TestCase
|
@@ -266,61 +381,66 @@ class QueryCacheExpiryTest < ActiveRecord::TestCase
|
|
266
381
|
end
|
267
382
|
|
268
383
|
def test_find
|
269
|
-
Task.connection
|
384
|
+
assert_called(Task.connection, :clear_query_cache) do
|
385
|
+
assert !Task.connection.query_cache_enabled
|
386
|
+
Task.cache do
|
387
|
+
assert Task.connection.query_cache_enabled
|
388
|
+
Task.find(1)
|
270
389
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
390
|
+
Task.uncached do
|
391
|
+
assert !Task.connection.query_cache_enabled
|
392
|
+
Task.find(1)
|
393
|
+
end
|
275
394
|
|
276
|
-
|
277
|
-
assert !Task.connection.query_cache_enabled
|
278
|
-
Task.find(1)
|
395
|
+
assert Task.connection.query_cache_enabled
|
279
396
|
end
|
280
|
-
|
281
|
-
assert Task.connection.query_cache_enabled
|
397
|
+
assert !Task.connection.query_cache_enabled
|
282
398
|
end
|
283
|
-
assert !Task.connection.query_cache_enabled
|
284
399
|
end
|
285
400
|
|
286
401
|
def test_update
|
287
|
-
Task.connection
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
402
|
+
assert_called(Task.connection, :clear_query_cache, times: 2) do
|
403
|
+
Task.cache do
|
404
|
+
task = Task.find(1)
|
405
|
+
task.starting = Time.now.utc
|
406
|
+
task.save!
|
407
|
+
end
|
292
408
|
end
|
293
409
|
end
|
294
410
|
|
295
411
|
def test_destroy
|
296
|
-
Task.connection
|
297
|
-
|
298
|
-
|
412
|
+
assert_called(Task.connection, :clear_query_cache, times: 2) do
|
413
|
+
Task.cache do
|
414
|
+
Task.find(1).destroy
|
415
|
+
end
|
299
416
|
end
|
300
417
|
end
|
301
418
|
|
302
419
|
def test_insert
|
303
|
-
ActiveRecord::Base.connection
|
304
|
-
|
305
|
-
|
420
|
+
assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
|
421
|
+
Task.cache do
|
422
|
+
Task.create!
|
423
|
+
end
|
306
424
|
end
|
307
425
|
end
|
308
426
|
|
309
427
|
def test_cache_is_expired_by_habtm_update
|
310
|
-
ActiveRecord::Base.connection
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
428
|
+
assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
|
429
|
+
ActiveRecord::Base.cache do
|
430
|
+
c = Category.first
|
431
|
+
p = Post.first
|
432
|
+
p.categories << c
|
433
|
+
end
|
315
434
|
end
|
316
435
|
end
|
317
436
|
|
318
437
|
def test_cache_is_expired_by_habtm_delete
|
319
|
-
ActiveRecord::Base.connection
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
438
|
+
assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do
|
439
|
+
ActiveRecord::Base.cache do
|
440
|
+
p = Post.find(1)
|
441
|
+
assert p.categories.any?
|
442
|
+
p.categories.delete_all
|
443
|
+
end
|
324
444
|
end
|
325
445
|
end
|
326
446
|
end
|
data/test/cases/quoting_test.rb
CHANGED
@@ -44,30 +44,63 @@ module ActiveRecord
|
|
44
44
|
assert_equal t.to_s(:db), @quoter.quoted_date(t)
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def test_quoted_timestamp_utc
|
48
48
|
with_timezone_config default: :utc do
|
49
|
-
t = Time.now
|
49
|
+
t = Time.now.change(usec: 0)
|
50
50
|
assert_equal t.getutc.to_s(:db), @quoter.quoted_date(t)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
54
|
+
def test_quoted_timestamp_local
|
55
55
|
with_timezone_config default: :local do
|
56
|
-
t = Time.now
|
56
|
+
t = Time.now.change(usec: 0)
|
57
57
|
assert_equal t.getlocal.to_s(:db), @quoter.quoted_date(t)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
def
|
61
|
+
def test_quoted_timestamp_crazy
|
62
62
|
with_timezone_config default: :asdfasdf do
|
63
|
-
t = Time.now
|
63
|
+
t = Time.now.change(usec: 0)
|
64
64
|
assert_equal t.getlocal.to_s(:db), @quoter.quoted_date(t)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
def test_quoted_time_utc
|
69
|
+
with_timezone_config default: :utc do
|
70
|
+
t = Time.now.change(usec: 0)
|
71
|
+
|
72
|
+
expected = t.getutc.change(year: 2000, month: 1, day: 1)
|
73
|
+
expected = expected.to_s(:db).sub("2000-01-01 ", "")
|
74
|
+
|
75
|
+
assert_equal expected, @quoter.quoted_time(t)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_quoted_time_local
|
80
|
+
with_timezone_config default: :local do
|
81
|
+
t = Time.now.change(usec: 0)
|
82
|
+
|
83
|
+
expected = t.change(year: 2000, month: 1, day: 1)
|
84
|
+
expected = expected.getlocal.to_s(:db).sub("2000-01-01 ", "")
|
85
|
+
|
86
|
+
assert_equal expected, @quoter.quoted_time(t)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_quoted_time_crazy
|
91
|
+
with_timezone_config default: :asdfasdf do
|
92
|
+
t = Time.now.change(usec: 0)
|
93
|
+
|
94
|
+
expected = t.change(year: 2000, month: 1, day: 1)
|
95
|
+
expected = expected.getlocal.to_s(:db).sub("2000-01-01 ", "")
|
96
|
+
|
97
|
+
assert_equal expected, @quoter.quoted_time(t)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
68
101
|
def test_quoted_datetime_utc
|
69
102
|
with_timezone_config default: :utc do
|
70
|
-
t =
|
103
|
+
t = Time.now.change(usec: 0).to_datetime
|
71
104
|
assert_equal t.getutc.to_s(:db), @quoter.quoted_date(t)
|
72
105
|
end
|
73
106
|
end
|
@@ -76,7 +109,7 @@ module ActiveRecord
|
|
76
109
|
# DateTime doesn't define getlocal, so make sure it does nothing
|
77
110
|
def test_quoted_datetime_local
|
78
111
|
with_timezone_config default: :local do
|
79
|
-
t =
|
112
|
+
t = Time.now.change(usec: 0).to_datetime
|
80
113
|
assert_equal t.to_s(:db), @quoter.quoted_date(t)
|
81
114
|
end
|
82
115
|
end
|
@@ -102,9 +135,9 @@ module ActiveRecord
|
|
102
135
|
assert_equal float.to_s, @quoter.quote(float, nil)
|
103
136
|
end
|
104
137
|
|
105
|
-
def
|
106
|
-
|
107
|
-
assert_equal
|
138
|
+
def test_quote_integer
|
139
|
+
integer = 1
|
140
|
+
assert_equal integer.to_s, @quoter.quote(integer, nil)
|
108
141
|
end
|
109
142
|
|
110
143
|
def test_quote_bignum
|
@@ -125,14 +158,11 @@ module ActiveRecord
|
|
125
158
|
end
|
126
159
|
|
127
160
|
def test_crazy_object
|
128
|
-
crazy =
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
def test_crazy_object_calls_quote_string
|
134
|
-
crazy = Class.new { def initialize; @lol = 'lo\l' end }.new
|
135
|
-
assert_match "lo\\\\l", @quoter.quote(crazy, nil)
|
161
|
+
crazy = Object.new
|
162
|
+
e = assert_raises(TypeError) do
|
163
|
+
@quoter.quote(crazy, nil)
|
164
|
+
end
|
165
|
+
assert_equal "can't quote Object", e.message
|
136
166
|
end
|
137
167
|
|
138
168
|
def test_quote_string_no_column
|
@@ -152,5 +182,21 @@ module ActiveRecord
|
|
152
182
|
assert_equal "1800", @quoter.quote(30.minutes)
|
153
183
|
end
|
154
184
|
end
|
185
|
+
|
186
|
+
class QuoteBooleanTest < ActiveRecord::TestCase
|
187
|
+
def setup
|
188
|
+
@connection = ActiveRecord::Base.connection
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_quote_returns_frozen_string
|
192
|
+
assert_predicate @connection.quote(true), :frozen?
|
193
|
+
assert_predicate @connection.quote(false), :frozen?
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_type_cast_returns_frozen_value
|
197
|
+
assert_predicate @connection.type_cast(true), :frozen?
|
198
|
+
assert_predicate @connection.type_cast(false), :frozen?
|
199
|
+
end
|
200
|
+
end
|
155
201
|
end
|
156
202
|
end
|