sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- 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/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -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/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- 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 +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- 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 +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- 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/jdbc.rb +18 -74
- 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/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/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- 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 +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -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 +4 -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/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/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- 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 +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -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 +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- 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 +27 -43
- 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_extended_date_support.rb +230 -0
- 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 +3 -16
- 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/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- 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/model.rb +27 -62
- 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 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- 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 +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- 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 +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -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 +88 -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 +30 -92
- 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 +53 -1118
- 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 +8 -30
- 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 +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -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 +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- 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_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- 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 +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- 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 +43 -32
- 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 +5 -17
- 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/synchronize_sql_spec.rb +124 -0
- 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 +5 -7
- 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 +12 -16
- 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 -13
- 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 +8 -13
- 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 +12 -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 +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -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 +43 -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 +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- 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/do.rb +0 -166
- 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/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/swift.rb +0 -169
- 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
|
@@ -3,12 +3,8 @@
|
|
|
3
3
|
# A connection pool allowing multi-threaded access to a pool of connections.
|
|
4
4
|
# This is the default connection pool used by Sequel.
|
|
5
5
|
class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
# timeout.
|
|
9
|
-
unless defined?(USE_WAITER)
|
|
10
|
-
USE_WAITER = RUBY_VERSION >= '1.9'
|
|
11
|
-
end
|
|
6
|
+
USE_WAITER = true
|
|
7
|
+
Sequel::Deprecation.deprecate_constant(self, :USE_WAITER)
|
|
12
8
|
|
|
13
9
|
# The maximum number of connections this pool will create (per shard/server
|
|
14
10
|
# if sharding).
|
|
@@ -22,15 +18,10 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
22
18
|
attr_reader :allocated
|
|
23
19
|
|
|
24
20
|
# The following additional options are respected:
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
# will open (default 4)
|
|
30
|
-
# * :pool_sleep_time - The amount of time to sleep before attempting to acquire
|
|
31
|
-
# a connection again, only used on ruby 1.8. (default 0.001)
|
|
32
|
-
# * :pool_timeout - The amount of seconds to wait to acquire a connection
|
|
33
|
-
# before raising a PoolTimeoutError (default 5)
|
|
21
|
+
# :max_connections :: The maximum number of connections the connection pool
|
|
22
|
+
# will open (default 4)
|
|
23
|
+
# :pool_timeout :: The amount of seconds to wait to acquire a connection
|
|
24
|
+
# before raising a PoolTimeoutError (default 5)
|
|
34
25
|
def initialize(db, opts = OPTS)
|
|
35
26
|
super
|
|
36
27
|
@max_size = Integer(opts[:max_connections] || 4)
|
|
@@ -40,14 +31,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
40
31
|
@available_connections = []
|
|
41
32
|
@allocated = {}
|
|
42
33
|
@timeout = Float(opts[:pool_timeout] || 5)
|
|
43
|
-
|
|
44
|
-
if USE_WAITER
|
|
45
|
-
@waiter = ConditionVariable.new
|
|
46
|
-
else
|
|
47
|
-
# :nocov:
|
|
48
|
-
@sleep_time = Float(opts[:pool_sleep_time] || 0.001)
|
|
49
|
-
# :nocov:
|
|
50
|
-
end
|
|
34
|
+
@waiter = ConditionVariable.new
|
|
51
35
|
end
|
|
52
36
|
|
|
53
37
|
# Yield all of the available connections, and the one currently allocated to
|
|
@@ -70,7 +54,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
70
54
|
# being used. If you want to be able to disconnect connections that are
|
|
71
55
|
# currently in use, use the ShardedThreadedConnectionPool, which can do that.
|
|
72
56
|
# This connection pool does not, for performance reasons. To use the sharded pool,
|
|
73
|
-
# pass the <tt
|
|
57
|
+
# pass the <tt>servers: {}</tt> option when connecting to the database.
|
|
74
58
|
#
|
|
75
59
|
# Once a connection is requested using #hold, the connection pool
|
|
76
60
|
# creates new connections to the database.
|
|
@@ -79,6 +63,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
79
63
|
sync do
|
|
80
64
|
conns = @available_connections.dup
|
|
81
65
|
@available_connections.clear
|
|
66
|
+
@waiter.signal
|
|
82
67
|
end
|
|
83
68
|
conns.each{|conn| disconnect_connection(conn)}
|
|
84
69
|
end
|
|
@@ -95,8 +80,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
95
80
|
# If no connection is immediately available and the pool is already using the maximum
|
|
96
81
|
# number of connections, Pool#hold will block until a connection
|
|
97
82
|
# is available or the timeout expires. If the timeout expires before a
|
|
98
|
-
# connection can be acquired, a Sequel::PoolTimeout is
|
|
99
|
-
# raised.
|
|
83
|
+
# connection can be acquired, a Sequel::PoolTimeout is raised.
|
|
100
84
|
def hold(server=nil)
|
|
101
85
|
t = Thread.current
|
|
102
86
|
if conn = owned_connection(t)
|
|
@@ -110,7 +94,10 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
110
94
|
oconn = conn
|
|
111
95
|
conn = nil
|
|
112
96
|
disconnect_connection(oconn) if oconn
|
|
113
|
-
|
|
97
|
+
sync do
|
|
98
|
+
@allocated.delete(t)
|
|
99
|
+
@waiter.signal
|
|
100
|
+
end
|
|
114
101
|
end
|
|
115
102
|
raise
|
|
116
103
|
ensure
|
|
@@ -123,111 +110,104 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
123
110
|
end
|
|
124
111
|
|
|
125
112
|
# The total number of connections opened, either available or allocated.
|
|
126
|
-
#
|
|
113
|
+
# The calling code should not have the mutex before calling this.
|
|
127
114
|
def size
|
|
128
|
-
@
|
|
115
|
+
@mutex.synchronize{_size}
|
|
129
116
|
end
|
|
130
117
|
|
|
131
118
|
private
|
|
132
119
|
|
|
120
|
+
# The total number of connections opened, either available or allocated.
|
|
121
|
+
# The calling code should already have the mutex before calling this.
|
|
122
|
+
def _size
|
|
123
|
+
@allocated.length + @available_connections.length
|
|
124
|
+
end
|
|
125
|
+
|
|
133
126
|
# Assigns a connection to the supplied thread, if one
|
|
134
|
-
# is available. The calling code should already have the mutex when
|
|
127
|
+
# is available. The calling code should NOT already have the mutex when
|
|
135
128
|
# calling this.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
129
|
+
#
|
|
130
|
+
# This should return a connection is one is available within the timeout,
|
|
131
|
+
# or nil if a connection could not be acquired within the timeout.
|
|
132
|
+
def acquire(thread)
|
|
133
|
+
if conn = assign_connection(thread)
|
|
134
|
+
return conn
|
|
139
135
|
end
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
136
|
+
|
|
137
|
+
time = Time.now
|
|
138
|
+
|
|
139
|
+
sync do
|
|
140
|
+
@waiter.wait(@mutex, @timeout)
|
|
141
|
+
if conn = next_available
|
|
142
|
+
return(@allocated[thread] = conn)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
until conn = assign_connection(thread)
|
|
147
|
+
deadline ||= time + @timeout
|
|
148
|
+
current_time = Time.now
|
|
149
|
+
raise_pool_timeout(current_time - time) if current_time > deadline
|
|
150
|
+
|
|
151
|
+
# :nocov:
|
|
152
|
+
# It's difficult to get to this point, it can only happen if there is a race condition
|
|
153
|
+
# where a connection cannot be acquired even after the thread is signalled by the condition
|
|
150
154
|
sync do
|
|
151
|
-
|
|
152
|
-
|
|
155
|
+
@waiter.wait(@mutex, deadline - current_time)
|
|
156
|
+
if conn = next_available
|
|
157
|
+
return(@allocated[thread] = conn)
|
|
153
158
|
end
|
|
159
|
+
end
|
|
160
|
+
# :nocov:
|
|
161
|
+
end
|
|
154
162
|
|
|
155
|
-
|
|
156
|
-
|
|
163
|
+
conn
|
|
164
|
+
end
|
|
157
165
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
Thread.pass
|
|
166
|
+
# Assign a connection to the thread, or return nil if one cannot be assigned.
|
|
167
|
+
# The caller should NOT have the mutex before calling this.
|
|
168
|
+
def assign_connection(thread)
|
|
169
|
+
allocated = @allocated
|
|
163
170
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
end
|
|
171
|
+
do_make_new = false
|
|
172
|
+
sync do
|
|
173
|
+
if conn = next_available
|
|
174
|
+
return(allocated[thread] = conn)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
if (n = _size) >= (max = @max_size)
|
|
178
|
+
allocated.keys.each{|t| release(t) unless t.alive?}
|
|
179
|
+
n = nil
|
|
180
|
+
end
|
|
175
181
|
|
|
176
|
-
|
|
182
|
+
if (n || _size) < max
|
|
183
|
+
do_make_new = allocated[thread] = true
|
|
177
184
|
end
|
|
178
185
|
end
|
|
179
|
-
|
|
180
|
-
#
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
|
|
187
|
+
# Connect to the database outside of the connection pool mutex,
|
|
188
|
+
# as that can take a long time and the connection pool mutex
|
|
189
|
+
# shouldn't be locked while the connection takes place.
|
|
190
|
+
if do_make_new
|
|
191
|
+
begin
|
|
192
|
+
conn = make_new(:default)
|
|
193
|
+
sync{allocated[thread] = conn}
|
|
194
|
+
ensure
|
|
195
|
+
unless conn
|
|
196
|
+
sync{allocated.delete(thread)}
|
|
190
197
|
end
|
|
191
198
|
end
|
|
192
|
-
conn
|
|
193
199
|
end
|
|
194
|
-
# :nocov:
|
|
195
|
-
end
|
|
196
200
|
|
|
197
|
-
|
|
198
|
-
# available, tries to create a new connection. The calling code should already
|
|
199
|
-
# have the mutex before calling this.
|
|
200
|
-
def available
|
|
201
|
-
next_available || make_new(:default)
|
|
201
|
+
conn
|
|
202
202
|
end
|
|
203
203
|
|
|
204
204
|
# Return a connection to the pool of available connections, returns the connection.
|
|
205
205
|
# The calling code should already have the mutex before calling this.
|
|
206
206
|
def checkin_connection(conn)
|
|
207
207
|
@available_connections << conn
|
|
208
|
-
if USE_WAITER
|
|
209
|
-
@waiter.signal
|
|
210
|
-
Thread.pass
|
|
211
|
-
end
|
|
212
208
|
conn
|
|
213
209
|
end
|
|
214
210
|
|
|
215
|
-
unless method_defined?(:default_make_new)
|
|
216
|
-
# Alias the default make_new method, so subclasses can call it directly.
|
|
217
|
-
alias default_make_new make_new
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
# Creates a new connection to the given server if the size of the pool for
|
|
221
|
-
# the server is less than the maximum size of the pool. The calling code
|
|
222
|
-
# should already have the mutex before calling this.
|
|
223
|
-
def make_new(server)
|
|
224
|
-
if (n = size) >= @max_size
|
|
225
|
-
@allocated.keys.each{|t| release(t) unless t.alive?}
|
|
226
|
-
n = nil
|
|
227
|
-
end
|
|
228
|
-
super if (n || size) < @max_size
|
|
229
|
-
end
|
|
230
|
-
|
|
231
211
|
# Return the next available connection in the pool, or nil if there
|
|
232
212
|
# is not currently an available connection. The calling code should already
|
|
233
213
|
# have the mutex before calling this.
|
|
@@ -246,15 +226,18 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
246
226
|
sync{@allocated[thread]}
|
|
247
227
|
end
|
|
248
228
|
|
|
249
|
-
# Create the maximum number of connections immediately.
|
|
229
|
+
# Create the maximum number of connections immediately. The calling code should
|
|
230
|
+
# NOT have the mutex before calling this.
|
|
250
231
|
def preconnect(concurrent = false)
|
|
251
|
-
enum = (max_size -
|
|
232
|
+
enum = (max_size - _size).times
|
|
252
233
|
|
|
253
|
-
if concurrent
|
|
254
|
-
enum.map{Thread.new{make_new(
|
|
234
|
+
conns = if concurrent
|
|
235
|
+
enum.map{Thread.new{make_new(:default)}}.map(&:value)
|
|
255
236
|
else
|
|
256
|
-
enum.
|
|
237
|
+
enum.map{make_new(:default)}
|
|
257
238
|
end
|
|
239
|
+
|
|
240
|
+
sync{conns.each{|conn| checkin_connection(conn)}}
|
|
258
241
|
end
|
|
259
242
|
|
|
260
243
|
# Raise a PoolTimeout error showing the current timeout, the elapsed time, and the
|
|
@@ -274,6 +257,9 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
274
257
|
else
|
|
275
258
|
checkin_connection(conn)
|
|
276
259
|
end
|
|
260
|
+
|
|
261
|
+
@waiter.signal
|
|
262
|
+
nil
|
|
277
263
|
end
|
|
278
264
|
|
|
279
265
|
# Yield to the block while inside the mutex. The calling code should NOT
|
|
@@ -281,6 +267,4 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
281
267
|
def sync
|
|
282
268
|
@mutex.synchronize{yield}
|
|
283
269
|
end
|
|
284
|
-
|
|
285
|
-
CONNECTION_POOL__MAP[[false, false]] = self
|
|
286
270
|
end
|
|
@@ -26,19 +26,13 @@
|
|
|
26
26
|
# specified by the array of symbols.
|
|
27
27
|
class Sequel::ConnectionPool
|
|
28
28
|
OPTS = Sequel::OPTS
|
|
29
|
+
POOL_CLASS_MAP = {
|
|
30
|
+
:threaded => :ThreadedConnectionPool,
|
|
31
|
+
:single => :SingleConnectionPool,
|
|
32
|
+
:sharded_threaded => :ShardedThreadedConnectionPool,
|
|
33
|
+
:sharded_single => :ShardedSingleConnectionPool
|
|
34
|
+
}.freeze
|
|
29
35
|
|
|
30
|
-
# The default server to use
|
|
31
|
-
DEFAULT_SERVER = :default
|
|
32
|
-
Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SERVER)
|
|
33
|
-
|
|
34
|
-
# A map of [single threaded, sharded] values to symbols or ConnectionPool subclasses.
|
|
35
|
-
CONNECTION_POOL_MAP = {[true, false] => :single,
|
|
36
|
-
[true, true] => :sharded_single,
|
|
37
|
-
[false, false] => :threaded,
|
|
38
|
-
[false, true] => :sharded_threaded}
|
|
39
|
-
CONNECTION_POOL__MAP = CONNECTION_POOL_MAP
|
|
40
|
-
Sequel::Deprecation.deprecate_constant(self, :CONNECTION_POOL_MAP)
|
|
41
|
-
|
|
42
36
|
# Class methods used to return an appropriate pool subclass, separated
|
|
43
37
|
# into a module for easier overridding by extensions.
|
|
44
38
|
module ClassMethods
|
|
@@ -47,23 +41,33 @@ class Sequel::ConnectionPool
|
|
|
47
41
|
# use a new instance of an appropriate pool subclass based on the
|
|
48
42
|
# <tt>:single_threaded</tt> and <tt>:servers</tt> options.
|
|
49
43
|
def get_pool(db, opts = OPTS)
|
|
50
|
-
|
|
51
|
-
when Class
|
|
52
|
-
v.new(db, opts)
|
|
53
|
-
when Symbol
|
|
54
|
-
require("sequel/connection_pool/#{v}")
|
|
55
|
-
connection_pool_class(opts).new(db, opts) || raise(Sequel::Error, "No connection pool class found")
|
|
56
|
-
end
|
|
44
|
+
connection_pool_class(opts).new(db, opts)
|
|
57
45
|
end
|
|
58
46
|
|
|
59
47
|
private
|
|
60
48
|
|
|
61
49
|
# Return a connection pool class based on the given options.
|
|
62
50
|
def connection_pool_class(opts)
|
|
63
|
-
if
|
|
64
|
-
|
|
51
|
+
if pc = opts[:pool_class]
|
|
52
|
+
unless pc.is_a?(Class)
|
|
53
|
+
unless name = POOL_CLASS_MAP[pc]
|
|
54
|
+
raise Sequel::Error, "unsupported connection pool type, please pass appropriate class as the :pool_class option"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
require_relative "connection_pool/#{pc}"
|
|
58
|
+
pc = Sequel.const_get(name)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
pc
|
|
62
|
+
else
|
|
63
|
+
pc = if opts[:single_threaded]
|
|
64
|
+
opts[:servers] ? :sharded_single : :single
|
|
65
|
+
else
|
|
66
|
+
opts[:servers] ? :sharded_threaded : :threaded
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
connection_pool_class(:pool_class=>pc)
|
|
65
70
|
end
|
|
66
|
-
CONNECTION_POOL__MAP[opts[:pool_class]] || opts[:pool_class] || CONNECTION_POOL__MAP[[!!opts[:single_threaded], !!opts[:servers]]]
|
|
67
71
|
end
|
|
68
72
|
end
|
|
69
73
|
extend ClassMethods
|
|
@@ -72,6 +76,9 @@ class Sequel::ConnectionPool
|
|
|
72
76
|
# connection made, and is usually used to set custom per-connection settings.
|
|
73
77
|
attr_accessor :after_connect
|
|
74
78
|
|
|
79
|
+
# An array of sql strings to execute on each new connection.
|
|
80
|
+
attr_accessor :connect_sqls
|
|
81
|
+
|
|
75
82
|
# The Sequel::Database object tied to this connection pool.
|
|
76
83
|
attr_accessor :db
|
|
77
84
|
|
|
@@ -82,6 +89,7 @@ class Sequel::ConnectionPool
|
|
|
82
89
|
# :after_connect :: A callable object called after each new connection is made, with the
|
|
83
90
|
# connection object (and server argument if the callable accepts 2 arguments),
|
|
84
91
|
# useful for customizations that you want to apply to all connections.
|
|
92
|
+
# :connect_sqls :: An array of sql strings to execute on each new connection, after :after_connect runs.
|
|
85
93
|
# :preconnect :: Automatically create the maximum number of connections, so that they don't
|
|
86
94
|
# need to be created as needed. This is useful when connecting takes a long time
|
|
87
95
|
# and you want to avoid possible latency during runtime.
|
|
@@ -90,15 +98,10 @@ class Sequel::ConnectionPool
|
|
|
90
98
|
def initialize(db, opts=OPTS)
|
|
91
99
|
@db = db
|
|
92
100
|
@after_connect = opts[:after_connect]
|
|
101
|
+
@connect_sqls = opts[:connect_sqls]
|
|
93
102
|
@error_classes = db.send(:database_error_classes).dup.freeze
|
|
94
103
|
end
|
|
95
104
|
|
|
96
|
-
# Alias for +size+, not aliased directly for ease of subclass implementation
|
|
97
|
-
def created_count(*args)
|
|
98
|
-
Sequel::Deprecation.deprecate("Sequel::ConnectionPool#created_count", "Use #size instead")
|
|
99
|
-
size(*args)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
105
|
# An array of symbols for all shards/servers, which is a single <tt>:default</tt> by default.
|
|
103
106
|
def servers
|
|
104
107
|
[:default]
|
|
@@ -121,6 +124,7 @@ class Sequel::ConnectionPool
|
|
|
121
124
|
def make_new(server)
|
|
122
125
|
begin
|
|
123
126
|
conn = @db.connect(server)
|
|
127
|
+
|
|
124
128
|
if ac = @after_connect
|
|
125
129
|
if ac.arity == 2
|
|
126
130
|
ac.call(conn, server)
|
|
@@ -128,6 +132,12 @@ class Sequel::ConnectionPool
|
|
|
128
132
|
ac.call(conn)
|
|
129
133
|
end
|
|
130
134
|
end
|
|
135
|
+
|
|
136
|
+
if cs = @connect_sqls
|
|
137
|
+
cs.each do |sql|
|
|
138
|
+
db.send(:log_connection_execute, conn, sql)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
131
141
|
rescue Exception=>exception
|
|
132
142
|
raise Sequel.convert_exception_class(exception, Sequel::DatabaseConnectionError)
|
|
133
143
|
end
|