sequel 4.49.0 → 5.0.0
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 +4 -4
- data/CHANGELOG +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,31 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative "spec_helper"
|
2
|
+
require_relative '../../lib/sequel/connection_pool/sharded_threaded'
|
3
|
+
|
4
|
+
connection_pool_defaults = {:pool_timeout=>5, :max_connections=>4}
|
5
|
+
st_connection_pool_defaults = connection_pool_defaults.merge(:single_threaded=>true)
|
4
6
|
|
5
7
|
mock_db = lambda do |*a, &b|
|
6
8
|
db = Sequel.mock
|
7
|
-
|
9
|
+
db.define_singleton_method(:connect){|c| b.arity == 1 ? b.call(c) : b.call} if b
|
8
10
|
if b2 = a.shift
|
9
|
-
|
11
|
+
db.define_singleton_method(:disconnect_connection){|c| b2.arity == 1 ? b2.call(c) : b2.call}
|
10
12
|
end
|
11
13
|
# Work around JRuby Issue #3854
|
12
|
-
|
14
|
+
db.singleton_class.send(:public, :connect, :disconnect_connection)
|
13
15
|
db
|
14
16
|
end
|
15
17
|
|
16
18
|
describe "An empty ConnectionPool" do
|
17
19
|
before do
|
18
|
-
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call,
|
19
|
-
end
|
20
|
-
|
21
|
-
deprecated "should support :pool_class option with string" do
|
22
|
-
begin
|
23
|
-
c = Class.new(Sequel::ConnectionPool)
|
24
|
-
Sequel::ConnectionPool::CONNECTION_POOL__MAP[:foo] = c
|
25
|
-
Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo).must_be_instance_of c
|
26
|
-
ensure
|
27
|
-
Sequel::ConnectionPool::CONNECTION_POOL__MAP.delete(c)
|
28
|
-
end
|
20
|
+
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call, connection_pool_defaults)
|
29
21
|
end
|
30
22
|
|
31
23
|
it "should have no available connections" do
|
@@ -36,21 +28,20 @@ describe "An empty ConnectionPool" do
|
|
36
28
|
@cpool.allocated.must_equal({})
|
37
29
|
end
|
38
30
|
|
39
|
-
deprecated "should have a created_count of zero" do
|
40
|
-
@cpool.created_count.must_equal 0
|
41
|
-
end
|
42
|
-
|
43
31
|
it "should have a size of zero" do
|
44
32
|
@cpool.size.must_equal 0
|
45
33
|
end
|
34
|
+
|
35
|
+
it "should raise Error for bad pool class" do
|
36
|
+
proc{Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo)}.must_raise Sequel::Error
|
37
|
+
end
|
46
38
|
end
|
47
39
|
|
48
40
|
describe "ConnectionPool options" do
|
49
41
|
it "should support string option values" do
|
50
|
-
cpool = Sequel::ConnectionPool.get_pool(mock_db.call, {:max_connections=>'5', :pool_timeout=>'3'
|
42
|
+
cpool = Sequel::ConnectionPool.get_pool(mock_db.call, {:max_connections=>'5', :pool_timeout=>'3'})
|
51
43
|
cpool.max_size.must_equal 5
|
52
44
|
cpool.instance_variable_get(:@timeout).must_equal 3
|
53
|
-
cpool.instance_variable_get(:@sleep_time).must_equal 0.01 unless cpool.class::USE_WAITER
|
54
45
|
end
|
55
46
|
|
56
47
|
it "should raise an error unless size is positive" do
|
@@ -65,7 +56,7 @@ describe "A connection pool handling connections" do
|
|
65
56
|
before do
|
66
57
|
@max_size = 2
|
67
58
|
msp = proc{@max_size=3}
|
68
|
-
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection},
|
59
|
+
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, connection_pool_defaults.merge(:max_connections=>@max_size))
|
69
60
|
end
|
70
61
|
|
71
62
|
it "#hold should increment #size" do
|
@@ -97,19 +88,6 @@ describe "A connection pool handling connections" do
|
|
97
88
|
@cpool.hold {:block_return}.must_equal :block_return
|
98
89
|
end
|
99
90
|
|
100
|
-
if RUBY_VERSION < '1.9.0' and !defined?(RUBY_ENGINE)
|
101
|
-
it "#hold should remove dead threads from the pool if it reaches its max_size" do
|
102
|
-
Thread.new{@cpool.hold{Thread.current.exit!}}.join
|
103
|
-
@cpool.allocated.keys.map{|t| t.alive?}.must_equal [false]
|
104
|
-
|
105
|
-
Thread.new{@cpool.hold{Thread.current.exit!}}.join
|
106
|
-
@cpool.allocated.keys.map{|t| t.alive?}.must_equal [false, false]
|
107
|
-
|
108
|
-
Thread.new{@cpool.hold{}}.join
|
109
|
-
@cpool.allocated.must_equal({})
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
91
|
it "#make_new should not make more than max_size connections" do
|
114
92
|
q = Queue.new
|
115
93
|
50.times{Thread.new{@cpool.hold{q.pop}}}
|
@@ -139,13 +117,13 @@ end
|
|
139
117
|
|
140
118
|
describe "A connection pool handling connection errors" do
|
141
119
|
it "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
|
142
|
-
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt},
|
120
|
+
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt}, connection_pool_defaults)
|
143
121
|
proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
|
144
122
|
cpool.size.must_equal 0
|
145
123
|
end
|
146
124
|
|
147
125
|
it "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
|
148
|
-
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil},
|
126
|
+
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil}, connection_pool_defaults)
|
149
127
|
proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
|
150
128
|
cpool.size.must_equal 0
|
151
129
|
end
|
@@ -158,7 +136,7 @@ describe "ConnectionPool#hold" do
|
|
158
136
|
define_method(:initialize){value += 1}
|
159
137
|
define_method(:value){value}
|
160
138
|
end
|
161
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{c.new},
|
139
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{c.new}, connection_pool_defaults)
|
162
140
|
end
|
163
141
|
|
164
142
|
it "shoulda use the database's connect method to get new connections" do
|
@@ -186,7 +164,7 @@ describe "A connection pool with a max size of 1" do
|
|
186
164
|
before do
|
187
165
|
@invoked_count = 0
|
188
166
|
icp = proc{@invoked_count += 1}
|
189
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{icp.call; 'herro'.dup},
|
167
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{icp.call; 'herro'.dup}, connection_pool_defaults.merge(:max_connections=>1))
|
190
168
|
end
|
191
169
|
|
192
170
|
it "should let only one thread access the connection at any time" do
|
@@ -291,7 +269,7 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
291
269
|
end
|
292
270
|
|
293
271
|
it "should wait until a connection is available if all are checked out" do
|
294
|
-
pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1
|
272
|
+
pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1))
|
295
273
|
q, q1 = Queue.new, Queue.new
|
296
274
|
t = Thread.new do
|
297
275
|
pool.hold do |c|
|
@@ -312,14 +290,14 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
312
290
|
b = []
|
313
291
|
t = Thread.new do
|
314
292
|
pool.hold do |c1|
|
315
|
-
b << c1
|
293
|
+
@m.synchronize{b << c1}
|
316
294
|
q1.push nil
|
317
295
|
q.pop
|
318
296
|
end
|
319
297
|
end
|
320
298
|
pool.hold do |c1|
|
321
299
|
q1.pop
|
322
|
-
b << c1
|
300
|
+
@m.synchronize{b << c1}
|
323
301
|
q.push nil
|
324
302
|
end
|
325
303
|
t.join
|
@@ -353,7 +331,7 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
353
331
|
threads = []
|
354
332
|
q, q1, q2 = Queue.new, Queue.new, Queue.new
|
355
333
|
|
356
|
-
5.times{|i| threads << Thread.new{@pool.hold{|c| q.pop; cc[i] = c; q1.push nil; q2.pop}}; q.push nil; q1.pop}
|
334
|
+
5.times{|i| threads << Thread.new{@pool.hold{|c| q.pop; @m.synchronize{cc[i] = c}; q1.push nil; q2.pop}}; q.push nil; q1.pop}
|
357
335
|
threads.each {|t| t.must_be :alive?}
|
358
336
|
cc.size.must_equal 5
|
359
337
|
@invoked_count.must_equal 5
|
@@ -371,18 +349,93 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
371
349
|
@pool.available_connections.size.must_equal 5
|
372
350
|
@pool.allocated.must_be :empty?
|
373
351
|
end
|
352
|
+
|
353
|
+
it "should allow simultaneous connections without preconnecting" do
|
354
|
+
@pool.disconnect
|
355
|
+
b = @icpp
|
356
|
+
|
357
|
+
t = Time.now
|
358
|
+
cc = {}
|
359
|
+
threads = []
|
360
|
+
results = []
|
361
|
+
i = 0
|
362
|
+
q, q1, q2, q3, q4 = Queue.new, Queue.new, Queue.new, Queue.new, Queue.new
|
363
|
+
m = @m
|
364
|
+
@pool.db.define_singleton_method(:connect) do |server|
|
365
|
+
q1.pop
|
366
|
+
m.synchronize{q3.push(i += 1)}
|
367
|
+
q4.pop
|
368
|
+
b.call
|
369
|
+
end
|
370
|
+
5.times{|i| threads << Thread.new{@pool.hold{|c| m.synchronize{i -= 1; cc[i] = c}; q2.pop; q.push nil}}}
|
371
|
+
5.times{|i| q1.push nil}
|
372
|
+
5.times{|i| results << q3.pop}
|
373
|
+
5.times{|i| q4.push nil}
|
374
|
+
5.times{|i| q2.push nil}
|
375
|
+
5.times{|i| q.pop}
|
376
|
+
results.sort.must_equal (1..5).to_a
|
377
|
+
threads.each(&:join)
|
378
|
+
(Time.now - t).must_be :<, 0.75
|
379
|
+
|
380
|
+
threads.each{|t| t.wont_be :alive?}
|
381
|
+
cc.size.must_equal 5
|
382
|
+
@invoked_count.must_equal 5
|
383
|
+
@pool.size.must_equal 5
|
384
|
+
@pool.available_connections.sort.must_equal (1..5).to_a
|
385
|
+
end
|
374
386
|
|
375
387
|
it "should block threads until a connection becomes available" do
|
376
388
|
cc = {}
|
377
389
|
threads = []
|
378
390
|
q, q1 = Queue.new, Queue.new
|
379
391
|
|
380
|
-
5.times{|i| threads << Thread.new{@pool.hold{|c| cc[i] = c; q1.push nil; q.pop}}}
|
392
|
+
5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop}}}
|
393
|
+
5.times{q1.pop}
|
394
|
+
threads.each {|t| t.must_be :alive?}
|
395
|
+
@pool.available_connections.must_be :empty?
|
396
|
+
|
397
|
+
3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil}}}
|
398
|
+
|
399
|
+
threads[5].must_be :alive?
|
400
|
+
threads[6].must_be :alive?
|
401
|
+
threads[7].must_be :alive?
|
402
|
+
cc.size.must_equal 5
|
403
|
+
cc[5].must_be_nil
|
404
|
+
cc[6].must_be_nil
|
405
|
+
cc[7].must_be_nil
|
406
|
+
|
407
|
+
5.times{q.push nil}
|
408
|
+
5.times{|i| threads[i].join}
|
409
|
+
3.times{q1.pop}
|
410
|
+
3.times{|i| threads[i+5].join}
|
411
|
+
|
412
|
+
threads.each {|t| t.wont_be :alive?}
|
413
|
+
cc.values.uniq.length.must_equal 5
|
414
|
+
|
415
|
+
@pool.size.must_equal 5
|
416
|
+
@invoked_count.must_equal 5
|
417
|
+
@pool.available_connections.size.must_equal 5
|
418
|
+
@pool.allocated.must_be :empty?
|
419
|
+
end
|
420
|
+
|
421
|
+
it "should block threads until a connection becomes available, when assign connection returns nil" do
|
422
|
+
# Shorten pool timeout, as making assign_connection return nil when there are
|
423
|
+
# connections in the pool can make the pool later block until the timeout expires,
|
424
|
+
# since then the pool will not be signalled correctly.
|
425
|
+
# This spec is only added for coverage purposes, to ensure that fallback code is tested.
|
426
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:pool_timeout=>0.25))
|
427
|
+
|
428
|
+
cc = {}
|
429
|
+
threads = []
|
430
|
+
q, q1 = Queue.new, Queue.new
|
431
|
+
|
432
|
+
5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop}}}
|
381
433
|
5.times{q1.pop}
|
382
434
|
threads.each {|t| t.must_be :alive?}
|
383
435
|
@pool.available_connections.must_be :empty?
|
384
436
|
|
385
|
-
|
437
|
+
def @pool.assign_connection(*) nil end
|
438
|
+
3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil}}}
|
386
439
|
|
387
440
|
threads[5].must_be :alive?
|
388
441
|
threads[6].must_be :alive?
|
@@ -398,6 +451,7 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
398
451
|
3.times{|i| threads[i+5].join}
|
399
452
|
|
400
453
|
threads.each {|t| t.wont_be :alive?}
|
454
|
+
cc.values.uniq.length.must_equal 5
|
401
455
|
|
402
456
|
@pool.size.must_equal 5
|
403
457
|
@invoked_count.must_equal 5
|
@@ -405,6 +459,48 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
405
459
|
@pool.allocated.must_be :empty?
|
406
460
|
end
|
407
461
|
|
462
|
+
it "should block threads until a connection becomes available, and reconnect on disconnection" do
|
463
|
+
cc = {}
|
464
|
+
threads = []
|
465
|
+
exceptions = []
|
466
|
+
q, q1, q2, q3 = Queue.new, Queue.new, Queue.new, Queue.new
|
467
|
+
b = @icpp
|
468
|
+
@pool.db.define_singleton_method(:connect) do |server|
|
469
|
+
b.call
|
470
|
+
Object.new
|
471
|
+
end
|
472
|
+
5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop; raise Sequel::DatabaseDisconnectError} rescue q2.push($!)}}
|
473
|
+
5.times{q1.pop}
|
474
|
+
threads.each {|t| t.must_be :alive?}
|
475
|
+
@pool.available_connections.must_be :empty?
|
476
|
+
|
477
|
+
3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil; q3.pop}}}
|
478
|
+
|
479
|
+
threads[5].must_be :alive?
|
480
|
+
threads[6].must_be :alive?
|
481
|
+
threads[7].must_be :alive?
|
482
|
+
cc.size.must_equal 5
|
483
|
+
cc[5].must_be_nil
|
484
|
+
cc[6].must_be_nil
|
485
|
+
cc[7].must_be_nil
|
486
|
+
|
487
|
+
5.times{q.push nil}
|
488
|
+
5.times{|i| threads[i].join}
|
489
|
+
5.times{exceptions << q2.pop}
|
490
|
+
3.times{q1.pop}
|
491
|
+
3.times{q3.push nil}
|
492
|
+
3.times{|i| threads[i+5].join}
|
493
|
+
|
494
|
+
threads.each {|t| t.wont_be :alive?}
|
495
|
+
exceptions.length.must_equal 5
|
496
|
+
cc.values.uniq.length.must_equal 8
|
497
|
+
|
498
|
+
@pool.size.must_equal 3
|
499
|
+
@invoked_count.must_equal 8
|
500
|
+
@pool.available_connections.size.must_equal 3
|
501
|
+
@pool.allocated.must_be :empty?
|
502
|
+
end
|
503
|
+
|
408
504
|
it "should store connections in a stack if :connection_handling=>:stack" do
|
409
505
|
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:stack))
|
410
506
|
c2 = nil
|
@@ -434,7 +530,8 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
434
530
|
it "should not store connections if :connection_handling=>:disconnect" do
|
435
531
|
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:disconnect))
|
436
532
|
d = []
|
437
|
-
|
533
|
+
m = @m
|
534
|
+
@pool.db.define_singleton_method(:disconnect_connection){|c| m.synchronize{d << c}}
|
438
535
|
@pool.hold do |cc|
|
439
536
|
cc.must_equal 1
|
440
537
|
Thread.new{@pool.hold{|cc2| _(cc2).must_equal 2}}.join
|
@@ -456,9 +553,10 @@ end
|
|
456
553
|
|
457
554
|
describe "Threaded Unsharded Connection Pool" do
|
458
555
|
before do
|
556
|
+
@m = Mutex.new
|
459
557
|
@invoked_count = 0
|
460
|
-
@icpp = proc{@invoked_count += 1}
|
461
|
-
@cp_opts =
|
558
|
+
@icpp = proc{@m.synchronize{@invoked_count += 1}}
|
559
|
+
@cp_opts = connection_pool_defaults.merge(:max_connections=>5)
|
462
560
|
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
|
463
561
|
end
|
464
562
|
|
@@ -467,9 +565,10 @@ end
|
|
467
565
|
|
468
566
|
describe "Threaded Sharded Connection Pool" do
|
469
567
|
before do
|
568
|
+
@m = Mutex.new
|
470
569
|
@invoked_count = 0
|
471
|
-
@icpp = proc{@invoked_count += 1}
|
472
|
-
@cp_opts =
|
570
|
+
@icpp = proc{@m.synchronize{@invoked_count += 1}}
|
571
|
+
@cp_opts = connection_pool_defaults.merge(:max_connections=>5, :servers=>{})
|
473
572
|
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
|
474
573
|
end
|
475
574
|
|
@@ -480,7 +579,7 @@ describe "ConnectionPool#disconnect" do
|
|
480
579
|
before do
|
481
580
|
@count = 0
|
482
581
|
cp = proc{@count += 1}
|
483
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{{:id => cp.call}},
|
582
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{{:id => cp.call}}, connection_pool_defaults.merge(:max_connections=>5, :servers=>{}))
|
484
583
|
threads = []
|
485
584
|
q, q1 = Queue.new, Queue.new
|
486
585
|
5.times {|i| threads << Thread.new {@pool.hold {|c| q1.push nil; q.pop}}}
|
@@ -494,7 +593,7 @@ describe "ConnectionPool#disconnect" do
|
|
494
593
|
@pool.available_connections.size.must_equal 5
|
495
594
|
@pool.available_connections.each {|c| c[:id].wont_equal nil}
|
496
595
|
conns = []
|
497
|
-
|
596
|
+
@pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
|
498
597
|
@pool.disconnect
|
499
598
|
conns.size.must_equal 5
|
500
599
|
end
|
@@ -511,7 +610,7 @@ describe "ConnectionPool#disconnect" do
|
|
511
610
|
@pool.available_connections.size.must_equal 4
|
512
611
|
@pool.available_connections.each {|c| c.wont_be_same_as(conn)}
|
513
612
|
conns = []
|
514
|
-
|
613
|
+
@pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
|
515
614
|
@pool.disconnect
|
516
615
|
conns.size.must_equal 4
|
517
616
|
@pool.size.must_equal 1
|
@@ -523,7 +622,7 @@ end
|
|
523
622
|
describe "A connection pool with multiple servers" do
|
524
623
|
before do
|
525
624
|
ic = @invoked_counts = Hash.new(0)
|
526
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"},
|
625
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, connection_pool_defaults.merge(:servers=>{:read_only=>{}}))
|
527
626
|
end
|
528
627
|
|
529
628
|
it "should support preconnect method that immediately creates the maximum number of connections" do
|
@@ -579,7 +678,7 @@ describe "A connection pool with multiple servers" do
|
|
579
678
|
|
580
679
|
it "should support a :servers_hash option used for converting the server argument" do
|
581
680
|
ic = @invoked_counts
|
582
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"},
|
681
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, connection_pool_defaults.merge(:servers_hash=>Hash.new(:read_only), :servers=>{:read_only=>{}}))
|
583
682
|
@pool.hold(:blah) do |c1|
|
584
683
|
c1.must_equal "read_only1"
|
585
684
|
@pool.hold(:blah) do |c2|
|
@@ -590,7 +689,7 @@ describe "A connection pool with multiple servers" do
|
|
590
689
|
end
|
591
690
|
end
|
592
691
|
|
593
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"},
|
692
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, connection_pool_defaults.merge(:servers_hash=>Hash.new{|h,k| raise Sequel::Error}, :servers=>{:read_only=>{}}))
|
594
693
|
proc{@pool.hold(:blah){|c1|}}.must_raise(Sequel::Error)
|
595
694
|
end
|
596
695
|
|
@@ -627,7 +726,7 @@ describe "A connection pool with multiple servers" do
|
|
627
726
|
conns = []
|
628
727
|
@pool.size.must_equal 1
|
629
728
|
@pool.size(:read_only).must_equal 1
|
630
|
-
|
729
|
+
@pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
|
631
730
|
@pool.disconnect
|
632
731
|
conns.sort.must_equal %w'default1 read_only1'
|
633
732
|
@pool.size.must_equal 0
|
@@ -776,11 +875,9 @@ describe "A connection pool with multiple servers" do
|
|
776
875
|
end
|
777
876
|
end
|
778
877
|
|
779
|
-
ST_CONNECTION_POOL_DEFAULTS = CONNECTION_POOL_DEFAULTS.merge(:single_threaded=>true)
|
780
|
-
|
781
878
|
describe "SingleConnectionPool" do
|
782
879
|
before do
|
783
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{1234},
|
880
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call{1234}, st_connection_pool_defaults)
|
784
881
|
end
|
785
882
|
|
786
883
|
it "should provide a #hold method" do
|
@@ -792,7 +889,7 @@ describe "SingleConnectionPool" do
|
|
792
889
|
it "should provide a #disconnect method" do
|
793
890
|
conn = nil
|
794
891
|
x = nil
|
795
|
-
pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| conn = c; c.must_be_kind_of(Integer)}){1234},
|
892
|
+
pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| conn = c; c.must_be_kind_of(Integer)}){1234}, st_connection_pool_defaults)
|
796
893
|
pool.hold{|c| x = c}
|
797
894
|
x.must_equal 1234
|
798
895
|
pool.disconnect
|
@@ -805,7 +902,7 @@ describe "A single threaded pool with multiple servers" do
|
|
805
902
|
before do
|
806
903
|
@max_size=2
|
807
904
|
msp = proc{@max_size += 1}
|
808
|
-
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){|c| c},
|
905
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){|c| c}, st_connection_pool_defaults.merge(:servers=>{:read_only=>{}}))
|
809
906
|
end
|
810
907
|
|
811
908
|
it "should support preconnect method that immediately creates the maximum number of connections" do
|
@@ -1114,16 +1211,18 @@ AllConnectionPoolClassesSpecs = shared_description do
|
|
1114
1211
|
end
|
1115
1212
|
end
|
1116
1213
|
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1214
|
+
[true, false].each do |k|
|
1215
|
+
[true, false].each do |v|
|
1216
|
+
opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
|
1217
|
+
describe "Connection pool with #{opts.inspect}" do
|
1218
|
+
before(:all) do
|
1219
|
+
Sequel::ConnectionPool.send(:get_pool, mock_db.call, opts)
|
1220
|
+
end
|
1221
|
+
before do
|
1222
|
+
@class = Sequel::ConnectionPool.send(:connection_pool_class, opts)
|
1223
|
+
end
|
1126
1224
|
|
1127
|
-
|
1225
|
+
include AllConnectionPoolClassesSpecs
|
1226
|
+
end
|
1128
1227
|
end
|
1129
1228
|
end
|