sequel 4.49.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
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
|
|
@@ -8,35 +8,13 @@ module Sequel
|
|
|
8
8
|
# ---------------------
|
|
9
9
|
|
|
10
10
|
# Array of supported database adapters
|
|
11
|
-
ADAPTERS = %w'ado amalgalite
|
|
12
|
-
# SEQUEL5: Remove cubrid do swift
|
|
13
|
-
|
|
14
|
-
def self.single_threaded
|
|
15
|
-
Sequel::Deprecation.deprecate("Sequel::Database.single_threaded", "Use Sequel.single_threaded instead")
|
|
16
|
-
Sequel.single_threaded
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.single_threaded=(v)
|
|
20
|
-
Sequel::Deprecation.deprecate("Sequel::Database.single_threaded=", "Use Sequel.single_threaded= instead")
|
|
21
|
-
Sequel.single_threaded = v
|
|
22
|
-
end
|
|
11
|
+
ADAPTERS = %w'ado amalgalite ibmdb jdbc mock mysql mysql2 odbc oracle postgres sqlanywhere sqlite tinytds'.map(&:to_sym)
|
|
23
12
|
|
|
24
13
|
# The Database subclass for the given adapter scheme.
|
|
25
14
|
# Raises Sequel::AdapterNotFound if the adapter
|
|
26
15
|
# could not be loaded.
|
|
27
16
|
def self.adapter_class(scheme)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if scheme.to_s.include?('-')
|
|
31
|
-
# :nocov:
|
|
32
|
-
Sequel::Deprecation.deprecate("Automatically converting '-' to '_' in adapter schemes", "Use '_' instead of '-' in the adapter scheme")
|
|
33
|
-
# :nocov:
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
scheme = scheme.to_s.gsub('-', '_').to_sym # SEQUEL5: Remove
|
|
37
|
-
# scheme = scheme.to_sym # SEQUEL5
|
|
38
|
-
|
|
39
|
-
load_adapter(scheme)
|
|
17
|
+
scheme.is_a?(Class) ? scheme : load_adapter(scheme.to_sym)
|
|
40
18
|
end
|
|
41
19
|
|
|
42
20
|
# Returns the scheme symbol for the Database class.
|
|
@@ -48,9 +26,8 @@ module Sequel
|
|
|
48
26
|
def self.connect(conn_string, opts = OPTS)
|
|
49
27
|
case conn_string
|
|
50
28
|
when String
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
c = adapter_class(match[1].to_sym)
|
|
29
|
+
if conn_string.start_with?('jdbc:')
|
|
30
|
+
c = adapter_class(:jdbc)
|
|
54
31
|
opts = opts.merge(:orig_opts=>opts.dup)
|
|
55
32
|
opts = {:uri=>conn_string}.merge!(opts)
|
|
56
33
|
else
|
|
@@ -69,16 +46,16 @@ module Sequel
|
|
|
69
46
|
else
|
|
70
47
|
raise Error, "Sequel::Database.connect takes either a Hash or a String, given: #{conn_string.inspect}"
|
|
71
48
|
end
|
|
72
|
-
|
|
49
|
+
|
|
73
50
|
opts = opts.inject({}) do |m, (k,v)|
|
|
74
51
|
k = :user if k.to_s == 'username'
|
|
75
52
|
m[k.to_sym] = v
|
|
76
53
|
m
|
|
77
54
|
end
|
|
55
|
+
|
|
78
56
|
begin
|
|
79
57
|
db = c.new(opts)
|
|
80
|
-
|
|
81
|
-
db.test_connection if opts[:test] && db.send(:typecast_value_boolean, opts[:test])
|
|
58
|
+
db.test_connection if db.send(:typecast_value_boolean, opts.fetch(:test, true))
|
|
82
59
|
if block_given?
|
|
83
60
|
return yield(db)
|
|
84
61
|
end
|
|
@@ -155,7 +132,6 @@ module Sequel
|
|
|
155
132
|
# end
|
|
156
133
|
#
|
|
157
134
|
# module DatabaseMethods
|
|
158
|
-
# extend Sequel::Database::ResetIdentifierMangling
|
|
159
135
|
# # ...
|
|
160
136
|
# end
|
|
161
137
|
#
|
|
@@ -181,27 +157,26 @@ module Sequel
|
|
|
181
157
|
# +database_type+ (for native adapters), in others (i.e. adapters with
|
|
182
158
|
# subadapters), it will be different.
|
|
183
159
|
#
|
|
184
|
-
# Sequel.connect('jdbc:postgres://...').adapter_scheme
|
|
160
|
+
# Sequel.connect('jdbc:postgres://...').adapter_scheme
|
|
161
|
+
# # => :jdbc
|
|
185
162
|
def adapter_scheme
|
|
186
163
|
self.class.adapter_scheme
|
|
187
164
|
end
|
|
188
165
|
|
|
189
166
|
# Dynamically add new servers or modify server options at runtime. Also adds new
|
|
190
|
-
# servers to the connection pool.
|
|
191
|
-
# configurations where it is useful to add new server hosts at runtime.
|
|
167
|
+
# servers to the connection pool. Only usable when using a sharded connection pool.
|
|
192
168
|
#
|
|
193
169
|
# servers argument should be a hash with server name symbol keys and hash or
|
|
194
170
|
# proc values. If a servers key is already in use, it's value is overridden
|
|
195
171
|
# with the value provided.
|
|
196
172
|
#
|
|
197
|
-
# DB.add_servers(:
|
|
173
|
+
# DB.add_servers(f: {host: "hash_host_f"})
|
|
198
174
|
def add_servers(servers)
|
|
199
|
-
unless
|
|
200
|
-
|
|
201
|
-
# raise Error, "cannot call Database#add_servers on a Database instance that does not use a sharded connection pool" # SEQUEL5
|
|
202
|
-
return
|
|
175
|
+
unless sharded?
|
|
176
|
+
raise Error, "cannot call Database#add_servers on a Database instance that does not use a sharded connection pool"
|
|
203
177
|
end
|
|
204
178
|
|
|
179
|
+
h = @opts[:servers]
|
|
205
180
|
Sequel.synchronize{h.merge!(servers)}
|
|
206
181
|
@pool.add_servers(servers.keys)
|
|
207
182
|
end
|
|
@@ -213,7 +188,8 @@ module Sequel
|
|
|
213
188
|
# type. Even better, you can tell that two Database objects that are using
|
|
214
189
|
# the same adapter are connecting to different database types.
|
|
215
190
|
#
|
|
216
|
-
# Sequel.connect('jdbc:postgres://...').database_type
|
|
191
|
+
# Sequel.connect('jdbc:postgres://...').database_type
|
|
192
|
+
# # => :postgres
|
|
217
193
|
def database_type
|
|
218
194
|
adapter_scheme
|
|
219
195
|
end
|
|
@@ -226,8 +202,8 @@ module Sequel
|
|
|
226
202
|
# Example:
|
|
227
203
|
#
|
|
228
204
|
# DB.disconnect # All servers
|
|
229
|
-
# DB.disconnect(:
|
|
230
|
-
# DB.disconnect(:
|
|
205
|
+
# DB.disconnect(server: :server1) # Single server
|
|
206
|
+
# DB.disconnect(server: [:server1, :server2]) # Multiple servers
|
|
231
207
|
def disconnect(opts = OPTS)
|
|
232
208
|
pool.disconnect(opts)
|
|
233
209
|
end
|
|
@@ -239,20 +215,8 @@ module Sequel
|
|
|
239
215
|
conn.close
|
|
240
216
|
end
|
|
241
217
|
|
|
242
|
-
#
|
|
243
|
-
#
|
|
244
|
-
# modifications (DDL queries) on each shard.
|
|
245
|
-
#
|
|
246
|
-
# DB.each_server{|db| db.create_table(:users){primary_key :id; String :name}}
|
|
247
|
-
def each_server(&block)
|
|
248
|
-
Sequel::Deprecation.deprecate("Database#each_server", "Switching to using Dataset#servers and Database#with_server from the server_block extension: \"DB.servers.each{|s| DB.with_server(s){}}\"")
|
|
249
|
-
raise(Error, "Database#each_server must be passed a block") unless block
|
|
250
|
-
servers.each{|s| self.class.connect(server_opts(s), &block)}
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
# Dynamically remove existing servers from the connection pool. Intended for
|
|
254
|
-
# use with master/slave or shard configurations where it is useful to remove
|
|
255
|
-
# existing server hosts at runtime.
|
|
218
|
+
# Dynamically remove existing servers from the connection pool. Only usable
|
|
219
|
+
# when using a sharded connection pool
|
|
256
220
|
#
|
|
257
221
|
# servers should be symbols or arrays of symbols. If a nonexistent server
|
|
258
222
|
# is specified, it is ignored. If no servers have been specified for
|
|
@@ -261,12 +225,11 @@ module Sequel
|
|
|
261
225
|
#
|
|
262
226
|
# DB.remove_servers(:f1, :f2)
|
|
263
227
|
def remove_servers(*servers)
|
|
264
|
-
unless
|
|
265
|
-
|
|
266
|
-
# raise Error, "cannot call Database#remove_servers on a Database instance that does not use a sharded connection pool" # SEQUEL5
|
|
267
|
-
return
|
|
228
|
+
unless sharded?
|
|
229
|
+
raise Error, "cannot call Database#remove_servers on a Database instance that does not use a sharded connection pool"
|
|
268
230
|
end
|
|
269
231
|
|
|
232
|
+
h = @opts[:servers]
|
|
270
233
|
servers.flatten.each{|s| Sequel.synchronize{h.delete(s)}}
|
|
271
234
|
@pool.remove_servers(servers)
|
|
272
235
|
end
|
|
@@ -53,18 +53,15 @@ module Sequel
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
# Returns a new dataset with the +from+ method invoked. If a block is given,
|
|
56
|
-
# it
|
|
56
|
+
# it acts as a virtual row block
|
|
57
57
|
#
|
|
58
58
|
# DB.from(:items) # SELECT * FROM items
|
|
59
|
-
# DB.from
|
|
59
|
+
# DB.from{schema[:table]} # SELECT * FROM schema.table
|
|
60
60
|
def from(*args, &block)
|
|
61
61
|
if block
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
# @default_dataset.from(*args, &block)
|
|
66
|
-
#elsif args.length == 1 && (table = args[0]).is_a?(Symbol)
|
|
67
|
-
# @default_dataset.send(:cached_dataset, :"_from_#{table}_ds"){@default_dataset.from(table)}
|
|
62
|
+
@default_dataset.from(*args, &block)
|
|
63
|
+
elsif args.length == 1 && (table = args[0]).is_a?(Symbol)
|
|
64
|
+
@default_dataset.send(:cached_dataset, :"_from_#{table}_ds"){@default_dataset.from(table)}
|
|
68
65
|
else
|
|
69
66
|
@default_dataset.from(*args)
|
|
70
67
|
end
|
|
@@ -73,7 +70,7 @@ module Sequel
|
|
|
73
70
|
# Returns a new dataset with the select method invoked.
|
|
74
71
|
#
|
|
75
72
|
# DB.select(1) # SELECT 1
|
|
76
|
-
# DB.select{server_version
|
|
73
|
+
# DB.select{server_version.function} # SELECT server_version()
|
|
77
74
|
# DB.select(:id).from(:items) # SELECT id FROM items
|
|
78
75
|
def select(*args, &block)
|
|
79
76
|
@default_dataset.select(*args, &block)
|
|
@@ -7,42 +7,6 @@ module Sequel
|
|
|
7
7
|
# This methods change the default behavior of this database's datasets.
|
|
8
8
|
# ---------------------
|
|
9
9
|
|
|
10
|
-
# The default class to use for datasets
|
|
11
|
-
DatasetClass = Sequel::Dataset
|
|
12
|
-
Sequel::Deprecation.deprecate_constant(self, :DatasetClass)
|
|
13
|
-
|
|
14
|
-
# SEQUEL5: Remove
|
|
15
|
-
@identifier_input_method = nil
|
|
16
|
-
@identifier_output_method = nil
|
|
17
|
-
@quote_identifiers = nil
|
|
18
|
-
class << self
|
|
19
|
-
# The identifier input method to use by default for all databases (default: adapter default)
|
|
20
|
-
attr_reader :identifier_input_method
|
|
21
|
-
|
|
22
|
-
# The identifier output method to use by default for all databases (default: adapter default)
|
|
23
|
-
attr_reader :identifier_output_method
|
|
24
|
-
|
|
25
|
-
# Whether to quote identifiers (columns and tables) by default for all databases (default: adapter default)
|
|
26
|
-
attr_reader :quote_identifiers
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Change the default identifier input method to use for all databases,
|
|
30
|
-
def self.identifier_input_method=(v)
|
|
31
|
-
Sequel::Deprecation.deprecate("Sequel.identifier_input_method= and Sequel::Database.identifier_input_method=", "Call Sequel::Database#identifier_input_method= instead")
|
|
32
|
-
@identifier_input_method = v.nil? ? false : v
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Change the default identifier output method to use for all databases,
|
|
36
|
-
def self.identifier_output_method=(v)
|
|
37
|
-
Sequel::Deprecation.deprecate("Sequel.identifier_output_method= and Sequel::Database.identifier_output_method=", "Call Sequel::Database#identifier_output_method= instead")
|
|
38
|
-
@identifier_output_method = v.nil? ? false : v
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def self.quote_identifiers=(v)
|
|
42
|
-
Sequel::Deprecation.deprecate("Sequel.quote_identifiers= and Sequel::Database.quote_identifiers=", "Call Sequel::Database#quote_identifiers= instead")
|
|
43
|
-
@quote_identifiers = v
|
|
44
|
-
end
|
|
45
|
-
|
|
46
10
|
# The class to use for creating datasets. Should respond to
|
|
47
11
|
# new with the Database argument as the first argument, and
|
|
48
12
|
# an optional options hash.
|
|
@@ -74,7 +38,7 @@ module Sequel
|
|
|
74
38
|
#
|
|
75
39
|
# Examples:
|
|
76
40
|
#
|
|
77
|
-
# #
|
|
41
|
+
# # Introspect columns for all of DB's datasets
|
|
78
42
|
# DB.extend_datasets(Sequel::ColumnsIntrospection)
|
|
79
43
|
#
|
|
80
44
|
# # Trace all SELECT queries by printing the SQL and the full backtrace
|
|
@@ -112,24 +76,16 @@ module Sequel
|
|
|
112
76
|
|
|
113
77
|
# The default dataset class to use for the database
|
|
114
78
|
def dataset_class_default
|
|
115
|
-
|
|
116
|
-
Sequel::Dataset
|
|
117
|
-
else
|
|
118
|
-
Sequel::Deprecation.deprecate("Using self.class.const_get(:DatasetClass) to get the default dataset class", "Modify the database adapter to implement Database#dataset_class_default")
|
|
119
|
-
self.class.const_get(:DatasetClass)
|
|
120
|
-
end
|
|
79
|
+
Sequel::Dataset
|
|
121
80
|
end
|
|
122
81
|
|
|
123
|
-
# Reset the default dataset used by most Database methods that
|
|
124
|
-
# create datasets. Usually done after changes to the identifier
|
|
125
|
-
# mangling methods.
|
|
82
|
+
# Reset the default dataset used by most Database methods that create datasets.
|
|
126
83
|
def reset_default_dataset
|
|
127
84
|
Sequel.synchronize{@symbol_literal_cache.clear}
|
|
128
85
|
@default_dataset = dataset
|
|
129
86
|
end
|
|
130
87
|
|
|
131
|
-
# Whether to quote identifiers by default for this database, true
|
|
132
|
-
# by default.
|
|
88
|
+
# Whether to quote identifiers by default for this database, true by default.
|
|
133
89
|
def quote_identifiers_default
|
|
134
90
|
true
|
|
135
91
|
end
|
|
@@ -8,7 +8,7 @@ module Sequel
|
|
|
8
8
|
# database supprots a given feature.
|
|
9
9
|
# ---------------------
|
|
10
10
|
|
|
11
|
-
# Whether the database uses a global namespace for the index. If
|
|
11
|
+
# Whether the database uses a global namespace for the index, true by default. If
|
|
12
12
|
# false, the indexes are going to be namespaced per table.
|
|
13
13
|
def global_index_namespace?
|
|
14
14
|
true
|
|
@@ -33,7 +33,7 @@ module Sequel
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# Whether the database supports DROP TABLE IF EXISTS syntax,
|
|
36
|
-
#
|
|
36
|
+
# false by default.
|
|
37
37
|
def supports_drop_table_if_exists?
|
|
38
38
|
supports_create_table_if_not_exists?
|
|
39
39
|
end
|
|
@@ -49,7 +49,8 @@ module Sequel
|
|
|
49
49
|
respond_to?(:indexes)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
# Whether the database supports partial indexes (indexes on a subset of a table)
|
|
52
|
+
# Whether the database supports partial indexes (indexes on a subset of a table),
|
|
53
|
+
# false by default.
|
|
53
54
|
def supports_partial_indexes?
|
|
54
55
|
false
|
|
55
56
|
end
|
|
@@ -66,7 +67,7 @@ module Sequel
|
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
# Whether the database and adapter support savepoints inside prepared transactions
|
|
69
|
-
# (two-phase commit),
|
|
70
|
+
# (two-phase commit), false by default.
|
|
70
71
|
def supports_savepoints_in_prepared_transactions?
|
|
71
72
|
supports_prepared_transactions? && supports_savepoints?
|
|
72
73
|
end
|
|
@@ -32,13 +32,6 @@ module Sequel
|
|
|
32
32
|
log_each(:info, args ? "#{message}; #{args.inspect}" : message)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
# Yield to the block, logging any errors at error level to all loggers,
|
|
36
|
-
# and all other queries with the duration at warn or info level.
|
|
37
|
-
def log_yield(sql, args=nil, &block)
|
|
38
|
-
Sequel::Deprecation.deprecate("Sequel::Database#log_yield", "Update the adapter to use Sequel::Database#log_connection_yield")
|
|
39
|
-
log_connection_yield(sql, nil, args, &block)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
35
|
# Yield to the block, logging any errors at error level to all loggers,
|
|
43
36
|
# and all other queries with the duration at warn or info level.
|
|
44
37
|
def log_connection_yield(sql, conn, args=nil)
|
|
@@ -73,7 +66,7 @@ module Sequel
|
|
|
73
66
|
# Log the given SQL and then execute it on the connection, used by
|
|
74
67
|
# the transaction code.
|
|
75
68
|
def log_connection_execute(conn, sql)
|
|
76
|
-
log_connection_yield(sql, conn){conn.
|
|
69
|
+
log_connection_yield(sql, conn){conn.public_send(connection_execute_method, sql)}
|
|
77
70
|
end
|
|
78
71
|
|
|
79
72
|
# Log message with message prefixed by duration at info level, or
|
|
@@ -85,7 +78,7 @@ module Sequel
|
|
|
85
78
|
# Log message at level (which should be :error, :warn, or :info)
|
|
86
79
|
# to all loggers.
|
|
87
80
|
def log_each(level, message)
|
|
88
|
-
@loggers.each{|logger| logger.
|
|
81
|
+
@loggers.each{|logger| logger.public_send(level, message)}
|
|
89
82
|
end
|
|
90
83
|
end
|
|
91
84
|
end
|