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
@@ -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
|
data/lib/sequel/core.rb
CHANGED
@@ -9,13 +9,16 @@
|
|
9
9
|
#
|
10
10
|
# DB = Sequel.sqlite # Memory database
|
11
11
|
# DB = Sequel.sqlite('blog.db')
|
12
|
-
# DB = Sequel.postgres('database_name',
|
13
|
-
# :
|
14
|
-
# :
|
12
|
+
# DB = Sequel.postgres('database_name',
|
13
|
+
# user:'user',
|
14
|
+
# password: 'password',
|
15
|
+
# host: 'host'
|
16
|
+
# port: 5432,
|
17
|
+
# max_connections: 10)
|
15
18
|
#
|
16
19
|
# If a block is given to these methods, it is passed the opened Database
|
17
20
|
# object, which is closed (disconnected) when the block exits, just
|
18
|
-
# like a block passed to connect. For example:
|
21
|
+
# like a block passed to Sequel.connect. For example:
|
19
22
|
#
|
20
23
|
# Sequel.sqlite('blog.db'){|db| puts db[:users].count}
|
21
24
|
#
|
@@ -24,7 +27,7 @@
|
|
24
27
|
module Sequel
|
25
28
|
@convert_two_digit_years = true
|
26
29
|
@datetime_class = Time
|
27
|
-
@split_symbols =
|
30
|
+
@split_symbols = false
|
28
31
|
@single_threaded = false
|
29
32
|
|
30
33
|
class << self
|
@@ -41,16 +44,13 @@ module Sequel
|
|
41
44
|
#
|
42
45
|
# Sequel.datetime_class = DateTime
|
43
46
|
#
|
44
|
-
#
|
45
|
-
# 2038), so if you use datetimes out of that range, you need to switch
|
46
|
-
# to +DateTime+. Also, before 1.9.2, +Time+ can only handle local and UTC
|
47
|
-
# times, not other timezones. Note that +Time+ and +DateTime+ objects
|
47
|
+
# Note that +Time+ and +DateTime+ objects
|
48
48
|
# have a different API, and in cases where they implement the same methods,
|
49
49
|
# they often implement them differently (e.g. + using seconds on +Time+ and
|
50
50
|
# days on +DateTime+).
|
51
51
|
attr_accessor :datetime_class
|
52
52
|
|
53
|
-
# Set whether
|
53
|
+
# Set whether Sequel is being used in single threaded mode. by default,
|
54
54
|
# Sequel uses a thread-safe connection pool, which isn't as fast as the
|
55
55
|
# single threaded connection pool, and also has some additional thread
|
56
56
|
# safety checks. If your program will only have one thread,
|
@@ -92,11 +92,11 @@ module Sequel
|
|
92
92
|
# DB = Sequel.connect('sqlite://blog.db') # ./blog.db
|
93
93
|
# DB = Sequel.connect('sqlite:///blog.db') # /blog.db
|
94
94
|
# DB = Sequel.connect('postgres://user:password@host:port/database_name')
|
95
|
-
# DB = Sequel.connect('sqlite:///blog.db', :
|
95
|
+
# DB = Sequel.connect('sqlite:///blog.db', max_connections: 10)
|
96
96
|
#
|
97
97
|
# You can also pass a single options hash:
|
98
98
|
#
|
99
|
-
# DB = Sequel.connect(:
|
99
|
+
# DB = Sequel.connect(adapter: 'sqlite', database: './blog.db')
|
100
100
|
#
|
101
101
|
# If a block is given, it is passed the opened +Database+ object, which is
|
102
102
|
# closed when the block exits. For example:
|
@@ -108,7 +108,7 @@ module Sequel
|
|
108
108
|
# design, and used by <tt>Sequel::Model</tt> to pick the default
|
109
109
|
# database. It is recommended to pass a block if you do not want the
|
110
110
|
# resulting Database object to remain in memory until the process
|
111
|
-
# terminates.
|
111
|
+
# terminates, or use the <tt>keep_reference: false</tt> Database option.
|
112
112
|
#
|
113
113
|
# For details, see the {"Connecting to a Database" guide}[rdoc-ref:doc/opening_databases.rdoc].
|
114
114
|
# To set up a master/slave or sharded database connection, see the {"Master/Slave Databases and Sharding" guide}[rdoc-ref:doc/sharding.rdoc].
|
@@ -134,9 +134,7 @@ module Sequel
|
|
134
134
|
end
|
135
135
|
|
136
136
|
# Load all Sequel extensions given. Extensions are just files that exist under
|
137
|
-
# <tt>sequel/extensions</tt> in the load path, and are just required.
|
138
|
-
# extensions modify the behavior of +Database+ and/or +Dataset+, but Sequel ships
|
139
|
-
# with some extensions that modify other classes that exist for backwards compatibility.
|
137
|
+
# <tt>sequel/extensions</tt> in the load path, and are just required.
|
140
138
|
# In some cases, requiring an extension modifies classes directly, and in others,
|
141
139
|
# it just loads a module that you can extend other classes with. Consult the documentation
|
142
140
|
# for each extension you plan on using for usage.
|
@@ -147,39 +145,6 @@ module Sequel
|
|
147
145
|
extensions.each{|e| Kernel.require "sequel/extensions/#{e}"}
|
148
146
|
end
|
149
147
|
|
150
|
-
# Set the method to call on identifiers going into the database. This affects
|
151
|
-
# the literalization of identifiers by calling this method on them before they are input.
|
152
|
-
# Sequel upcases identifiers in all SQL strings for most databases, so to turn that off:
|
153
|
-
#
|
154
|
-
# Sequel.identifier_input_method = nil
|
155
|
-
#
|
156
|
-
# to downcase instead:
|
157
|
-
#
|
158
|
-
# Sequel.identifier_input_method = :downcase
|
159
|
-
#
|
160
|
-
# Other String instance methods work as well.
|
161
|
-
def self.identifier_input_method=(value)
|
162
|
-
# SEQUEL5: Remove
|
163
|
-
Database.identifier_input_method = value
|
164
|
-
end
|
165
|
-
|
166
|
-
# Set the method to call on identifiers coming out of the database. This affects
|
167
|
-
# the literalization of identifiers by calling this method on them when they are
|
168
|
-
# retrieved from the database. Sequel downcases identifiers retrieved for most
|
169
|
-
# databases, so to turn that off:
|
170
|
-
#
|
171
|
-
# Sequel.identifier_output_method = nil
|
172
|
-
#
|
173
|
-
# to upcase instead:
|
174
|
-
#
|
175
|
-
# Sequel.identifier_output_method = :upcase
|
176
|
-
#
|
177
|
-
# Other String instance methods work as well.
|
178
|
-
def self.identifier_output_method=(value)
|
179
|
-
# SEQUEL5: Remove
|
180
|
-
Database.identifier_output_method = value
|
181
|
-
end
|
182
|
-
|
183
148
|
# The exception classed raised if there is an error parsing JSON.
|
184
149
|
# This can be overridden to use an alternative json implementation.
|
185
150
|
def self.json_parser_error_class
|
@@ -198,15 +163,6 @@ module Sequel
|
|
198
163
|
JSON.parse(json, :create_additions=>false)
|
199
164
|
end
|
200
165
|
|
201
|
-
# Set whether to quote identifiers for all databases by default. By default,
|
202
|
-
# Sequel quotes identifiers in all SQL strings, so to turn that off:
|
203
|
-
#
|
204
|
-
# Sequel.quote_identifiers = false
|
205
|
-
def self.quote_identifiers=(value)
|
206
|
-
# SEQUEL5: Remove
|
207
|
-
Database.quote_identifiers = value
|
208
|
-
end
|
209
|
-
|
210
166
|
# Convert each item in the array to the correct type, handling multi-dimensional
|
211
167
|
# arrays. For each element in the array or subarrays, call the converter,
|
212
168
|
# unless the value is nil.
|
@@ -220,17 +176,15 @@ module Sequel
|
|
220
176
|
end
|
221
177
|
end
|
222
178
|
|
223
|
-
#
|
224
|
-
# this file. If a +subdir+ is given, assume all +files+ are in that subdir.
|
225
|
-
# This is used to ensure that the files loaded are from the same version of
|
226
|
-
# Sequel as this file.
|
179
|
+
# For backwards compatibility only. require_relative should be used instead.
|
227
180
|
def self.require(files, subdir=nil)
|
228
|
-
|
181
|
+
# Use Kernel.require_relative to work around JRuby 9.0 bug
|
182
|
+
Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
|
229
183
|
end
|
230
184
|
|
231
185
|
SPLIT_SYMBOL_CACHE = {}
|
232
186
|
|
233
|
-
# Splits the symbol into three parts, if symbol splitting is enabled.
|
187
|
+
# Splits the symbol into three parts, if symbol splitting is enabled (not the default).
|
234
188
|
# Each part will either be a string or nil. If symbol splitting
|
235
189
|
# is disabled, returns an array with the first and third parts
|
236
190
|
# being nil, and the second part beind a string version of the symbol.
|
@@ -239,22 +193,13 @@ module Sequel
|
|
239
193
|
# For tables, these parts are the schema, table, and alias.
|
240
194
|
def self.split_symbol(sym)
|
241
195
|
unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
|
242
|
-
if
|
196
|
+
if split_symbols?
|
243
197
|
v = case s = sym.to_s
|
244
198
|
when /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/
|
245
|
-
if split == :deprecated
|
246
|
-
Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.qualify(#{$1.inspect}, #{$2.inspect}).as(#{$3.inspect})")
|
247
|
-
end
|
248
199
|
[$1.freeze, $2.freeze, $3.freeze].freeze
|
249
200
|
when /\A((?:(?!___).)+)___(.+)\z/
|
250
|
-
if split == :deprecated
|
251
|
-
Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.identifier(#{$1.inspect}).as(#{$2.inspect})")
|
252
|
-
end
|
253
201
|
[nil, $1.freeze, $2.freeze].freeze
|
254
202
|
when /\A((?:(?!__).)+)__(.+)\z/
|
255
|
-
if split == :deprecated
|
256
|
-
Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.qualify(#{$1.inspect}, #{$2.inspect})")
|
257
|
-
end
|
258
203
|
[$1.freeze, $2.freeze, nil].freeze
|
259
204
|
else
|
260
205
|
[nil, s.freeze, nil].freeze
|
@@ -267,32 +212,28 @@ module Sequel
|
|
267
212
|
v
|
268
213
|
end
|
269
214
|
|
270
|
-
#
|
215
|
+
# Setting this to true enables Sequel's historical behavior of splitting
|
216
|
+
# symbols on double or triple underscores:
|
271
217
|
#
|
272
218
|
# :table__column # table.column
|
273
219
|
# :column___alias # column AS alias
|
274
220
|
# :table__column___alias # table.column AS alias
|
275
221
|
#
|
276
|
-
#
|
277
|
-
#
|
278
|
-
# double or triple underscores was the only way to represent qualified or
|
279
|
-
# aliased identifiers. Sequel now offers many ways to create qualified and
|
280
|
-
# aliased identifiers, so there is less of a need for this now. This allows
|
281
|
-
# you to turn off symbol splitting, potentially avoiding problems if you
|
282
|
-
# have identifiers that use double underscores:
|
222
|
+
# It is only recommended to turn this on for backwards compatibility until
|
223
|
+
# such symbols have been converted to use newer Sequel APIs such as:
|
283
224
|
#
|
284
|
-
# Sequel.
|
225
|
+
# Sequel[:table][:column] # table.column
|
226
|
+
# Sequel[:column].as(:alias) # column AS alias
|
227
|
+
# Sequel[:table][:column].as(:alias) # table.column AS alias
|
285
228
|
#
|
286
|
-
#
|
229
|
+
# Sequel::Database instances do their own caching of literalized
|
287
230
|
# symbols, and changing this setting does not affect those caches. It is
|
288
231
|
# recommended that if you want to change this setting, you do so directly
|
289
232
|
# after requiring Sequel, before creating any Sequel::Database instances.
|
290
233
|
#
|
291
|
-
#
|
234
|
+
# Disabling symbol splitting will also disable the handling
|
292
235
|
# of double underscores in virtual row methods, causing such methods to
|
293
|
-
# yield regular identifers instead of qualified identifiers
|
294
|
-
# the code works when splitting symbols is both disabled and enabled, you
|
295
|
-
# can use Sequel::SQL::Identifier#[].
|
236
|
+
# yield regular identifers instead of qualified identifiers:
|
296
237
|
#
|
297
238
|
# # Sequel.split_symbols = true
|
298
239
|
# Sequel.expr{table__column} # table.column
|
@@ -356,6 +297,8 @@ module Sequel
|
|
356
297
|
# Unless in single threaded mode, protects access to any mutable
|
357
298
|
# global data structure in Sequel.
|
358
299
|
# Uses a non-reentrant mutex, so calling code should be careful.
|
300
|
+
# In general, this should only be used around the minimal possible code
|
301
|
+
# such as Hash#[], Hash#[]=, Hash#delete, Array#<<, and Array#delete.
|
359
302
|
def self.synchronize(&block)
|
360
303
|
@single_threaded ? yield : @data_mutex.synchronize(&block)
|
361
304
|
end
|
@@ -433,18 +376,23 @@ module Sequel
|
|
433
376
|
|
434
377
|
# Method that adds a database adapter class method to Sequel that calls
|
435
378
|
# Sequel.adapter_method.
|
436
|
-
#
|
437
|
-
# Do not call this method with untrusted input, as that can result in
|
438
|
-
# arbitrary code execution.
|
439
379
|
def self.def_adapter_method(*adapters) # :nodoc:
|
440
380
|
adapters.each do |adapter|
|
441
|
-
|
381
|
+
define_singleton_method(adapter){|*args, &block| adapter_method(adapter, *args, &block)}
|
442
382
|
end
|
443
383
|
end
|
444
384
|
|
445
385
|
private_class_method :adapter_method, :def_adapter_method
|
446
386
|
|
447
|
-
|
387
|
+
require_relative "deprecated"
|
388
|
+
require_relative "sql"
|
389
|
+
require_relative "connection_pool"
|
390
|
+
require_relative "exceptions"
|
391
|
+
require_relative "dataset"
|
392
|
+
require_relative "database"
|
393
|
+
require_relative "timezones"
|
394
|
+
require_relative "ast_transformer"
|
395
|
+
require_relative "version"
|
448
396
|
|
449
397
|
class << self
|
450
398
|
# Allow nicer syntax for creating Sequel expressions:
|
@@ -452,17 +400,10 @@ module Sequel
|
|
452
400
|
# Sequel[1] # => Sequel::SQL::NumericExpression: 1
|
453
401
|
# Sequel["a"] # => Sequel::SQL::StringExpression: 'a'
|
454
402
|
# Sequel[:a] # => Sequel::SQL::Identifier: "a"
|
455
|
-
# Sequel[:
|
403
|
+
# Sequel[a: 1] # => Sequel::SQL::BooleanExpression: ("a" = 1)
|
456
404
|
alias_method :[], :expr
|
457
405
|
end
|
458
406
|
|
459
407
|
# Add the database adapter class methods to Sequel via metaprogramming
|
460
408
|
def_adapter_method(*Database::ADAPTERS)
|
461
|
-
|
462
|
-
COLUMN_REF_RE1 = /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/.freeze
|
463
|
-
Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE1)
|
464
|
-
COLUMN_REF_RE2 = /\A((?:(?!___).)+)___(.+)\z/.freeze
|
465
|
-
Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE2)
|
466
|
-
COLUMN_REF_RE3 = /\A((?:(?!__).)+)__(.+)\z/.freeze
|
467
|
-
Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE3)
|
468
409
|
end
|