sequel 5.8.0 → 5.38.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 +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -5,73 +5,82 @@ require_relative 'shared/sqlite'
|
|
|
5
5
|
|
|
6
6
|
module Sequel
|
|
7
7
|
module SQLite
|
|
8
|
-
FALSE_VALUES = (%w'0 false f no n' + [0]).freeze
|
|
8
|
+
FALSE_VALUES = (%w'0 false f no n'.each(&:freeze) + [0]).freeze
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
blob = Object.new
|
|
11
|
+
def blob.call(s)
|
|
12
|
+
Sequel::SQL::Blob.new(s.to_s)
|
|
13
|
+
end
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
boolean = Object.new
|
|
16
|
+
def boolean.call(s)
|
|
17
|
+
s = s.downcase if s.is_a?(String)
|
|
18
|
+
!FALSE_VALUES.include?(s)
|
|
19
|
+
end
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
date = Object.new
|
|
22
|
+
def date.call(s)
|
|
23
|
+
case s
|
|
24
|
+
when String
|
|
25
|
+
Sequel.string_to_date(s)
|
|
26
|
+
when Integer
|
|
27
|
+
Date.jd(s)
|
|
28
|
+
when Float
|
|
29
|
+
Date.jd(s.to_i)
|
|
30
|
+
else
|
|
31
|
+
raise Sequel::Error, "unhandled type when converting to date: #{s.inspect} (#{s.class.inspect})"
|
|
31
32
|
end
|
|
33
|
+
end
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
integer = Object.new
|
|
36
|
+
def integer.call(s)
|
|
37
|
+
s.to_i
|
|
38
|
+
end
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
float = Object.new
|
|
41
|
+
def float.call(s)
|
|
42
|
+
s.to_f
|
|
43
|
+
end
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
numeric = Object.new
|
|
46
|
+
def numeric.call(s)
|
|
47
|
+
s = s.to_s unless s.is_a?(String)
|
|
48
|
+
BigDecimal(s) rescue s
|
|
49
|
+
end
|
|
45
50
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
time = Object.new
|
|
52
|
+
def time.call(s)
|
|
53
|
+
case s
|
|
54
|
+
when String
|
|
55
|
+
Sequel.string_to_time(s)
|
|
56
|
+
when Integer
|
|
57
|
+
Sequel::SQLTime.create(s/3600, (s % 3600)/60, s % 60)
|
|
58
|
+
when Float
|
|
59
|
+
s, f = s.divmod(1)
|
|
60
|
+
Sequel::SQLTime.create(s/3600, (s % 3600)/60, s % 60, (f*1000000).round)
|
|
61
|
+
else
|
|
62
|
+
raise Sequel::Error, "unhandled type when converting to date: #{s.inspect} (#{s.class.inspect})"
|
|
58
63
|
end
|
|
59
|
-
end
|
|
64
|
+
end
|
|
60
65
|
|
|
61
66
|
# Hash with string keys and callable values for converting SQLite types.
|
|
62
67
|
SQLITE_TYPES = {}
|
|
63
68
|
{
|
|
64
|
-
%w'date' =>
|
|
65
|
-
%w'time' =>
|
|
66
|
-
%w'bit bool boolean' =>
|
|
67
|
-
%w'integer smallint mediumint int bigint' =>
|
|
68
|
-
%w'numeric decimal money' =>
|
|
69
|
-
%w'float double real dec fixed' + ['double precision'] =>
|
|
70
|
-
%w'blob' =>
|
|
69
|
+
%w'date' => date,
|
|
70
|
+
%w'time' => time,
|
|
71
|
+
%w'bit bool boolean' => boolean,
|
|
72
|
+
%w'integer smallint mediumint int bigint' => integer,
|
|
73
|
+
%w'numeric decimal money' => numeric,
|
|
74
|
+
%w'float double real dec fixed' + ['double precision'] => float,
|
|
75
|
+
%w'blob' => blob
|
|
71
76
|
}.each do |k,v|
|
|
72
77
|
k.each{|n| SQLITE_TYPES[n] = v}
|
|
73
78
|
end
|
|
74
79
|
SQLITE_TYPES.freeze
|
|
80
|
+
|
|
81
|
+
sqlite_version = SQLite3::VERSION.split('.').map(&:to_i)[0..1]
|
|
82
|
+
sqlite_version = sqlite_version[0] * 100 + sqlite_version[1]
|
|
83
|
+
USE_EXTENDED_RESULT_CODES = sqlite_version >= 104
|
|
75
84
|
|
|
76
85
|
class Database < Sequel::Database
|
|
77
86
|
include ::Sequel::SQLite::DatabaseMethods
|
|
@@ -103,7 +112,11 @@ module Sequel
|
|
|
103
112
|
sqlite3_opts = {}
|
|
104
113
|
sqlite3_opts[:readonly] = typecast_value_boolean(opts[:readonly]) if opts.has_key?(:readonly)
|
|
105
114
|
db = ::SQLite3::Database.new(opts[:database].to_s, sqlite3_opts)
|
|
106
|
-
db.busy_timeout(opts.fetch(:timeout, 5000))
|
|
115
|
+
db.busy_timeout(typecast_value_integer(opts.fetch(:timeout, 5000)))
|
|
116
|
+
|
|
117
|
+
if USE_EXTENDED_RESULT_CODES
|
|
118
|
+
db.extended_result_codes = true
|
|
119
|
+
end
|
|
107
120
|
|
|
108
121
|
connection_pragmas.each{|s| log_connection_yield(s, db){db.execute_batch(s)}}
|
|
109
122
|
|
|
@@ -181,7 +194,7 @@ module Sequel
|
|
|
181
194
|
return execute_prepared_statement(conn, type, sql, opts, &block) if sql.is_a?(Symbol)
|
|
182
195
|
log_args = opts[:arguments]
|
|
183
196
|
args = {}
|
|
184
|
-
opts.fetch(:arguments,
|
|
197
|
+
opts.fetch(:arguments, OPTS).each{|k, v| args[k] = prepared_statement_argument(v)}
|
|
185
198
|
case type
|
|
186
199
|
when :select
|
|
187
200
|
log_connection_yield(sql, conn, log_args){conn.query(sql, args, &block)}
|
|
@@ -274,13 +287,12 @@ module Sequel
|
|
|
274
287
|
Dataset
|
|
275
288
|
end
|
|
276
289
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
#end
|
|
290
|
+
if USE_EXTENDED_RESULT_CODES
|
|
291
|
+
# Support SQLite exception codes if ruby-sqlite3 supports them.
|
|
292
|
+
def sqlite_error_code(exception)
|
|
293
|
+
exception.code if exception.respond_to?(:code)
|
|
294
|
+
end
|
|
295
|
+
end
|
|
284
296
|
end
|
|
285
297
|
|
|
286
298
|
class Dataset < Sequel::Dataset
|
|
@@ -306,11 +318,6 @@ module Sequel
|
|
|
306
318
|
def prepared_arg(k)
|
|
307
319
|
LiteralString.new("#{prepared_arg_placeholder}#{k.to_s.gsub('.', '__')}")
|
|
308
320
|
end
|
|
309
|
-
|
|
310
|
-
# Always assume a prepared argument.
|
|
311
|
-
def prepared_arg?(k)
|
|
312
|
-
true
|
|
313
|
-
end
|
|
314
321
|
end
|
|
315
322
|
|
|
316
323
|
BindArgumentMethods = prepared_statements_module(:bind, ArgumentMapper)
|
|
@@ -318,15 +325,18 @@ module Sequel
|
|
|
318
325
|
|
|
319
326
|
def fetch_rows(sql)
|
|
320
327
|
execute(sql) do |result|
|
|
321
|
-
i = -1
|
|
322
328
|
cps = db.conversion_procs
|
|
323
329
|
type_procs = result.types.map{|t| cps[base_type_name(t)]}
|
|
324
|
-
|
|
330
|
+
j = -1
|
|
331
|
+
cols = result.columns.map{|c| [output_identifier(c), type_procs[(j+=1)]]}
|
|
325
332
|
self.columns = cols.map(&:first)
|
|
333
|
+
max = cols.length
|
|
326
334
|
result.each do |values|
|
|
327
335
|
row = {}
|
|
328
|
-
|
|
329
|
-
|
|
336
|
+
i = -1
|
|
337
|
+
while (i += 1) < max
|
|
338
|
+
name, type_proc = cols[i]
|
|
339
|
+
v = values[i]
|
|
330
340
|
if type_proc && v
|
|
331
341
|
v = type_proc.call(v)
|
|
332
342
|
end
|
|
@@ -16,6 +16,19 @@ module Sequel
|
|
|
16
16
|
c = TinyTds::Client.new(opts)
|
|
17
17
|
c.query_options.merge!(:cache_rows=>false)
|
|
18
18
|
|
|
19
|
+
# SEQUEL6: Default to ansi: true
|
|
20
|
+
if opts[:ansi]
|
|
21
|
+
sql = %w(
|
|
22
|
+
ANSI_NULLS
|
|
23
|
+
ANSI_PADDING
|
|
24
|
+
ANSI_WARNINGS
|
|
25
|
+
ANSI_NULL_DFLT_ON
|
|
26
|
+
QUOTED_IDENTIFIER
|
|
27
|
+
CONCAT_NULL_YIELDS_NULL
|
|
28
|
+
).map{|v| "SET #{v} ON"}.join(";")
|
|
29
|
+
log_connection_yield(sql, c){c.execute(sql)}
|
|
30
|
+
end
|
|
31
|
+
|
|
19
32
|
if (ts = opts[:textsize])
|
|
20
33
|
sql = "SET TEXTSIZE #{typecast_value_integer(ts)}"
|
|
21
34
|
log_connection_yield(sql, c){c.execute(sql)}
|
|
@@ -133,7 +146,7 @@ module Sequel
|
|
|
133
146
|
|
|
134
147
|
# Return true if the :conn argument is present and not active.
|
|
135
148
|
def disconnect_error?(e, opts)
|
|
136
|
-
super || (opts[:conn] && !opts[:conn].active?) || ((e.is_a?(::TinyTds::Error) && /\A(Attempt to initiate a new Adaptive Server operation with results pending|The request failed to run because the batch is aborted, this can be caused by abort signal sent from client|Adaptive Server connection timed out)/.match(e.message)))
|
|
149
|
+
super || (opts[:conn] && !opts[:conn].active?) || ((e.is_a?(::TinyTds::Error) && /\A(Attempt to initiate a new Adaptive Server operation with results pending|The request failed to run because the batch is aborted, this can be caused by abort signal sent from client|Adaptive Server connection timed out|DBPROCESS is dead or not enabled)/.match(e.message)))
|
|
137
150
|
end
|
|
138
151
|
|
|
139
152
|
# Dispose of any possible results of execution.
|
|
@@ -194,11 +207,6 @@ module Sequel
|
|
|
194
207
|
def prepared_arg(k)
|
|
195
208
|
LiteralString.new("@#{k.to_s.gsub('.', '__')}")
|
|
196
209
|
end
|
|
197
|
-
|
|
198
|
-
# Always assume a prepared argument.
|
|
199
|
-
def prepared_arg?(k)
|
|
200
|
-
true
|
|
201
|
-
end
|
|
202
210
|
end
|
|
203
211
|
|
|
204
212
|
PreparedStatementMethods = prepared_statements_module("sql = prepared_sql; opts = Hash[opts]; opts[:arguments] = bind_arguments", ArgumentMapper)
|
|
@@ -32,14 +32,11 @@ module Sequel
|
|
|
32
32
|
row_count = @opts[:offset_total_count] || ds.clone(:append_sql=>String.new, :placeholder_literal_null=>true).count
|
|
33
33
|
dsa1 = dataset_alias(1)
|
|
34
34
|
|
|
35
|
-
if o.is_a?(Symbol) && @opts[:bind_vars] &&
|
|
35
|
+
if o.is_a?(Symbol) && @opts[:bind_vars] && /\A\$(.*)\z/ =~ o
|
|
36
36
|
# Handle use of bound variable offsets. Unfortunately, prepared statement
|
|
37
37
|
# bound variable offsets cannot be handled, since the bound variable value
|
|
38
38
|
# isn't available until later.
|
|
39
|
-
|
|
40
|
-
if prepared_arg?(s)
|
|
41
|
-
o = prepared_arg(s)
|
|
42
|
-
end
|
|
39
|
+
o = prepared_arg($1.to_sym)
|
|
43
40
|
end
|
|
44
41
|
|
|
45
42
|
reverse_offset = row_count - o
|
|
@@ -17,6 +17,8 @@ module Sequel
|
|
|
17
17
|
MySQL client is not connected
|
|
18
18
|
This connection is still waiting for a result, try again once you have the result
|
|
19
19
|
closed MySQL connection
|
|
20
|
+
The MySQL server is running with the --read-only option so it cannot execute this statement
|
|
21
|
+
Connection was killed
|
|
20
22
|
END
|
|
21
23
|
# Error messages for mysql and mysql2 that indicate the current connection should be disconnected
|
|
22
24
|
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/
|
|
@@ -54,10 +56,12 @@ module Sequel
|
|
|
54
56
|
NotNullConstraintViolation
|
|
55
57
|
when 1062
|
|
56
58
|
UniqueConstraintViolation
|
|
57
|
-
when 1451, 1452
|
|
59
|
+
when 1451, 1452, 1216, 1217
|
|
58
60
|
ForeignKeyConstraintViolation
|
|
59
61
|
when 4025
|
|
60
62
|
CheckConstraintViolation
|
|
63
|
+
when 1205
|
|
64
|
+
DatabaseLockTimeout
|
|
61
65
|
else
|
|
62
66
|
super
|
|
63
67
|
end
|
|
@@ -90,11 +90,6 @@ class Sequel::ConnectionPool
|
|
|
90
90
|
# connection object (and server argument if the callable accepts 2 arguments),
|
|
91
91
|
# useful for customizations that you want to apply to all connections.
|
|
92
92
|
# :connect_sqls :: An array of sql strings to execute on each new connection, after :after_connect runs.
|
|
93
|
-
# :preconnect :: Automatically create the maximum number of connections, so that they don't
|
|
94
|
-
# need to be created as needed. This is useful when connecting takes a long time
|
|
95
|
-
# and you want to avoid possible latency during runtime.
|
|
96
|
-
# Set to :concurrently to create the connections in separate threads. Otherwise
|
|
97
|
-
# they'll be created sequentially.
|
|
98
93
|
def initialize(db, opts=OPTS)
|
|
99
94
|
@db = db
|
|
100
95
|
@after_connect = opts[:after_connect]
|
|
@@ -109,7 +104,8 @@ class Sequel::ConnectionPool
|
|
|
109
104
|
|
|
110
105
|
private
|
|
111
106
|
|
|
112
|
-
# Remove the connection from the pool.
|
|
107
|
+
# Remove the connection from the pool. For threaded connections, this should be
|
|
108
|
+
# called without the mutex, because the disconnection may block.
|
|
113
109
|
def disconnect_connection(conn)
|
|
114
110
|
db.disconnect_connection(conn)
|
|
115
111
|
end
|
|
@@ -19,9 +19,9 @@ class Sequel::ShardedSingleConnectionPool < Sequel::ConnectionPool
|
|
|
19
19
|
add_servers(opts[:servers].keys) if opts[:servers]
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
# Adds new servers to the connection pool. Primarily used in conjunction with
|
|
23
|
-
# or
|
|
24
|
-
# at runtime. servers argument should be an array of symbols.
|
|
22
|
+
# Adds new servers to the connection pool. Primarily used in conjunction with primary/replica
|
|
23
|
+
# or sharded configurations. Allows for dynamic expansion of the potential replicas/shards
|
|
24
|
+
# at runtime. +servers+ argument should be an array of symbols.
|
|
25
25
|
def add_servers(servers)
|
|
26
26
|
servers.each{|s| @servers[s] = s}
|
|
27
27
|
end
|
|
@@ -41,7 +41,10 @@ class Sequel::ShardedSingleConnectionPool < Sequel::ConnectionPool
|
|
|
41
41
|
# :server :: Should be a symbol specifing the server to disconnect from,
|
|
42
42
|
# or an array of symbols to specify multiple servers.
|
|
43
43
|
def disconnect(opts=OPTS)
|
|
44
|
-
(opts[:server] ? Array(opts[:server]) : servers).each
|
|
44
|
+
(opts[:server] ? Array(opts[:server]) : servers).each do |s|
|
|
45
|
+
raise Sequel::Error, "invalid server: #{s}" unless @servers.has_key?(s)
|
|
46
|
+
disconnect_server(s)
|
|
47
|
+
end
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
def freeze
|
|
@@ -19,6 +19,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
19
19
|
super
|
|
20
20
|
@available_connections = {}
|
|
21
21
|
@connections_to_remove = []
|
|
22
|
+
@connections_to_disconnect = []
|
|
22
23
|
@servers = opts.fetch(:servers_hash, Hash.new(:default))
|
|
23
24
|
remove_instance_variable(:@waiter)
|
|
24
25
|
@waiters = {}
|
|
@@ -27,8 +28,8 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
27
28
|
add_servers(opts[:servers].keys) if opts[:servers]
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
# Adds new servers to the connection pool. Allows for dynamic expansion of the potential
|
|
31
|
-
# at runtime. servers argument should be an array of symbols.
|
|
31
|
+
# Adds new servers to the connection pool. Allows for dynamic expansion of the potential replicas/shards
|
|
32
|
+
# at runtime. +servers+ argument should be an array of symbols.
|
|
32
33
|
def add_servers(servers)
|
|
33
34
|
sync do
|
|
34
35
|
servers.each do |server|
|
|
@@ -45,6 +46,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
45
46
|
# A hash of connections currently being used for the given server, key is the
|
|
46
47
|
# Thread, value is the connection. Nonexistent servers will return nil. Treat
|
|
47
48
|
# this as read only, do not modify the resulting object.
|
|
49
|
+
# The calling code should already have the mutex before calling this.
|
|
48
50
|
def allocated(server=:default)
|
|
49
51
|
@allocated[server]
|
|
50
52
|
end
|
|
@@ -55,7 +57,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
55
57
|
# it is yielding all of the connections, which means that until
|
|
56
58
|
# the method's block returns, the pool is locked.
|
|
57
59
|
def all_connections
|
|
58
|
-
t =
|
|
60
|
+
t = Sequel.current
|
|
59
61
|
sync do
|
|
60
62
|
@allocated.values.each do |threads|
|
|
61
63
|
threads.each do |thread, conn|
|
|
@@ -69,13 +71,14 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
69
71
|
# An array of connections opened but not currently used, for the given
|
|
70
72
|
# server. Nonexistent servers will return nil. Treat this as read only, do
|
|
71
73
|
# not modify the resulting object.
|
|
74
|
+
# The calling code should already have the mutex before calling this.
|
|
72
75
|
def available_connections(server=:default)
|
|
73
76
|
@available_connections[server]
|
|
74
77
|
end
|
|
75
78
|
|
|
76
79
|
# The total number of connections opened for the given server.
|
|
77
80
|
# Nonexistent servers will return the created count of the default server.
|
|
78
|
-
# The calling code should
|
|
81
|
+
# The calling code should NOT have the mutex before calling this.
|
|
79
82
|
def size(server=:default)
|
|
80
83
|
@mutex.synchronize{_size(server)}
|
|
81
84
|
end
|
|
@@ -92,9 +95,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
92
95
|
# or an array of symbols to specify multiple servers.
|
|
93
96
|
def disconnect(opts=OPTS)
|
|
94
97
|
(opts[:server] ? Array(opts[:server]) : sync{@servers.keys}).each do |s|
|
|
95
|
-
|
|
96
|
-
disconnect_connections(conns)
|
|
97
|
-
end
|
|
98
|
+
disconnect_connections(sync{disconnect_server_connections(s)})
|
|
98
99
|
end
|
|
99
100
|
end
|
|
100
101
|
|
|
@@ -118,7 +119,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
118
119
|
# connection can be acquired, a Sequel::PoolTimeout is raised.
|
|
119
120
|
def hold(server=:default)
|
|
120
121
|
server = pick_server(server)
|
|
121
|
-
t =
|
|
122
|
+
t = Sequel.current
|
|
122
123
|
if conn = owned_connection(t, server)
|
|
123
124
|
return yield(conn)
|
|
124
125
|
end
|
|
@@ -130,6 +131,9 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
130
131
|
raise
|
|
131
132
|
ensure
|
|
132
133
|
sync{release(t, conn, server)} if conn
|
|
134
|
+
while dconn = sync{@connections_to_disconnect.shift}
|
|
135
|
+
disconnect_connection(dconn)
|
|
136
|
+
end
|
|
133
137
|
end
|
|
134
138
|
end
|
|
135
139
|
|
|
@@ -197,11 +201,11 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
197
201
|
|
|
198
202
|
until conn = assign_connection(thread, server)
|
|
199
203
|
elapsed = Sequel.elapsed_seconds_since(timer)
|
|
204
|
+
# :nocov:
|
|
200
205
|
raise_pool_timeout(elapsed, server) if elapsed > timeout
|
|
201
206
|
|
|
202
|
-
# :nocov:
|
|
203
207
|
# It's difficult to get to this point, it can only happen if there is a race condition
|
|
204
|
-
# where a connection cannot be acquired even after the thread is signalled by the condition
|
|
208
|
+
# where a connection cannot be acquired even after the thread is signalled by the condition variable
|
|
205
209
|
sync do
|
|
206
210
|
@waiters[server].wait(@mutex, timeout - elapsed)
|
|
207
211
|
if conn = next_available(server)
|
|
@@ -217,17 +221,22 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
217
221
|
# Assign a connection to the thread, or return nil if one cannot be assigned.
|
|
218
222
|
# The caller should NOT have the mutex before calling this.
|
|
219
223
|
def assign_connection(thread, server)
|
|
220
|
-
alloc =
|
|
224
|
+
alloc = nil
|
|
221
225
|
|
|
222
226
|
do_make_new = false
|
|
223
227
|
sync do
|
|
228
|
+
alloc = allocated(server)
|
|
224
229
|
if conn = next_available(server)
|
|
225
230
|
alloc[thread] = conn
|
|
226
231
|
return conn
|
|
227
232
|
end
|
|
228
233
|
|
|
229
234
|
if (n = _size(server)) >= (max = @max_size)
|
|
230
|
-
alloc.to_a.each
|
|
235
|
+
alloc.to_a.each do |t,c|
|
|
236
|
+
unless t.alive?
|
|
237
|
+
remove(t, c, server)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
231
240
|
n = nil
|
|
232
241
|
end
|
|
233
242
|
|
|
@@ -267,18 +276,20 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
267
276
|
# Mark any allocated connections to be removed when they are checked back in. The calling
|
|
268
277
|
# code should already have the mutex before calling this.
|
|
269
278
|
def disconnect_server_connections(server)
|
|
270
|
-
|
|
279
|
+
remove_conns = allocated(server)
|
|
280
|
+
dis_conns = available_connections(server)
|
|
281
|
+
raise Sequel::Error, "invalid server: #{server}" unless remove_conns && dis_conns
|
|
271
282
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
283
|
+
@connections_to_remove.concat(remove_conns.values)
|
|
284
|
+
|
|
285
|
+
conns = dis_conns.dup
|
|
286
|
+
dis_conns.clear
|
|
287
|
+
@waiters[server].signal
|
|
277
288
|
conns
|
|
278
289
|
end
|
|
279
290
|
|
|
280
291
|
# Disconnect all available connections immediately, and schedule currently allocated connections for disconnection
|
|
281
|
-
# as soon as they are returned to the pool. The calling code should
|
|
292
|
+
# as soon as they are returned to the pool. The calling code should NOT
|
|
282
293
|
# have the mutex before calling this.
|
|
283
294
|
def disconnect_connections(conns)
|
|
284
295
|
conns.each{|conn| disconnect_connection(conn)}
|
|
@@ -339,7 +350,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
339
350
|
conn = allocated(server).delete(thread)
|
|
340
351
|
|
|
341
352
|
if @connection_handling == :disconnect
|
|
342
|
-
|
|
353
|
+
@connections_to_disconnect << conn
|
|
343
354
|
else
|
|
344
355
|
checkin_connection(server, conn)
|
|
345
356
|
end
|
|
@@ -355,6 +366,6 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
355
366
|
def remove(thread, conn, server)
|
|
356
367
|
@connections_to_remove.delete(conn)
|
|
357
368
|
allocated(server).delete(thread) if @servers.include?(server)
|
|
358
|
-
|
|
369
|
+
@connections_to_disconnect << conn
|
|
359
370
|
end
|
|
360
371
|
end
|