sequel 4.49.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -46,18 +46,18 @@ module Sequel
|
|
46
46
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]]
|
47
47
|
#
|
48
48
|
# # All albums by artists that are associated to any album that this artist is associated to
|
49
|
-
# Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id],
|
50
|
-
# [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]],
|
51
|
-
# :
|
49
|
+
# Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id],
|
50
|
+
# [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]],
|
51
|
+
# class: :Album
|
52
52
|
#
|
53
53
|
# # All tracks on albums by this artist (also could be a many_to_many)
|
54
|
-
# Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]],
|
55
|
-
# :
|
54
|
+
# Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]],
|
55
|
+
# right_primary_key: :album_id
|
56
56
|
#
|
57
57
|
# Often you don't want the current object to appear in the array of associated objects. This is easiest to handle via an :after_load hook:
|
58
58
|
#
|
59
59
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]],
|
60
|
-
# :
|
60
|
+
# after_load: lambda{|artist, associated_artists| associated_artists.delete(artist)}
|
61
61
|
#
|
62
62
|
# You can also handle it by adding a dataset block that excludes the current record (so it won't be retrieved at all), but
|
63
63
|
# that won't work when eagerly loading, which is why the :after_load proc is recommended instead.
|
@@ -65,7 +65,7 @@ module Sequel
|
|
65
65
|
# It's also common to not want duplicate records, in which case the :distinct option can be used:
|
66
66
|
#
|
67
67
|
# Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]],
|
68
|
-
# :
|
68
|
+
# distinct: true
|
69
69
|
#
|
70
70
|
# In addition to many_through_many, this plugin also adds one_through_many, for an association to a single object through multiple join tables.
|
71
71
|
# This is useful if there are unique constraints on the foreign keys in the join tables that reference back to the current table, or if you want
|
@@ -228,7 +228,10 @@ module Sequel
|
|
228
228
|
def def_many_through_many(opts)
|
229
229
|
one_through_many = opts[:type] == :one_through_many
|
230
230
|
opts[:read_only] = true
|
231
|
-
|
231
|
+
if opts[:uniq]
|
232
|
+
opts[:after_load] ||= []
|
233
|
+
opts[:after_load].unshift(:array_uniq!)
|
234
|
+
end
|
232
235
|
opts[:cartesian_product_number] ||= one_through_many ? 0 : 2
|
233
236
|
opts[:through] = opts[:through].map do |e|
|
234
237
|
case e
|
@@ -12,15 +12,15 @@ module Sequel
|
|
12
12
|
# end
|
13
13
|
# p1 = Person[1]
|
14
14
|
# p2 = Person[1]
|
15
|
-
# p1.update(:
|
16
|
-
# p2.update(:
|
15
|
+
# p1.update(name: 'Jim') # works
|
16
|
+
# p2.update(name: 'Bob') # raises Sequel::NoExistingObject
|
17
17
|
#
|
18
18
|
# In order for this plugin to work, you need to make sure that the database
|
19
19
|
# table has a column of timestamp or rowversion. The plugin uses a default
|
20
20
|
# name of timestamp for this columns, but you can override that using the
|
21
21
|
# :lock_column option:
|
22
22
|
#
|
23
|
-
# plugin :mssql_optimistic_locking, :
|
23
|
+
# plugin :mssql_optimistic_locking, lock_column: :column_name
|
24
24
|
#
|
25
25
|
# This plugin relies on the instance_filters plugin.
|
26
26
|
module MssqlOptimisticLocking
|
@@ -13,11 +13,11 @@ module Sequel
|
|
13
13
|
# The nested_attributes call defines a single method, <tt><i>association</i>_attributes=</tt>,
|
14
14
|
# (e.g. <tt>albums_attributes=</tt>). So if you have an Artist instance:
|
15
15
|
#
|
16
|
-
# a = Artist.new(:
|
16
|
+
# a = Artist.new(name: 'YJM')
|
17
17
|
#
|
18
18
|
# You can create new album instances related to this artist:
|
19
19
|
#
|
20
|
-
# a.albums_attributes = [{:
|
20
|
+
# a.albums_attributes = [{name: 'RF'}, {name: 'MO'}]
|
21
21
|
#
|
22
22
|
# Note that this doesn't send any queries to the database yet. That doesn't happen till
|
23
23
|
# you save the object:
|
@@ -33,7 +33,7 @@ module Sequel
|
|
33
33
|
# objects. You just need to make sure that the primary key field is filled in for the
|
34
34
|
# associated object:
|
35
35
|
#
|
36
|
-
# a.update(:albums_attributes => [{:
|
36
|
+
# a.update(:albums_attributes => [{id: 1, name: 'T'}])
|
37
37
|
#
|
38
38
|
# Since the primary key field is filled in, the plugin will update the album with id 1 instead
|
39
39
|
# of creating a new album.
|
@@ -41,15 +41,15 @@ module Sequel
|
|
41
41
|
# If you would like to delete the associated object instead of updating it, you add a _delete
|
42
42
|
# entry to the hash, and also pass the :destroy option when calling +nested_attributes+:
|
43
43
|
#
|
44
|
-
# Artist.nested_attributes :albums, :
|
45
|
-
# a.update(:albums_attributes => [{:
|
44
|
+
# Artist.nested_attributes :albums, destroy: true
|
45
|
+
# a.update(:albums_attributes => [{id: 1, _delete: true}])
|
46
46
|
#
|
47
47
|
# This will delete the related associated object from the database. If you want to leave the
|
48
48
|
# associated object in the database, but just remove it from the association, add a _remove
|
49
49
|
# entry in the hash, and also pass the :remove option when calling +nested_attributes+:
|
50
50
|
#
|
51
|
-
# Artist.nested_attributes :albums, :
|
52
|
-
# a.update(:albums_attributes => [{:
|
51
|
+
# Artist.nested_attributes :albums, remove: true
|
52
|
+
# a.update(:albums_attributes => [{id: 1, _remove: true}])
|
53
53
|
#
|
54
54
|
# The above example was for a one_to_many association, but the plugin also works similarly
|
55
55
|
# for other association types. For one_to_one and many_to_one associations, you need to
|
@@ -66,11 +66,11 @@ module Sequel
|
|
66
66
|
#
|
67
67
|
# Your web stack will probably parse that into a nested hash similar to:
|
68
68
|
#
|
69
|
-
# {
|
69
|
+
# {'artist'=>{'name'=>'Y', 'albums_attributes'=>{'0'=>{'name'=>'X'}, '1'=>{'id'=>'2', 'name'=>'Z'}}}}
|
70
70
|
#
|
71
71
|
# Then you can do:
|
72
72
|
#
|
73
|
-
# artist.update_fields(params[
|
73
|
+
# artist.update_fields(params['artist'], %w'name albums_artists')
|
74
74
|
#
|
75
75
|
# To save changes to the artist, create the first album and associate it to the artist,
|
76
76
|
# and update the other existing associated album.
|
@@ -81,15 +81,6 @@ module Sequel
|
|
81
81
|
end
|
82
82
|
|
83
83
|
module ClassMethods
|
84
|
-
def nested_attributes_module
|
85
|
-
Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module', 'There is no replacement')
|
86
|
-
@nested_attributes_module
|
87
|
-
end
|
88
|
-
def nested_attributes_module=(v)
|
89
|
-
Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module=', 'There is no replacement')
|
90
|
-
@nested_attributes_module = v
|
91
|
-
end
|
92
|
-
|
93
84
|
# Freeze nested_attributes_module when freezing model class.
|
94
85
|
def freeze
|
95
86
|
@nested_attributes_module.freeze if @nested_attributes_module
|
@@ -127,11 +118,7 @@ module Sequel
|
|
127
118
|
reflections = associations.map{|a| association_reflection(a) || raise(Error, "no association named #{a} for #{self}")}
|
128
119
|
reflections.each do |r|
|
129
120
|
r[:nested_attributes] = opts
|
130
|
-
r[:nested_attributes][:unmatched_pk] ||=
|
131
|
-
if opts.has_key?(:strict)
|
132
|
-
Sequel::Deprecation.deprecate("The nested_attributes :strict option", "Use the :unmatched_pk option instead")
|
133
|
-
end
|
134
|
-
opts.delete(:strict) == false ? :ignore : :raise)
|
121
|
+
r[:nested_attributes][:unmatched_pk] ||= :raise
|
135
122
|
r[:nested_attributes][:reject_if] ||= block
|
136
123
|
def_nested_attribute_method(r)
|
137
124
|
end
|
@@ -188,8 +175,8 @@ module Sequel
|
|
188
175
|
nested_attributes_set_attributes(meta, obj, attributes)
|
189
176
|
delay_validate_associated_object(reflection, obj)
|
190
177
|
if reflection.returns_array?
|
191
|
-
|
192
|
-
after_save_hook{
|
178
|
+
public_send(reflection[:name]) << obj
|
179
|
+
after_save_hook{public_send(reflection[:add_method], obj)}
|
193
180
|
else
|
194
181
|
associations[reflection[:name]] = obj
|
195
182
|
|
@@ -201,9 +188,9 @@ module Sequel
|
|
201
188
|
# Don't need to validate the object twice if :validate association option is not false
|
202
189
|
# and don't want to validate it at all if it is false.
|
203
190
|
if reflection[:type] == :many_to_one
|
204
|
-
before_save_hook{
|
191
|
+
before_save_hook{public_send(reflection[:setter_method], obj.save(:validate=>false))}
|
205
192
|
else
|
206
|
-
after_save_hook{
|
193
|
+
after_save_hook{public_send(reflection[:setter_method], obj)}
|
207
194
|
end
|
208
195
|
end
|
209
196
|
add_reciprocal_object(reflection, obj)
|
@@ -215,7 +202,7 @@ module Sequel
|
|
215
202
|
# If there is a limit on the nested attributes for this association,
|
216
203
|
# make sure the length of the attributes_list is not greater than the limit.
|
217
204
|
def nested_attributes_list_setter(meta, attributes_list)
|
218
|
-
attributes_list = attributes_list.
|
205
|
+
attributes_list = attributes_list.sort.map{|k,v| v} if attributes_list.is_a?(Hash)
|
219
206
|
if (limit = meta[:limit]) && attributes_list.length > limit
|
220
207
|
raise(Error, "number of nested attributes (#{attributes_list.length}) exceeds the limit (#{limit})")
|
221
208
|
end
|
@@ -231,9 +218,9 @@ module Sequel
|
|
231
218
|
if !opts[:destroy] || reflection.remove_before_destroy?
|
232
219
|
before_save_hook do
|
233
220
|
if reflection.returns_array?
|
234
|
-
|
221
|
+
public_send(reflection[:remove_method], obj)
|
235
222
|
else
|
236
|
-
|
223
|
+
public_send(reflection[:setter_method], nil)
|
237
224
|
end
|
238
225
|
end
|
239
226
|
end
|
@@ -277,7 +264,7 @@ module Sequel
|
|
277
264
|
str_keys = sym_keys.map(&:to_s)
|
278
265
|
if (pk = attributes.values_at(*sym_keys)).all? || (pk = attributes.values_at(*str_keys)).all?
|
279
266
|
pk = pk.map(&:to_s)
|
280
|
-
obj = Array(
|
267
|
+
obj = Array(public_send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
|
281
268
|
end
|
282
269
|
if obj
|
283
270
|
attributes = attributes.dup.delete_if{|k,v| str_keys.include? k.to_s}
|
@@ -11,11 +11,11 @@ module Sequel
|
|
11
11
|
# end
|
12
12
|
# p1 = Person[1]
|
13
13
|
# p2 = Person[1]
|
14
|
-
# p1.update(:
|
15
|
-
# p2.update(:
|
14
|
+
# p1.update(name: 'Jim') # works
|
15
|
+
# p2.update(name: 'Bob') # raises Sequel::Plugins::OptimisticLocking::Error
|
16
16
|
#
|
17
17
|
# In order for this plugin to work, you need to make sure that the database
|
18
|
-
# table has a lock_version column (or other column you name via the lock_column
|
18
|
+
# table has a +lock_version+ column (or other column you name via the lock_column
|
19
19
|
# class level accessor) that defaults to 0.
|
20
20
|
#
|
21
21
|
# This plugin relies on the instance_filters plugin.
|
@@ -328,7 +328,10 @@ module Sequel
|
|
328
328
|
opts[:key] = opts.default_key unless opts.has_key?(:key)
|
329
329
|
key = opts[:key]
|
330
330
|
key_column = opts[:key_column] ||= opts[:key]
|
331
|
-
|
331
|
+
if opts[:uniq]
|
332
|
+
opts[:after_load] ||= []
|
333
|
+
opts[:after_load].unshift(:array_uniq!)
|
334
|
+
end
|
332
335
|
opts[:dataset] ||= lambda do
|
333
336
|
opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([get_column_value(pk)], opts.array_type)))
|
334
337
|
end
|
@@ -408,7 +411,10 @@ module Sequel
|
|
408
411
|
key = opts[:key]
|
409
412
|
key_column = opts[:key_column] ||= key
|
410
413
|
opts[:eager_loader_key] = nil
|
411
|
-
|
414
|
+
if opts[:uniq]
|
415
|
+
opts[:after_load] ||= []
|
416
|
+
opts[:after_load].unshift(:array_uniq!)
|
417
|
+
end
|
412
418
|
opts[:dataset] ||= lambda do
|
413
419
|
opts.associated_dataset.where(opts.predicate_key=>get_column_value(key).to_a)
|
414
420
|
end
|
@@ -41,22 +41,13 @@ module Sequel
|
|
41
41
|
#
|
42
42
|
# Address.register_row_type
|
43
43
|
#
|
44
|
-
# Note that automatic conversion only works with the native postgres adapter.
|
45
|
-
# For other adapters that connect to PostgreSQL, you need to call the conversion
|
46
|
-
# proc manually.
|
47
|
-
#
|
48
44
|
# In addition to returning row-valued/composite types as instances of Sequel::Model,
|
49
45
|
# this also lets you use model instances in datasets when inserting, updating, and
|
50
46
|
# filtering:
|
51
47
|
#
|
52
|
-
# DB[:company].insert(:
|
53
|
-
# Address.load(:
|
48
|
+
# DB[:company].insert(name: 'MS', address:
|
49
|
+
# Address.load(street: '123 Foo St', city: 'Bar Town', zip: '12345'))
|
54
50
|
module PgRow
|
55
|
-
ROW = 'ROW'.freeze
|
56
|
-
Sequel::Deprecation.deprecate_constant(self, :ROW)
|
57
|
-
CAST = '::'.freeze
|
58
|
-
Sequel::Deprecation.deprecate_constant(self, :CAST)
|
59
|
-
|
60
51
|
# When loading the extension, make sure the database has the pg_row extension
|
61
52
|
# loaded, load the custom database extensions, and automatically register the
|
62
53
|
# row type if the model has a dataset.
|
@@ -3,13 +3,11 @@
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
5
|
# The prepared_statements plugin modifies the model to use prepared statements for
|
6
|
-
# instance level
|
7
|
-
# deletes, refreshes, and class level lookups by primary key, if it thinks that using
|
8
|
-
# a prepared statement will be faster in such cases.
|
6
|
+
# instance level inserts and updates.
|
9
7
|
#
|
10
8
|
# Note that this plugin is unsafe in some circumstances, as it can allow up to
|
11
9
|
# 2^N prepared statements to be created for each type of insert and update query, where
|
12
|
-
# N is the number of
|
10
|
+
# N is the number of columns in the table. It is recommended that you use the
|
13
11
|
# +prepared_statements_safe+ plugin in addition to this plugin to reduce the number
|
14
12
|
# of prepared statements that can be created, unless you tightly control how your
|
15
13
|
# model instances are saved.
|
@@ -32,12 +30,11 @@ module Sequel
|
|
32
30
|
|
33
31
|
# Setup the datastructure used to hold the prepared statements in the model.
|
34
32
|
def self.apply(model)
|
35
|
-
|
36
|
-
model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}.freeze)
|
33
|
+
model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze)
|
37
34
|
end
|
38
35
|
|
39
36
|
module ClassMethods
|
40
|
-
Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}
|
37
|
+
Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze})
|
41
38
|
|
42
39
|
private
|
43
40
|
|
@@ -48,7 +45,7 @@ module Sequel
|
|
48
45
|
meth = type == :insert_select ? :returning : :select
|
49
46
|
s = ds.opts[meth]
|
50
47
|
if f && f.length == 1 && !ds.opts[:join] && (!s || s.empty?)
|
51
|
-
ds = ds.
|
48
|
+
ds = ds.public_send(meth, *columns.map{|c| Sequel.identifier(c)})
|
52
49
|
end
|
53
50
|
|
54
51
|
prepare_statement(ds, type, vals)
|
@@ -62,13 +59,7 @@ module Sequel
|
|
62
59
|
|
63
60
|
# Return a sorted array of columns for use as a hash key.
|
64
61
|
def prepared_columns(cols)
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
# Return a prepared statement that can be used to delete a row from this model's dataset.
|
69
|
-
def prepared_delete
|
70
|
-
# SEQUEL5: Remove
|
71
|
-
cached_prepared_statement(:fixed, :delete){prepare_statement(filter(prepared_statement_key_array(primary_key)), :delete)}
|
62
|
+
cols.sort
|
72
63
|
end
|
73
64
|
|
74
65
|
# Return a prepared statement that can be used to insert a row using the given columns.
|
@@ -84,18 +75,6 @@ module Sequel
|
|
84
75
|
end
|
85
76
|
end
|
86
77
|
|
87
|
-
# Return a prepared statement that can be used to lookup a row solely based on the primary key.
|
88
|
-
def prepared_lookup
|
89
|
-
# SEQUEL5: Remove
|
90
|
-
cached_prepared_statement(:fixed, :lookup){prepare_explicit_statement(filter(prepared_statement_key_array(primary_key)), :first)}
|
91
|
-
end
|
92
|
-
|
93
|
-
# Return a prepared statement that can be used to refresh a row to get new column values after insertion.
|
94
|
-
def prepared_refresh
|
95
|
-
# SEQUEL5: Remove
|
96
|
-
cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).where(prepared_statement_key_array(primary_key)), :first)}
|
97
|
-
end
|
98
|
-
|
99
78
|
# Return an array of two element arrays with the column symbol as the first entry and the
|
100
79
|
# placeholder symbol as the second entry.
|
101
80
|
def prepared_statement_key_array(keys)
|
@@ -120,14 +99,7 @@ module Sequel
|
|
120
99
|
|
121
100
|
# Return a prepared statement that can be used to update row using the given columns.
|
122
101
|
def prepared_update(cols)
|
123
|
-
cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(
|
124
|
-
end
|
125
|
-
|
126
|
-
# Use a prepared statement to query the database for the row matching the given primary key.
|
127
|
-
def primary_key_lookup(pk)
|
128
|
-
return super unless use_prepared_statements_for_pk_lookup?
|
129
|
-
# SEQUEL5: Remove
|
130
|
-
prepared_lookup.call(primary_key_hash(pk))
|
102
|
+
cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(where(prepared_statement_key_array(primary_key)), :update, prepared_statement_key_hash(cols))}
|
131
103
|
end
|
132
104
|
|
133
105
|
# If a prepared statement has already been cached for the given type and subtype,
|
@@ -153,16 +125,6 @@ module Sequel
|
|
153
125
|
module InstanceMethods
|
154
126
|
private
|
155
127
|
|
156
|
-
# Use a prepared statement to delete the row.
|
157
|
-
def _delete_without_checking
|
158
|
-
# SEQUEL5: Remove
|
159
|
-
if use_prepared_statements_for?(:delete)
|
160
|
-
_set_prepared_statement_server(model.send(:prepared_delete)).call(pk_hash)
|
161
|
-
else
|
162
|
-
super
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
128
|
# Use a prepared statement to insert the values into the model's dataset.
|
167
129
|
def _insert_raw(ds)
|
168
130
|
if use_prepared_statements_for?(:insert)
|
@@ -184,16 +146,6 @@ module Sequel
|
|
184
146
|
end
|
185
147
|
end
|
186
148
|
|
187
|
-
# Use a prepared statement to refresh this model's column values.
|
188
|
-
def _refresh_get(ds)
|
189
|
-
# SEQUEL5: Remove
|
190
|
-
if use_prepared_statements_for?(:refresh)
|
191
|
-
_set_prepared_statement_server(model.send(:prepared_refresh)).call(pk_hash)
|
192
|
-
else
|
193
|
-
super
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
149
|
# Use a prepared statement to update this model's columns in the database.
|
198
150
|
def _update_without_checking(columns)
|
199
151
|
if use_prepared_statements_for?(:update)
|
@@ -213,7 +165,7 @@ module Sequel
|
|
213
165
|
end
|
214
166
|
|
215
167
|
# Whether prepared statements should be used for the given type of query
|
216
|
-
# (:insert, :insert_select, :
|
168
|
+
# (:insert, :insert_select, :update). True by default,
|
217
169
|
# can be overridden in other plugins to disallow prepared statements for
|
218
170
|
# specific types of queries.
|
219
171
|
def use_prepared_statements_for?(type)
|
@@ -225,16 +177,11 @@ module Sequel
|
|
225
177
|
case type
|
226
178
|
when :insert, :insert_select, :update
|
227
179
|
true
|
228
|
-
#
|
229
|
-
when :delete
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
# but not for most other database types if optimized SQL is used.
|
234
|
-
db_type = model.db.database_type
|
235
|
-
db_type == :oracle || db_type == :db2
|
236
|
-
when :refresh
|
237
|
-
!model.fast_pk_lookup_sql
|
180
|
+
# :nocov:
|
181
|
+
when :delete, :refresh
|
182
|
+
Sequel::Deprecation.deprecate("The :delete and :refresh prepared statement types", "There should be no need to check if these types are supported")
|
183
|
+
false
|
184
|
+
# :nocov:
|
238
185
|
else
|
239
186
|
raise Error, "unsupported type used: #{type.inspect}"
|
240
187
|
end
|
@@ -28,7 +28,7 @@ module Sequel
|
|
28
28
|
end
|
29
29
|
|
30
30
|
module ClassMethods
|
31
|
-
# A hash with column symbol keys and default values. Instance
|
31
|
+
# A hash with column symbol keys and default values. Instance
|
32
32
|
# values are merged into this hash before creating to reduce the
|
33
33
|
# number of free columns (columns that may or may not be present
|
34
34
|
# in the INSERT statement), as the number of prepared statements
|
@@ -36,12 +36,12 @@ module Sequel
|
|
36
36
|
#
|
37
37
|
# # Eager loading - also populates the :parent and children associations
|
38
38
|
# # for all ancestors and descendants
|
39
|
-
# Model.where(:
|
39
|
+
# Model.where(id: [1, 2]).eager(:ancestors, :descendants).all
|
40
40
|
#
|
41
|
-
# # Eager loading children and
|
42
|
-
# Model.where(:
|
43
|
-
# # Eager loading children,
|
44
|
-
# Model.where(:
|
41
|
+
# # Eager loading children and grandchildren
|
42
|
+
# Model.where(id: [1, 2]).eager(descendants: 2).all
|
43
|
+
# # Eager loading children, grandchildren, and great grandchildren
|
44
|
+
# Model.where(id: [1, 2]).eager(descendants: 3).all
|
45
45
|
#
|
46
46
|
# = Options
|
47
47
|
#
|
@@ -56,8 +56,8 @@ module Sequel
|
|
56
56
|
# Note that you can change the name of the above associations by specifying
|
57
57
|
# a :name key in the appropriate hash of options above. For example:
|
58
58
|
#
|
59
|
-
# Model.plugin :rcte_tree, :
|
60
|
-
# :
|
59
|
+
# Model.plugin :rcte_tree, parent: {name: :mother},
|
60
|
+
# children: {name: :daughters}, descendants: {name: :offspring}
|
61
61
|
#
|
62
62
|
# Any other keys in the main options hash are treated as options shared by
|
63
63
|
# all of the associations. Here's a few options that affect the plugin:
|