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
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# The
|
5
|
+
# The boolean_readers plugin allows for the creation of attribute? methods
|
6
6
|
# for boolean columns, which provides a nicer API. By default, the accessors
|
7
7
|
# are created for all columns of type :boolean. However, you can provide a
|
8
8
|
# block to the plugin to change the criteria used to determine if a
|
@@ -28,8 +28,8 @@ module Sequel
|
|
28
28
|
# Add the boolean_attribute? class method to the model, and create
|
29
29
|
# attribute? boolean reader methods for the class's columns if the class has a dataset.
|
30
30
|
def self.configure(model, &block)
|
31
|
-
model.
|
32
|
-
(
|
31
|
+
model.instance_exec do
|
32
|
+
define_singleton_method(:boolean_attribute?, &(block || DEFAULT_BOOLEAN_ATTRIBUTE_PROC))
|
33
33
|
send(:create_boolean_readers) if @dataset
|
34
34
|
end
|
35
35
|
end
|
@@ -30,8 +30,8 @@ module Sequel
|
|
30
30
|
module BooleanSubsets
|
31
31
|
# Create boolean subset methods for each boolean column.
|
32
32
|
def self.configure(model, &block)
|
33
|
-
model.
|
34
|
-
(
|
33
|
+
model.instance_exec do
|
34
|
+
define_singleton_method(:boolean_subset_args, &block) if block
|
35
35
|
create_boolean_subsets if @dataset
|
36
36
|
end
|
37
37
|
end
|
@@ -34,15 +34,15 @@ module Sequel
|
|
34
34
|
# Sequel::Model.plugin :caching, CACHE
|
35
35
|
#
|
36
36
|
# # Make the Album class use the cache with a 30 minute time-to-live
|
37
|
-
# Album.plugin :caching, CACHE, :
|
37
|
+
# Album.plugin :caching, CACHE, ttl: 1800
|
38
38
|
#
|
39
39
|
# # Make the Artist class use a cache with the memcached protocol
|
40
|
-
# Artist.plugin :caching, MEMCACHED_CACHE, :
|
40
|
+
# Artist.plugin :caching, MEMCACHED_CACHE, ignore_exceptions: true
|
41
41
|
module Caching
|
42
42
|
# Set the cache_store and cache_ttl attributes for the given model.
|
43
43
|
# If the :ttl option is not given, 3600 seconds is the default.
|
44
44
|
def self.configure(model, store, opts=OPTS)
|
45
|
-
model.
|
45
|
+
model.instance_exec do
|
46
46
|
@cache_store = store
|
47
47
|
@cache_ttl = opts[:ttl] || 3600
|
48
48
|
@cache_ignore_exceptions = opts[:ignore_exceptions]
|
@@ -94,9 +94,9 @@ module Sequel
|
|
94
94
|
# Access the cache using the given method and key, rescuing exceptions if necessary.
|
95
95
|
def cache_op(meth, ck)
|
96
96
|
if @cache_ignore_exceptions
|
97
|
-
@cache_store.
|
97
|
+
@cache_store.public_send(meth, ck) rescue nil
|
98
98
|
else
|
99
|
-
@cache_store.
|
99
|
+
@cache_store.public_send(meth, ck)
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
@@ -45,24 +45,28 @@ module Sequel
|
|
45
45
|
# executives table also stores CEO model objects.
|
46
46
|
#
|
47
47
|
# When using the class_table_inheritance plugin, subclasses that have additional
|
48
|
-
# columns use joined datasets:
|
48
|
+
# columns use joined datasets in subselects:
|
49
49
|
#
|
50
50
|
# Employee.dataset.sql
|
51
51
|
# # SELECT * FROM employees
|
52
52
|
#
|
53
53
|
# Manager.dataset.sql
|
54
|
-
# # SELECT
|
55
|
-
# #
|
56
|
-
# #
|
57
|
-
# #
|
54
|
+
# # SELECT * FROM (
|
55
|
+
# # SELECT employees.id, employees.name, employees.kind,
|
56
|
+
# # managers.num_staff
|
57
|
+
# # FROM employees
|
58
|
+
# # JOIN managers ON (managers.id = employees.id)
|
59
|
+
# # ) AS employees
|
58
60
|
#
|
59
61
|
# CEO.dataset.sql
|
60
|
-
# # SELECT
|
61
|
-
# #
|
62
|
-
# #
|
63
|
-
# #
|
64
|
-
# #
|
65
|
-
# #
|
62
|
+
# # SELECT * FROM (
|
63
|
+
# # SELECT employees.id, employees.name, employees.kind,
|
64
|
+
# # managers.num_staff, executives.num_managers
|
65
|
+
# # FROM employees
|
66
|
+
# # JOIN managers ON (managers.id = employees.id)
|
67
|
+
# # JOIN executives ON (executives.id = managers.id)
|
68
|
+
# # WHERE (employees.kind IN ('CEO'))
|
69
|
+
# # ) AS employees
|
66
70
|
#
|
67
71
|
# This allows CEO.all to return instances with all attributes
|
68
72
|
# loaded. The plugin overrides the deleting, inserting, and updating
|
@@ -95,19 +99,21 @@ module Sequel
|
|
95
99
|
# a = Executive.first
|
96
100
|
# a.values # {:id=>1, name=>'S', :kind=>'Executive', :num_staff=>4, :num_managers=>2}
|
97
101
|
#
|
98
|
-
# Note that when loading from a subclass, because the subclass dataset uses a
|
99
|
-
#
|
100
|
-
#
|
102
|
+
# Note that when loading from a subclass, because the subclass dataset uses a subquery
|
103
|
+
# that by default uses the same alias at the primary table, any qualified identifiers
|
104
|
+
# should reference the subquery alias (and qualified identifiers should not be needed
|
105
|
+
# unless joining to another table):
|
101
106
|
#
|
102
|
-
# a = Executive.where(:id=>1).first #
|
103
|
-
# a = Executive.where{{
|
107
|
+
# a = Executive.where(:id=>1).first # works
|
108
|
+
# a = Executive.where{{employees[:id]=>1}}.first # works
|
109
|
+
# a = Executive.where{{executives[:id]=>1}}.first # doesn't work
|
104
110
|
#
|
105
111
|
# = Usage
|
106
112
|
#
|
107
113
|
# # Use the default of storing the class name in the sti_key
|
108
114
|
# # column (:kind in this case)
|
109
115
|
# class Employee < Sequel::Model
|
110
|
-
# plugin :class_table_inheritance, :
|
116
|
+
# plugin :class_table_inheritance, key: :kind
|
111
117
|
# end
|
112
118
|
#
|
113
119
|
# # Have subclasses inherit from the appropriate class
|
@@ -119,27 +125,23 @@ module Sequel
|
|
119
125
|
#
|
120
126
|
# # Some examples of using these options:
|
121
127
|
#
|
122
|
-
# # Use a subquery for all subclass datasets, fixing issues with ambiguous
|
123
|
-
# # column names.
|
124
|
-
# Employee.plugin :class_table_inheritance, :key=>:kind, :alias=>:employees
|
125
|
-
#
|
126
128
|
# # Specifying the tables with a :table_map hash
|
127
129
|
# Employee.plugin :class_table_inheritance,
|
128
|
-
# :
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
130
|
+
# table_map: {Employee: :employees,
|
131
|
+
# Staff: :staff,
|
132
|
+
# Cook: :staff,
|
133
|
+
# Manager: :managers,
|
134
|
+
# Executive: :executives,
|
135
|
+
# CEO: ::executives }
|
134
136
|
#
|
135
137
|
# # Using integers to store the class type, with a :model_map hash
|
136
138
|
# # and an sti_key of :type
|
137
|
-
# Employee.plugin :class_table_inheritance, :type,
|
138
|
-
# :
|
139
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
140
|
+
# model_map: {1=>:Staff, 2=>:Cook, 3=>:Manager, 4=>:Executive, 5=>:CEO}
|
139
141
|
#
|
140
142
|
# # Using non-class name strings
|
141
|
-
# Employee.plugin :class_table_inheritance, :
|
142
|
-
# :
|
143
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
144
|
+
# model_map: {'staff'=>:Staff, 'cook staff'=>:Cook, 'supervisor'=>:Manager}
|
143
145
|
#
|
144
146
|
# # By default the plugin sets the respective column value
|
145
147
|
# # when a new instance is created.
|
@@ -148,26 +150,26 @@ module Sequel
|
|
148
150
|
#
|
149
151
|
# # You can customize this behavior with the :key_chooser option.
|
150
152
|
# # This is most useful when using a non-bijective mapping.
|
151
|
-
# Employee.plugin :class_table_inheritance, :
|
152
|
-
# :
|
153
|
-
# :
|
153
|
+
# Employee.plugin :class_table_inheritance, key: :type,
|
154
|
+
# model_map: {'cook staff'=>:Cook, 'supervisor'=>:Manager},
|
155
|
+
# key_chooser: proc{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger' }
|
154
156
|
#
|
155
157
|
# # Using custom procs, with :model_map taking column values
|
156
158
|
# # and yielding either a class, string, symbol, or nil,
|
157
159
|
# # and :key_map taking a class object and returning the column
|
158
160
|
# # value to use
|
159
|
-
# Employee.plugin :single_table_inheritance, :
|
160
|
-
# :
|
161
|
-
# :
|
161
|
+
# Employee.plugin :single_table_inheritance, key: :type,
|
162
|
+
# model_map: proc{|v| v.reverse},
|
163
|
+
# key_map: proc{|klass| klass.name.reverse}
|
162
164
|
#
|
163
165
|
# # You can use the same class for multiple values.
|
164
166
|
# # This is mainly useful when the sti_key column contains multiple values
|
165
167
|
# # which are different but do not require different code.
|
166
|
-
# Employee.plugin :single_table_inheritance, :
|
167
|
-
# :
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
168
|
+
# Employee.plugin :single_table_inheritance, key: :type,
|
169
|
+
# model_map: {'staff' => "Staff",
|
170
|
+
# 'manager' => "Manager",
|
171
|
+
# 'overpayed staff' => "Staff",
|
172
|
+
# 'underpayed staff' => "Staff"}
|
171
173
|
#
|
172
174
|
# One minor issue to note is that if you specify the <tt>:key_map</tt>
|
173
175
|
# option as a hash, instead of having it inferred from the <tt>:model_map</tt>,
|
@@ -183,7 +185,7 @@ module Sequel
|
|
183
185
|
end
|
184
186
|
|
185
187
|
# Initialize the plugin using the following options:
|
186
|
-
# :alias ::
|
188
|
+
# :alias :: Change the alias used for the subquery in model datasets.
|
187
189
|
# using this as the alias.
|
188
190
|
# :key :: Column symbol that holds the key that identifies the class to use.
|
189
191
|
# Necessary if you want to call model methods on a superclass
|
@@ -192,34 +194,26 @@ module Sequel
|
|
192
194
|
# :key_map :: Hash or proc mapping model class names to key column values.
|
193
195
|
# Each value or return is an array of possible key column values.
|
194
196
|
# :key_chooser :: proc returning key for the provided model instance
|
195
|
-
# :table_map :: Hash with class name symbols keys mapping to table name symbol values
|
196
|
-
# Overrides implicit table names
|
197
|
+
# :table_map :: Hash with class name symbols keys mapping to table name symbol values.
|
198
|
+
# Overrides implicit table names.
|
197
199
|
def self.configure(model, opts = OPTS)
|
198
200
|
SingleTableInheritance.configure model, opts[:key], opts
|
199
201
|
|
200
|
-
model.
|
202
|
+
model.instance_exec do
|
201
203
|
@cti_models = [self]
|
202
204
|
@cti_tables = [table_name]
|
203
205
|
@cti_instance_dataset = @instance_dataset
|
204
206
|
@cti_table_columns = columns
|
205
207
|
@cti_table_map = opts[:table_map] || {}
|
206
|
-
@cti_alias = opts[:alias]
|
208
|
+
@cti_alias = opts[:alias] || @dataset.first_source
|
207
209
|
end
|
208
210
|
end
|
209
211
|
|
210
212
|
module ClassMethods
|
211
|
-
# An array of each model in the inheritance hierarchy that
|
213
|
+
# An array of each model in the inheritance hierarchy that is
|
212
214
|
# backed by a new table.
|
213
215
|
attr_reader :cti_models
|
214
216
|
|
215
|
-
# The parent/root/base model for this class table inheritance hierarchy.
|
216
|
-
# This is the only model in the hierarchy that loads the
|
217
|
-
# class_table_inheritance plugin. For backwards compatibility.
|
218
|
-
def cti_base_model
|
219
|
-
Sequel::Deprecation.deprecate("#{self}.cti_base_model", "Use #{self}.cti_models.first instead")
|
220
|
-
@cti_models.first
|
221
|
-
end
|
222
|
-
|
223
217
|
# An array of column symbols for the backing database table,
|
224
218
|
# giving the columns to update in each backing database table.
|
225
219
|
attr_reader :cti_table_columns
|
@@ -238,33 +232,10 @@ module Sequel
|
|
238
232
|
# the implicit naming is incorrect.
|
239
233
|
attr_reader :cti_table_map
|
240
234
|
|
241
|
-
# Hash with table name symbol keys and arrays of column symbol values,
|
242
|
-
# giving the columns to update in each backing database table.
|
243
|
-
# For backwards compatibility.
|
244
|
-
def cti_columns
|
245
|
-
Sequel::Deprecation.deprecate("#{self}.cti_columns", "Use #{self}.cti_models to get the models, cti_table_name to get the name for the model, and cti_table_columns to get the columns for the model")
|
246
|
-
h = {}
|
247
|
-
cti_models.each { |m| h[m.cti_table_name] = m.cti_table_columns }
|
248
|
-
h
|
249
|
-
end
|
250
|
-
|
251
|
-
# Alias to sti_key, for backwards compatibility.
|
252
|
-
def cti_key
|
253
|
-
Sequel::Deprecation.deprecate("#{self}.cti_key", "Use #{self}.sti_key instead")
|
254
|
-
sti_key
|
255
|
-
end
|
256
|
-
|
257
|
-
# Alias to sti_model_map, for backwards compatibility.
|
258
|
-
def cti_model_map
|
259
|
-
Sequel::Deprecation.deprecate("#{self}.cti_model_map", "Use #{self}.sti_model_map instead")
|
260
|
-
sti_model_map
|
261
|
-
end
|
262
|
-
|
263
235
|
# Freeze CTI information when freezing model class.
|
264
236
|
def freeze
|
265
237
|
@cti_models.freeze
|
266
238
|
@cti_tables.freeze
|
267
|
-
@cti_instance_dataset.freeze
|
268
239
|
@cti_table_columns.freeze
|
269
240
|
@cti_table_map.freeze
|
270
241
|
|
@@ -277,7 +248,7 @@ module Sequel
|
|
277
248
|
ds = sti_dataset
|
278
249
|
|
279
250
|
# Prevent inherited in model/base.rb from setting the dataset
|
280
|
-
subclass.
|
251
|
+
subclass.instance_exec { @dataset = nil }
|
281
252
|
|
282
253
|
super
|
283
254
|
|
@@ -298,27 +269,24 @@ module Sequel
|
|
298
269
|
return unless table
|
299
270
|
|
300
271
|
pk = primary_key
|
301
|
-
subclass.
|
272
|
+
subclass.instance_exec do
|
302
273
|
if cti_tables.length == 1
|
303
274
|
ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))})
|
304
275
|
end
|
305
276
|
cols = columns - [pk]
|
306
277
|
dup_cols = cols & ds.columns
|
307
278
|
unless dup_cols.empty?
|
308
|
-
|
309
|
-
Sequel::Deprecation.deprecate("Using class_table_inheritance with duplicate column names (#{n} => #{dup_cols}) in subclass tables (other than the primary key column)', 'Make sure all tables used have unique column names, or implement support for handling duplicate column names in the class_table_inheritance plugin")
|
279
|
+
raise Error, "class_table_inheritance with duplicate column names (other than the primary key column) is not supported, make sure tables have unique column names"
|
310
280
|
end
|
311
281
|
sel_app = cols.map{|cc| Sequel.qualify(table, Sequel.identifier(cc))}
|
312
282
|
@sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app)
|
313
283
|
|
314
|
-
|
315
|
-
ds = ds.from_self(:alias=>@cti_alias)
|
316
|
-
end
|
284
|
+
ds = ds.from_self(:alias=>@cti_alias)
|
317
285
|
|
318
286
|
set_dataset(ds)
|
319
287
|
set_columns(self.columns)
|
320
288
|
@dataset = @dataset.with_row_proc(lambda{|r| subclass.sti_load(r)})
|
321
|
-
cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias
|
289
|
+
cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias)}
|
322
290
|
|
323
291
|
@cti_models += [self]
|
324
292
|
@cti_tables += [table]
|
@@ -333,12 +301,8 @@ module Sequel
|
|
333
301
|
|
334
302
|
# The table name for the current model class's main table.
|
335
303
|
def table_name
|
336
|
-
if cti_tables
|
337
|
-
|
338
|
-
@cti_alias
|
339
|
-
else
|
340
|
-
cti_tables.last
|
341
|
-
end
|
304
|
+
if cti_tables && cti_tables.length > 1
|
305
|
+
@cti_alias
|
342
306
|
else
|
343
307
|
super
|
344
308
|
end
|
@@ -360,7 +324,7 @@ module Sequel
|
|
360
324
|
# when setting subclass dataset.
|
361
325
|
def sti_subclass_dataset(key)
|
362
326
|
ds = super
|
363
|
-
if
|
327
|
+
if cti_models[0] != self
|
364
328
|
ds = ds.from_self(:alias=>@cti_alias)
|
365
329
|
end
|
366
330
|
ds
|
@@ -383,14 +347,8 @@ module Sequel
|
|
383
347
|
false
|
384
348
|
end
|
385
349
|
|
386
|
-
private
|
387
|
-
|
388
|
-
def cti_this(model)
|
389
|
-
use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
|
390
|
-
end
|
391
|
-
|
392
350
|
# Set the sti_key column based on the sti_key_map.
|
393
|
-
def
|
351
|
+
def before_validation
|
394
352
|
if new? && (set = self[model.sti_key])
|
395
353
|
exp = model.sti_key_chooser.call(self)
|
396
354
|
if set != exp
|
@@ -402,6 +360,12 @@ module Sequel
|
|
402
360
|
super
|
403
361
|
end
|
404
362
|
|
363
|
+
private
|
364
|
+
|
365
|
+
def cti_this(model)
|
366
|
+
use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
|
367
|
+
end
|
368
|
+
|
405
369
|
# Insert rows into all backing tables, using the columns
|
406
370
|
# in each table.
|
407
371
|
def _insert
|
@@ -422,10 +386,15 @@ module Sequel
|
|
422
386
|
|
423
387
|
# Update rows in all backing tables, using the columns in each table.
|
424
388
|
def _update(columns)
|
389
|
+
return super if model.cti_models[0] == model
|
425
390
|
model.cti_models.each do |m|
|
426
391
|
h = {}
|
427
392
|
m.cti_table_columns.each{|c| h[c] = columns[c] if columns.include?(c)}
|
428
|
-
|
393
|
+
unless h.empty?
|
394
|
+
ds = cti_this(m)
|
395
|
+
n = ds.update(h)
|
396
|
+
raise(NoExistingObject, "Attempt to update object did not result in a single row modification (SQL: #{ds.update_sql(h)})") if require_modification && n != 1
|
397
|
+
end
|
429
398
|
end
|
430
399
|
end
|
431
400
|
end
|
@@ -30,7 +30,7 @@ module Sequel
|
|
30
30
|
# Album.plugin :column_conflicts
|
31
31
|
module ColumnConflicts
|
32
32
|
def self.apply(model)
|
33
|
-
model.
|
33
|
+
model.instance_exec do
|
34
34
|
@get_column_conflicts = {}
|
35
35
|
@set_column_conflicts = {}
|
36
36
|
end
|
@@ -38,7 +38,7 @@ module Sequel
|
|
38
38
|
|
39
39
|
# Check for column conflicts on the current model if the model has a dataset.
|
40
40
|
def self.configure(model)
|
41
|
-
model.
|
41
|
+
model.instance_exec do
|
42
42
|
check_column_conflicts if @dataset
|
43
43
|
end
|
44
44
|
end
|
@@ -28,7 +28,7 @@ module Sequel
|
|
28
28
|
# Modify the current model's dataset selection, if the model
|
29
29
|
# has a dataset.
|
30
30
|
def self.configure(model)
|
31
|
-
model.
|
31
|
+
model.instance_exec do
|
32
32
|
self.dataset = dataset if @dataset
|
33
33
|
end
|
34
34
|
end
|
@@ -41,7 +41,7 @@ module Sequel
|
|
41
41
|
# qualifying them with table's name.
|
42
42
|
def convert_input_dataset(ds)
|
43
43
|
ds = super
|
44
|
-
|
44
|
+
unless ds.opts[:select]
|
45
45
|
if db.supports_schema_parsing?
|
46
46
|
cols = check_non_connection_error(false){db.schema(ds)}
|
47
47
|
if cols
|
@@ -12,7 +12,7 @@ module Sequel
|
|
12
12
|
# This can be handled with:
|
13
13
|
#
|
14
14
|
# Album.plugin :composition
|
15
|
-
# Album.composition :date, :
|
15
|
+
# Album.composition :date, mapping: [:year, :month, :day]
|
16
16
|
#
|
17
17
|
# With the :mapping option, you can provide a :class option
|
18
18
|
# that gives the class to use, but if that is not provided, it
|
@@ -32,9 +32,9 @@ module Sequel
|
|
32
32
|
#
|
33
33
|
# The :mapping option is just a shortcut that works in particular
|
34
34
|
# cases. To handle any case, you can define a custom :composer
|
35
|
-
# and :decomposer procs. The :composer proc will be
|
35
|
+
# and :decomposer procs. The :composer proc will be instance_execed
|
36
36
|
# the first time the getter is called, and the :decomposer proc
|
37
|
-
# will be
|
37
|
+
# will be instance_execed before saving. The above example could
|
38
38
|
# also be implemented as:
|
39
39
|
#
|
40
40
|
# Album.composition :date,
|
@@ -58,7 +58,7 @@ module Sequel
|
|
58
58
|
module Composition
|
59
59
|
# Define the necessary class instance variables.
|
60
60
|
def self.apply(model)
|
61
|
-
model.
|
61
|
+
model.instance_exec do
|
62
62
|
@compositions = {}
|
63
63
|
include(@composition_module ||= Module.new)
|
64
64
|
end
|
@@ -69,23 +69,14 @@ module Sequel
|
|
69
69
|
# hash values.
|
70
70
|
attr_reader :compositions
|
71
71
|
|
72
|
-
def composition_module
|
73
|
-
Sequel::Deprecation.deprecate('Sequel::Model.composition_module', 'There is no replacement')
|
74
|
-
@composition_module
|
75
|
-
end
|
76
|
-
def composition_module=(v)
|
77
|
-
Sequel::Deprecation.deprecate('Sequel::Model.composition_module=', 'There is no replacement')
|
78
|
-
@composition_module = v
|
79
|
-
end
|
80
|
-
|
81
72
|
# Define a composition for this model, with name being the name of the composition.
|
82
73
|
# You must provide either a :mapping option or both the :composer and :decomposer options.
|
83
74
|
#
|
84
75
|
# Options:
|
85
76
|
# :class :: if using the :mapping option, the class to use, as a Class, String or Symbol.
|
86
|
-
# :composer :: A proc that is
|
77
|
+
# :composer :: A proc that is instance_execed when the composition getter method is called
|
87
78
|
# to create the composition.
|
88
|
-
# :decomposer :: A proc that is
|
79
|
+
# :decomposer :: A proc that is instance_execed before saving the model object,
|
89
80
|
# if the composition object exists, which sets the columns in the model object
|
90
81
|
# based on the value of the composition object.
|
91
82
|
# :mapping :: An array where each element is either a symbol or an array of two symbols.
|
@@ -94,12 +85,12 @@ module Sequel
|
|
94
85
|
# represents the getter method in the composition object. Example:
|
95
86
|
# # Uses columns year, month, and day in the current model
|
96
87
|
# # Uses year, month, and day methods in the composition object
|
97
|
-
# {:
|
88
|
+
# {mapping: [:year, :month, :day]}
|
98
89
|
# # Uses columns year, month, and day in the current model
|
99
90
|
# # Uses y, m, and d methods in the composition object where
|
100
91
|
# # for example y in the composition object represents year
|
101
92
|
# # in the model object.
|
102
|
-
# {:
|
93
|
+
# {mapping: [[:year, :y], [:month, :m], [:day, :d]]}
|
103
94
|
def composition(name, opts=OPTS)
|
104
95
|
opts = opts.dup
|
105
96
|
compositions[name] = opts
|
@@ -125,7 +116,7 @@ module Sequel
|
|
125
116
|
if (o = compositions[name]).nil?
|
126
117
|
setter_meths.each{|sm| set_column_value(sm, nil)}
|
127
118
|
else
|
128
|
-
setters.each{|sm, cm| set_column_value(sm, o.
|
119
|
+
setters.each{|sm, cm| set_column_value(sm, o.public_send(cm))}
|
129
120
|
end
|
130
121
|
end
|
131
122
|
end
|
@@ -144,9 +135,9 @@ module Sequel
|
|
144
135
|
if compositions.has_key?(name)
|
145
136
|
compositions[name]
|
146
137
|
elsif frozen?
|
147
|
-
|
138
|
+
instance_exec(&composer)
|
148
139
|
else
|
149
|
-
compositions[name] =
|
140
|
+
compositions[name] = instance_exec(&composer)
|
150
141
|
end
|
151
142
|
end
|
152
143
|
define_method("#{name}=") do |v|
|
@@ -177,15 +168,15 @@ module Sequel
|
|
177
168
|
super
|
178
169
|
end
|
179
170
|
|
180
|
-
private
|
181
|
-
|
182
171
|
# For each composition, set the columns in the model class based
|
183
172
|
# on the composition object.
|
184
|
-
def
|
185
|
-
@compositions.keys.each{|n|
|
173
|
+
def before_validation
|
174
|
+
@compositions.keys.each{|n| instance_exec(&model.compositions[n][:decomposer])} if @compositions
|
186
175
|
super
|
187
176
|
end
|
188
177
|
|
178
|
+
private
|
179
|
+
|
189
180
|
# Clear the cached compositions when manually refreshing.
|
190
181
|
def _refresh_set_values(hash)
|
191
182
|
@compositions.clear if @compositions
|