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/dataset/graph.rb
CHANGED
|
@@ -13,19 +13,15 @@ module Sequel
|
|
|
13
13
|
# unlike +set_graph_aliases+, which replaces the list (the equivalent
|
|
14
14
|
# of +select_append+ when graphing). See +set_graph_aliases+.
|
|
15
15
|
#
|
|
16
|
-
# DB[:table].add_graph_aliases(:
|
|
16
|
+
# DB[:table].add_graph_aliases(some_alias: [:table, :column])
|
|
17
17
|
# # SELECT ..., table.column AS some_alias
|
|
18
18
|
def add_graph_aliases(graph_aliases)
|
|
19
19
|
graph = opts[:graph]
|
|
20
|
-
unless (
|
|
20
|
+
unless (graph && (ga = graph[:column_aliases]))
|
|
21
21
|
raise Error, "cannot call add_graph_aliases on a dataset that has not been called with graph or set_graph_aliases"
|
|
22
22
|
end
|
|
23
23
|
columns, graph_aliases = graph_alias_columns(graph_aliases)
|
|
24
|
-
|
|
25
|
-
select_append(*columns).clone(:graph_aliases => Hash[ga].merge!(graph_aliases).freeze) # SEQUEL5: Remove
|
|
26
|
-
else
|
|
27
|
-
select_append(*columns).clone(:graph => Hash[graph].merge!(:column_aliases=>Hash[ga].merge!(graph_aliases).freeze).freeze)
|
|
28
|
-
end
|
|
24
|
+
select_append(*columns).clone(:graph => Hash[graph].merge!(:column_aliases=>Hash[ga].merge!(graph_aliases).freeze).freeze)
|
|
29
25
|
end
|
|
30
26
|
|
|
31
27
|
# Similar to Dataset#join_table, but uses unambiguous aliases for selected
|
|
@@ -64,7 +60,7 @@ module Sequel
|
|
|
64
60
|
case dataset
|
|
65
61
|
when Symbol
|
|
66
62
|
# let alias be the same as the table name (sans any optional schema)
|
|
67
|
-
# unless alias explicitly given in the symbol using ___ notation
|
|
63
|
+
# unless alias explicitly given in the symbol using ___ notation and symbol splitting is enabled
|
|
68
64
|
table_alias ||= split_symbol(table).compact.last
|
|
69
65
|
when Dataset
|
|
70
66
|
if dataset.simple_select_all?
|
|
@@ -118,8 +114,6 @@ module Sequel
|
|
|
118
114
|
|
|
119
115
|
# Whether to include the table in the result set
|
|
120
116
|
add_table = options[:select] == false ? false : true
|
|
121
|
-
# Whether to add the columns to the list of column aliases
|
|
122
|
-
add_columns = !ds.opts.include?(:graph_aliases) # SEQUEL5: Remove graph_aliases support
|
|
123
117
|
|
|
124
118
|
if graph = opts[:graph]
|
|
125
119
|
graph = graph.dup
|
|
@@ -146,27 +140,25 @@ module Sequel
|
|
|
146
140
|
# All columns in the master table are never
|
|
147
141
|
# aliased, but are not included if set_graph_aliases
|
|
148
142
|
# has been used.
|
|
149
|
-
if
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
qualified_expression(sel, qualifier)
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
else
|
|
165
|
-
select = columns.map do |column|
|
|
166
|
-
column_aliases[column] = [master, column]
|
|
167
|
-
SQL::QualifiedIdentifier.new(qualifier, column)
|
|
143
|
+
if (select = @opts[:select]) && !select.empty? && !(select.length == 1 && (select.first.is_a?(SQL::ColumnAll)))
|
|
144
|
+
select = select.map do |sel|
|
|
145
|
+
raise Error, "can't figure out alias to use for graphing for #{sel.inspect}" unless column = _hash_key_symbol(sel)
|
|
146
|
+
column_aliases[column] = [master, column]
|
|
147
|
+
if from_selfed
|
|
148
|
+
# Initial dataset was wrapped in subselect, selected all
|
|
149
|
+
# columns in the subselect, qualified by the subselect alias.
|
|
150
|
+
Sequel.qualify(qualifier, Sequel.identifier(column))
|
|
151
|
+
else
|
|
152
|
+
# Initial dataset not wrapped in subslect, just make
|
|
153
|
+
# sure columns are qualified in some way.
|
|
154
|
+
qualified_expression(sel, qualifier)
|
|
168
155
|
end
|
|
169
156
|
end
|
|
157
|
+
else
|
|
158
|
+
select = columns.map do |column|
|
|
159
|
+
column_aliases[column] = [master, column]
|
|
160
|
+
SQL::QualifiedIdentifier.new(qualifier, column)
|
|
161
|
+
end
|
|
170
162
|
end
|
|
171
163
|
end
|
|
172
164
|
|
|
@@ -178,7 +170,7 @@ module Sequel
|
|
|
178
170
|
table_aliases[table_alias] = add_table ? dataset : nil
|
|
179
171
|
|
|
180
172
|
# Add the columns to the selection unless we are ignoring them
|
|
181
|
-
if add_table
|
|
173
|
+
if add_table
|
|
182
174
|
column_aliases = graph[:column_aliases]
|
|
183
175
|
ca_num = graph[:column_alias_num]
|
|
184
176
|
# Which columns to add to the result set
|
|
@@ -207,7 +199,7 @@ module Sequel
|
|
|
207
199
|
end
|
|
208
200
|
[:column_aliases, :table_aliases, :column_alias_num].each{|k| graph[k].freeze}
|
|
209
201
|
ds = ds.clone(:graph=>graph.freeze)
|
|
210
|
-
|
|
202
|
+
ds.select(*select)
|
|
211
203
|
end
|
|
212
204
|
|
|
213
205
|
# This allows you to manually specify the graph aliases to use
|
|
@@ -217,42 +209,41 @@ module Sequel
|
|
|
217
209
|
# graphed dataset, and must be used instead of +select+ whenever
|
|
218
210
|
# graphing is used.
|
|
219
211
|
#
|
|
220
|
-
# graph_aliases
|
|
221
|
-
#
|
|
222
|
-
#
|
|
223
|
-
#
|
|
224
|
-
#
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
#
|
|
228
|
-
#
|
|
229
|
-
#
|
|
212
|
+
# graph_aliases should be a hash with keys being symbols of
|
|
213
|
+
# column aliases, and values being either symbols or arrays with one to three elements.
|
|
214
|
+
# If the value is a symbol, it is assumed to be the same as a one element
|
|
215
|
+
# array containing that symbol.
|
|
216
|
+
# The first element of the array should be the table alias symbol.
|
|
217
|
+
# The second should be the actual column name symbol. If the array only
|
|
218
|
+
# has a single element the column name symbol will be assumed to be the
|
|
219
|
+
# same as the corresponding hash key. If the array
|
|
220
|
+
# has a third element, it is used as the value returned, instead of
|
|
221
|
+
# table_alias.column_name.
|
|
230
222
|
#
|
|
231
|
-
# DB[:artists].graph(:albums, :artist_id
|
|
232
|
-
# set_graph_aliases(:
|
|
233
|
-
# :
|
|
234
|
-
# :
|
|
223
|
+
# DB[:artists].graph(:albums, :artist_id: :id).
|
|
224
|
+
# set_graph_aliases(name: :artists,
|
|
225
|
+
# album_name: [:albums, :name],
|
|
226
|
+
# forty_two: [:albums, :fourtwo, 42]).first
|
|
235
227
|
# # SELECT artists.name, albums.name AS album_name, 42 AS forty_two ...
|
|
236
228
|
def set_graph_aliases(graph_aliases)
|
|
237
229
|
columns, graph_aliases = graph_alias_columns(graph_aliases)
|
|
238
230
|
if graph = opts[:graph]
|
|
239
231
|
select(*columns).clone(:graph => Hash[graph].merge!(:column_aliases=>graph_aliases.freeze).freeze)
|
|
240
232
|
else
|
|
241
|
-
|
|
242
|
-
select(*columns).clone(:graph_aliases=>graph_aliases.freeze) # SEQUEL5: Remove
|
|
233
|
+
raise Error, "cannot call #set_graph_aliases on an ungraphed dataset"
|
|
243
234
|
end
|
|
244
235
|
end
|
|
245
236
|
|
|
246
237
|
# Remove the splitting of results into subhashes, and all metadata
|
|
247
238
|
# related to the current graph (if any).
|
|
248
239
|
def ungraphed
|
|
249
|
-
clone(:graph=>nil
|
|
240
|
+
clone(:graph=>nil)
|
|
250
241
|
end
|
|
251
242
|
|
|
252
243
|
private
|
|
253
244
|
|
|
254
245
|
# Wrap the alias symbol in an SQL::Identifier if the identifier on which is based
|
|
255
|
-
# is an SQL::Identifier. This works around cases where the alias symbol contains
|
|
246
|
+
# is an SQL::Identifier. This works around cases where symbol splitting is enabled and the alias symbol contains
|
|
256
247
|
# double embedded underscores which would be considered an implicit qualified identifier
|
|
257
248
|
# if not wrapped in an SQL::Identifier.
|
|
258
249
|
def qualifier_from_alias_symbol(aliaz, identifier)
|
data/lib/sequel/dataset/misc.rb
CHANGED
|
@@ -7,15 +7,6 @@ module Sequel
|
|
|
7
7
|
# These methods don't fit cleanly into another section.
|
|
8
8
|
# ---------------------
|
|
9
9
|
|
|
10
|
-
NOTIMPL_MSG = "This method must be overridden in Sequel adapters".freeze
|
|
11
|
-
Sequel::Deprecation.deprecate_constant(self, :NOTIMPL_MSG)
|
|
12
|
-
ARRAY_ACCESS_ERROR_MSG = 'You cannot call Dataset#[] with an integer or with no arguments.'.freeze
|
|
13
|
-
Sequel::Deprecation.deprecate_constant(self, :ARRAY_ACCESS_ERROR_MSG)
|
|
14
|
-
ARG_BLOCK_ERROR_MSG = 'Must use either an argument or a block, not both'.freeze
|
|
15
|
-
Sequel::Deprecation.deprecate_constant(self, :ARG_BLOCK_ERROR_MSG)
|
|
16
|
-
IMPORT_ERROR_MSG = 'Using Sequel::Dataset#import an empty column array is not allowed'.freeze
|
|
17
|
-
Sequel::Deprecation.deprecate_constant(self, :IMPORT_ERROR_MSG)
|
|
18
|
-
|
|
19
10
|
# The database related to this dataset. This is the Database instance that
|
|
20
11
|
# will execute all of this dataset's queries.
|
|
21
12
|
attr_reader :db
|
|
@@ -33,9 +24,9 @@ module Sequel
|
|
|
33
24
|
# the Database#dataset method return an instance of that subclass.
|
|
34
25
|
def initialize(db)
|
|
35
26
|
@db = db
|
|
36
|
-
@opts =
|
|
27
|
+
@opts = OPTS
|
|
37
28
|
@cache = {}
|
|
38
|
-
|
|
29
|
+
freeze
|
|
39
30
|
end
|
|
40
31
|
|
|
41
32
|
# Define a hash value such that datasets with the same class, DB, and opts
|
|
@@ -55,30 +46,16 @@ module Sequel
|
|
|
55
46
|
self == o
|
|
56
47
|
end
|
|
57
48
|
|
|
58
|
-
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# end
|
|
62
|
-
if TRUE_FREEZE
|
|
63
|
-
# Similar to #clone, but returns an unfrozen clone if the receiver is frozen.
|
|
64
|
-
def dup
|
|
65
|
-
_clone(:freeze=>false)
|
|
66
|
-
end
|
|
67
|
-
else
|
|
68
|
-
# :nocov:
|
|
69
|
-
def dup
|
|
70
|
-
c = clone
|
|
71
|
-
c.instance_variable_set(:@opts, Hash[c.opts])
|
|
72
|
-
c
|
|
73
|
-
end
|
|
74
|
-
# :nocov:
|
|
49
|
+
# Return self, as datasets are always frozen.
|
|
50
|
+
def dup
|
|
51
|
+
self
|
|
75
52
|
end
|
|
76
53
|
|
|
77
54
|
# Yield a dataset for each server in the connection pool that is tied to that server.
|
|
78
55
|
# Intended for use in sharded environments where all servers need to be modified
|
|
79
56
|
# with the same data:
|
|
80
57
|
#
|
|
81
|
-
# DB[:configs].where(:
|
|
58
|
+
# DB[:configs].where(key: 'setting').each_server{|ds| ds.update(value: 'new_value')}
|
|
82
59
|
def each_server
|
|
83
60
|
db.servers.each{|s| yield server(s)}
|
|
84
61
|
end
|
|
@@ -101,12 +78,11 @@ module Sequel
|
|
|
101
78
|
else
|
|
102
79
|
# :nocov:
|
|
103
80
|
def freeze # :nodoc:
|
|
104
|
-
@opts.freeze # SEQUEL5: remove
|
|
105
81
|
self
|
|
106
82
|
end
|
|
107
83
|
|
|
108
84
|
def frozen? # :nodoc:
|
|
109
|
-
|
|
85
|
+
true
|
|
110
86
|
end
|
|
111
87
|
# :nocov:
|
|
112
88
|
end
|
|
@@ -122,7 +98,7 @@ module Sequel
|
|
|
122
98
|
# DB[:table].first_source_alias
|
|
123
99
|
# # => :table
|
|
124
100
|
#
|
|
125
|
-
# DB[:
|
|
101
|
+
# DB[Sequel[:table].as(:t)].first_source_alias
|
|
126
102
|
# # => :t
|
|
127
103
|
def first_source_alias
|
|
128
104
|
source = @opts[:from]
|
|
@@ -147,7 +123,7 @@ module Sequel
|
|
|
147
123
|
# DB[:table].first_source_table
|
|
148
124
|
# # => :table
|
|
149
125
|
#
|
|
150
|
-
# DB[:
|
|
126
|
+
# DB[Sequel[:table].as(:t)].first_source_table
|
|
151
127
|
# # => :table
|
|
152
128
|
def first_source_table
|
|
153
129
|
source = @opts[:from]
|
|
@@ -215,7 +191,7 @@ module Sequel
|
|
|
215
191
|
# SQL identifier that represents the unqualified column for the given value.
|
|
216
192
|
# The given value should be a Symbol, SQL::Identifier, SQL::QualifiedIdentifier,
|
|
217
193
|
# or SQL::AliasedExpression containing one of those. In other cases, this
|
|
218
|
-
# returns nil
|
|
194
|
+
# returns nil.
|
|
219
195
|
def unqualified_column_for(v)
|
|
220
196
|
unless v.is_a?(String)
|
|
221
197
|
_unqualified_column_for(v)
|
|
@@ -299,12 +275,11 @@ module Sequel
|
|
|
299
275
|
private
|
|
300
276
|
|
|
301
277
|
# Check the cache for the given key, returning the value.
|
|
302
|
-
# Otherwise, yield to get the dataset
|
|
303
|
-
# is frozen, cache the dataset under the given key.
|
|
278
|
+
# Otherwise, yield to get the dataset and cache the dataset under the given key.
|
|
304
279
|
def cached_dataset(key)
|
|
305
280
|
unless ds = cache_get(key)
|
|
306
281
|
ds = yield
|
|
307
|
-
cache_set(key, ds)
|
|
282
|
+
cache_set(key, ds)
|
|
308
283
|
end
|
|
309
284
|
|
|
310
285
|
ds
|
|
@@ -15,7 +15,7 @@ module Sequel
|
|
|
15
15
|
# Example:
|
|
16
16
|
#
|
|
17
17
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
|
18
|
-
# ds.where(:
|
|
18
|
+
# ds.where(id: pl.arg).exclude(name: pl.arg).limit(1)
|
|
19
19
|
# end
|
|
20
20
|
# loader.first(1, "foo")
|
|
21
21
|
# # SELECT * FROM items WHERE ((id = 1) AND (name != 'foo')) LIMIT 1
|
|
@@ -27,7 +27,7 @@ module Sequel
|
|
|
27
27
|
# Note that this method does not handle all possible cases. For example:
|
|
28
28
|
#
|
|
29
29
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
|
30
|
-
# ds.join(pl.arg, :
|
|
30
|
+
# ds.join(pl.arg, item_id: :id)
|
|
31
31
|
# end
|
|
32
32
|
# loader.all(:cart_items)
|
|
33
33
|
#
|
|
@@ -35,7 +35,7 @@ module Sequel
|
|
|
35
35
|
# best to add a table alias when joining:
|
|
36
36
|
#
|
|
37
37
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
|
38
|
-
# ds.join(Sequel.as(pl.arg, :t), :
|
|
38
|
+
# ds.join(Sequel.as(pl.arg, :t), item_id: :id)
|
|
39
39
|
# end
|
|
40
40
|
# loader.all(:cart_items)
|
|
41
41
|
#
|
|
@@ -107,7 +107,7 @@ module Sequel
|
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
# Record the offset at which the argument is used in the SQL query, and any
|
|
110
|
-
# transforming
|
|
110
|
+
# transforming block.
|
|
111
111
|
def use(sql, arg, transformer)
|
|
112
112
|
@args << [sql, sql.length, arg, transformer]
|
|
113
113
|
end
|
|
@@ -37,23 +37,10 @@ module Sequel
|
|
|
37
37
|
end
|
|
38
38
|
private_class_method :prepared_statements_module
|
|
39
39
|
|
|
40
|
-
def self.def_deprecated_opts_setter(mod, *meths)
|
|
41
|
-
meths.each do |meth|
|
|
42
|
-
mod.send(:define_method, :"#{meth}=") do |v|
|
|
43
|
-
# :nocov:
|
|
44
|
-
Sequel::Deprecation.deprecate("Dataset##{meth}=", "The API has changed, and this value should now be passed in as an option via Dataset#clone")
|
|
45
|
-
@opts[meth] = v
|
|
46
|
-
# :nocov:
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
40
|
# Default implementation of the argument mapper to allow
|
|
52
41
|
# native database support for bind variables and prepared
|
|
53
42
|
# statements (as opposed to the emulated ones used by default).
|
|
54
43
|
module ArgumentMapper
|
|
55
|
-
Dataset.def_deprecated_opts_setter(self, :prepared_statement_name, :bind_arguments)
|
|
56
|
-
|
|
57
44
|
# The name of the prepared statement, if any.
|
|
58
45
|
def prepared_statement_name
|
|
59
46
|
@opts[:prepared_statement_name]
|
|
@@ -89,11 +76,6 @@ module Sequel
|
|
|
89
76
|
# into the query, which works on all databases, as it is no different
|
|
90
77
|
# from using the dataset without bind variables.
|
|
91
78
|
module PreparedStatementMethods
|
|
92
|
-
Dataset.def_deprecated_opts_setter(self, :log_sql, :prepared_type, :prepared_args, :orig_dataset, :prepared_modify_values)
|
|
93
|
-
|
|
94
|
-
PLACEHOLDER_RE = /\A\$(.*)\z/
|
|
95
|
-
Sequel::Deprecation.deprecate_constant(self, :PLACEHOLDER_RE)
|
|
96
|
-
|
|
97
79
|
# Whether to log the full SQL query. By default, just the prepared statement
|
|
98
80
|
# name is generally logged on adapters that support native prepared statements.
|
|
99
81
|
def log_sql
|
|
@@ -141,6 +123,12 @@ module Sequel
|
|
|
141
123
|
orig_dataset.columns
|
|
142
124
|
end
|
|
143
125
|
|
|
126
|
+
# Disallow use of delayed evaluations in prepared statements.
|
|
127
|
+
def delayed_evaluation_sql_append(sql, delay)
|
|
128
|
+
raise Error, "delayed evaluations cannot be used in prepared statements" if @opts[:no_delayed_evaluations]
|
|
129
|
+
super
|
|
130
|
+
end
|
|
131
|
+
|
|
144
132
|
# Returns the SQL for the prepared statement, depending on
|
|
145
133
|
# the type of the statement and the prepared_modify_values.
|
|
146
134
|
def prepared_sql
|
|
@@ -188,13 +176,10 @@ module Sequel
|
|
|
188
176
|
|
|
189
177
|
protected
|
|
190
178
|
|
|
191
|
-
# Run the method based on the type of prepared statement
|
|
192
|
-
# :select running #all to get all of the rows, and the other
|
|
193
|
-
# types running the method with the same name as the type.
|
|
179
|
+
# Run the method based on the type of prepared statement.
|
|
194
180
|
def run(&block)
|
|
195
181
|
case prepared_type
|
|
196
182
|
when :select, :all
|
|
197
|
-
# Most common scenario, so listed first
|
|
198
183
|
all(&block)
|
|
199
184
|
when :each
|
|
200
185
|
each(&block)
|
|
@@ -208,18 +193,17 @@ module Sequel
|
|
|
208
193
|
elsif prepared_type == :delete
|
|
209
194
|
delete
|
|
210
195
|
else
|
|
211
|
-
|
|
196
|
+
public_send(prepared_type, *prepared_modify_values)
|
|
212
197
|
end
|
|
213
198
|
when :insert_pk
|
|
214
199
|
fetch_rows(prepared_sql){|r| return r.values.first}
|
|
215
200
|
when Array
|
|
216
201
|
case prepared_type[0]
|
|
217
202
|
when :map, :as_hash, :to_hash, :to_hash_groups
|
|
218
|
-
|
|
203
|
+
public_send(*prepared_type, &block)
|
|
219
204
|
end
|
|
220
205
|
else
|
|
221
|
-
|
|
222
|
-
all(&block)
|
|
206
|
+
raise Error, "unsupported prepared statement type used: #{prepared_type.inspect}"
|
|
223
207
|
end
|
|
224
208
|
end
|
|
225
209
|
|
|
@@ -235,8 +219,7 @@ module Sequel
|
|
|
235
219
|
@opts[:bind_vars].has_key?(k)
|
|
236
220
|
end
|
|
237
221
|
|
|
238
|
-
# The symbol cache should always be skipped, since placeholders
|
|
239
|
-
# are symbols.
|
|
222
|
+
# The symbol cache should always be skipped, since placeholders are symbols.
|
|
240
223
|
def skip_symbol_cache?
|
|
241
224
|
true
|
|
242
225
|
end
|
|
@@ -286,7 +269,7 @@ module Sequel
|
|
|
286
269
|
# already been set for this dataset, they are updated with the contents
|
|
287
270
|
# of bind_vars.
|
|
288
271
|
#
|
|
289
|
-
# DB[:table].where(:id
|
|
272
|
+
# DB[:table].where(id: :$id).bind(id: 1).call(:first)
|
|
290
273
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
|
291
274
|
# # => {:id=>1}
|
|
292
275
|
def bind(bind_vars={})
|
|
@@ -307,7 +290,7 @@ module Sequel
|
|
|
307
290
|
# run the sql with the bind variables specified in the hash. +values+ is a hash passed to
|
|
308
291
|
# insert or update (if one of those types is used), which may contain placeholders.
|
|
309
292
|
#
|
|
310
|
-
# DB[:table].where(:id
|
|
293
|
+
# DB[:table].where(id: :$id).call(:first, id: 1)
|
|
311
294
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
|
312
295
|
# # => {:id=>1}
|
|
313
296
|
def call(type, bind_variables={}, *values, &block)
|
|
@@ -315,36 +298,25 @@ module Sequel
|
|
|
315
298
|
end
|
|
316
299
|
|
|
317
300
|
# Prepare an SQL statement for later execution. Takes a type similar to #call,
|
|
318
|
-
# and the +name+ symbol of the prepared statement.
|
|
319
|
-
# it should always be provided as a symbol for the name of the prepared statement,
|
|
320
|
-
# as some databases require that prepared statements have names.
|
|
301
|
+
# and the +name+ symbol of the prepared statement.
|
|
321
302
|
#
|
|
322
303
|
# This returns a clone of the dataset extended with PreparedStatementMethods,
|
|
323
304
|
# which you can +call+ with the hash of bind variables to use.
|
|
324
305
|
# The prepared statement is also stored in
|
|
325
|
-
# the associated
|
|
306
|
+
# the associated Database, where it can be called by name.
|
|
326
307
|
# The following usage is identical:
|
|
327
308
|
#
|
|
328
|
-
# ps = DB[:table].where(:name
|
|
309
|
+
# ps = DB[:table].where(name: :$name).prepare(:first, :select_by_name)
|
|
329
310
|
#
|
|
330
|
-
# ps.call(:
|
|
311
|
+
# ps.call(name: 'Blah')
|
|
331
312
|
# # SELECT * FROM table WHERE name = ? -- ('Blah')
|
|
332
313
|
# # => {:id=>1, :name=>'Blah'}
|
|
333
314
|
#
|
|
334
|
-
# DB.call(:select_by_name, :
|
|
335
|
-
def prepare(type, name
|
|
336
|
-
ps = to_prepared_statement(type, values, :name=>name, :extend=>prepared_statement_modules)
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
ps.prepared_sql
|
|
340
|
-
db.set_prepared_statement(name, ps)
|
|
341
|
-
else
|
|
342
|
-
# :nocov:
|
|
343
|
-
# SEQUEL5: Add coverage
|
|
344
|
-
Sequel::Deprecation.deprecate("Dataset#prepare will change to requiring a name argument in Sequel 5, please update your code") unless name
|
|
345
|
-
# :nocov:
|
|
346
|
-
end
|
|
347
|
-
|
|
315
|
+
# DB.call(:select_by_name, name: 'Blah') # Same thing
|
|
316
|
+
def prepare(type, name, *values)
|
|
317
|
+
ps = to_prepared_statement(type, values, :name=>name, :extend=>prepared_statement_modules, :no_delayed_evaluations=>true)
|
|
318
|
+
ps.prepared_sql
|
|
319
|
+
db.set_prepared_statement(name, ps)
|
|
348
320
|
ps
|
|
349
321
|
end
|
|
350
322
|
|
|
@@ -357,7 +329,7 @@ module Sequel
|
|
|
357
329
|
mods += [PreparedStatementMethods]
|
|
358
330
|
|
|
359
331
|
bind.
|
|
360
|
-
clone(:prepared_statement_name=>opts[:name], :prepared_type=>type, :prepared_modify_values=>values, :orig_dataset=>self, :no_cache_sql=>true, :prepared_args=>@opts[:prepared_args]||[]).
|
|
332
|
+
clone(:prepared_statement_name=>opts[:name], :prepared_type=>type, :prepared_modify_values=>values, :orig_dataset=>self, :no_cache_sql=>true, :prepared_args=>@opts[:prepared_args]||[], :no_delayed_evaluations=>opts[:no_delayed_evaluations]).
|
|
361
333
|
with_extend(*mods)
|
|
362
334
|
end
|
|
363
335
|
|