sequel 5.8.0 → 5.38.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 +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -160,7 +160,7 @@ module Sequel
|
|
|
160
160
|
|
|
161
161
|
def filter_by_associations_add_conditions_dataset_filter(ds)
|
|
162
162
|
key = qualify(associated_class.table_name, self[:key])
|
|
163
|
-
ds.
|
|
163
|
+
ds.cross_join(Sequel.function(:unnest, key).as(:_smtopgaa_, [:_smtopgaa_key_])).exclude(key=>nil).select(:_smtopgaa_key_)
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
def filter_by_associations_conditions_key
|
|
@@ -337,12 +337,13 @@ module Sequel
|
|
|
337
337
|
end
|
|
338
338
|
opts[:eager_loader] ||= proc do |eo|
|
|
339
339
|
id_map = eo[:id_map]
|
|
340
|
+
eo = Hash[eo]
|
|
341
|
+
eo[:loader] = false
|
|
340
342
|
|
|
341
|
-
eager_load_results(opts,
|
|
342
|
-
if pks
|
|
343
|
+
eager_load_results(opts, eo) do |assoc_record|
|
|
344
|
+
if pks = assoc_record.get_column_value(key)
|
|
343
345
|
pks.each do |pkv|
|
|
344
|
-
|
|
345
|
-
objects.each do |object|
|
|
346
|
+
id_map[pkv].each do |object|
|
|
346
347
|
object.associations[name].push(assoc_record)
|
|
347
348
|
end
|
|
348
349
|
end
|
|
@@ -374,7 +375,7 @@ module Sequel
|
|
|
374
375
|
|
|
375
376
|
opts[:eager_grapher] ||= proc do |eo|
|
|
376
377
|
ds = eo[:self]
|
|
377
|
-
ds = ds.graph(eager_graph_dataset(opts, eo), conditions,
|
|
378
|
+
ds = ds.graph(eager_graph_dataset(opts, eo), conditions, eo.merge(:select=>select, :join_type=>eo[:join_type]||join_type, :qualify=>:deep), &graph_block)
|
|
378
379
|
ds
|
|
379
380
|
end
|
|
380
381
|
|
|
@@ -433,7 +434,9 @@ module Sequel
|
|
|
433
434
|
end
|
|
434
435
|
end
|
|
435
436
|
|
|
436
|
-
|
|
437
|
+
eo = Hash[eo]
|
|
438
|
+
eo[:id_map] = id_map
|
|
439
|
+
eager_load_results(opts, eo) do |assoc_record|
|
|
437
440
|
if objects = id_map[assoc_record.get_column_value(pkm)]
|
|
438
441
|
objects.each do |object|
|
|
439
442
|
object.associations[name].push(assoc_record)
|
|
@@ -466,7 +469,7 @@ module Sequel
|
|
|
466
469
|
|
|
467
470
|
opts[:eager_grapher] ||= proc do |eo|
|
|
468
471
|
ds = eo[:self]
|
|
469
|
-
ds = ds.graph(eager_graph_dataset(opts, eo), conditions,
|
|
472
|
+
ds = ds.graph(eager_graph_dataset(opts, eo), conditions, eo.merge(:select=>select, :join_type=>eo[:join_type]||join_type, :qualify=>:deep), &graph_block)
|
|
470
473
|
ds
|
|
471
474
|
end
|
|
472
475
|
|
|
@@ -527,7 +530,7 @@ module Sequel
|
|
|
527
530
|
Sequel[pk=>assoc_pks]
|
|
528
531
|
end
|
|
529
532
|
when Sequel::Dataset
|
|
530
|
-
|
|
533
|
+
obj.select(ref.qualify(obj.model.table_name, ref[:key_column]).as(:key)).from_self.where{{pk=>any(:key)}}.select(1).exists
|
|
531
534
|
end
|
|
532
535
|
expr = Sequel::SQL::Constants::FALSE unless expr
|
|
533
536
|
expr = add_association_filter_conditions(ref, obj, expr)
|
|
@@ -22,8 +22,9 @@ module Sequel
|
|
|
22
22
|
# This plugin is not intended as a replacement for other validations,
|
|
23
23
|
# it is intended as a last resort. The purpose of validations is to provide nice
|
|
24
24
|
# error messages for the user, and the error messages generated by this plugin are
|
|
25
|
-
# fairly generic. The error messages can be customized
|
|
26
|
-
#
|
|
25
|
+
# fairly generic by default. The error messages can be customized per constraint type
|
|
26
|
+
# using the :messages plugin option, and individually per constraint using
|
|
27
|
+
# +pg_auto_constraint_validation_override+ (see below).
|
|
27
28
|
#
|
|
28
29
|
# This plugin only works on the postgres adapter when using the pg 0.16+ driver,
|
|
29
30
|
# PostgreSQL 9.3+ server, and PostgreSQL 9.3+ client library (libpq). In other cases
|
|
@@ -37,6 +38,38 @@ module Sequel
|
|
|
37
38
|
# rescue Sequel::ValidationFailed
|
|
38
39
|
# album.errors.on(:artist_id) # ['is invalid']
|
|
39
40
|
# end
|
|
41
|
+
#
|
|
42
|
+
# While the database usually provides enough information to correctly associated
|
|
43
|
+
# constraint violations with model columns, there are cases where it does not.
|
|
44
|
+
# In those cases, you can override the handling of specific constraint violations
|
|
45
|
+
# to be associated to particular column(s), and use a specific error message:
|
|
46
|
+
#
|
|
47
|
+
# Album.pg_auto_constraint_validation_override(:constraint_name, [:column1], "validation error message")
|
|
48
|
+
#
|
|
49
|
+
# Using the pg_auto_constraint_validations plugin requires 5 queries per
|
|
50
|
+
# model at load time in order to gather the necessary metadata. For applications
|
|
51
|
+
# with a large number of models, this can result in a noticeable delay during model
|
|
52
|
+
# initialization. To mitigate this issue, you can cache the necessary metadata in
|
|
53
|
+
# a file with the :cache_file option:
|
|
54
|
+
#
|
|
55
|
+
# Sequel::Model.plugin :pg_auto_constraint_validations, cache_file: 'db/pgacv.cache'
|
|
56
|
+
#
|
|
57
|
+
# The file does not have to exist when loading the plugin. If it exists, the plugin
|
|
58
|
+
# will load the cache and use the cached results instead of issuing queries if there
|
|
59
|
+
# is an entry in the cache. If there is no entry in the cache, it will update the
|
|
60
|
+
# in-memory cache with the metadata results. To save the in in-memory cache back to
|
|
61
|
+
# the cache file, run:
|
|
62
|
+
#
|
|
63
|
+
# Sequel::Model.dump_pg_auto_constraint_validations_cache
|
|
64
|
+
#
|
|
65
|
+
# Note that when using the :cache_file option, it is up to the application to ensure
|
|
66
|
+
# that the dumped cached metadata reflects the current state of the database. Sequel
|
|
67
|
+
# does no checking to ensure this, as checking would take time and the
|
|
68
|
+
# purpose of this code is to take a shortcut.
|
|
69
|
+
#
|
|
70
|
+
# The cached schema is dumped in Marshal format, since it is the fastest
|
|
71
|
+
# and it handles all ruby objects used in the metadata. Because of this,
|
|
72
|
+
# you should not attempt to load the metadata from a untrusted file.
|
|
40
73
|
#
|
|
41
74
|
# Usage:
|
|
42
75
|
#
|
|
@@ -59,13 +92,28 @@ module Sequel
|
|
|
59
92
|
}.freeze).each_value(&:freeze)
|
|
60
93
|
|
|
61
94
|
# Setup the constraint violation metadata. Options:
|
|
95
|
+
# :cache_file :: File storing cached metadata, to avoid queries for each model
|
|
62
96
|
# :messages :: Override the default error messages for each constraint
|
|
63
97
|
# violation type (:not_null, :check, :unique, :foreign_key, :referenced_by)
|
|
64
98
|
def self.configure(model, opts=OPTS)
|
|
65
99
|
model.instance_exec do
|
|
100
|
+
if @pg_auto_constraint_validations_cache_file = opts[:cache_file]
|
|
101
|
+
@pg_auto_constraint_validations_cache = if ::File.file?(@pg_auto_constraint_validations_cache_file)
|
|
102
|
+
cache = Marshal.load(File.read(@pg_auto_constraint_validations_cache_file))
|
|
103
|
+
cache.each_value do |hash|
|
|
104
|
+
hash.freeze.each_value(&:freeze)
|
|
105
|
+
end
|
|
106
|
+
else
|
|
107
|
+
{}
|
|
108
|
+
end
|
|
109
|
+
else
|
|
110
|
+
@pg_auto_constraint_validations_cache = nil
|
|
111
|
+
end
|
|
112
|
+
|
|
66
113
|
setup_pg_auto_constraint_validations
|
|
67
|
-
@pg_auto_constraint_validations_messages = (@pg_auto_constraint_validations_messages || DEFAULT_ERROR_MESSAGES).merge(opts[:messages] ||
|
|
114
|
+
@pg_auto_constraint_validations_messages = (@pg_auto_constraint_validations_messages || DEFAULT_ERROR_MESSAGES).merge(opts[:messages] || OPTS).freeze
|
|
68
115
|
end
|
|
116
|
+
nil
|
|
69
117
|
end
|
|
70
118
|
|
|
71
119
|
module ClassMethods
|
|
@@ -77,9 +125,26 @@ module Sequel
|
|
|
77
125
|
# generated validation failures.
|
|
78
126
|
attr_reader :pg_auto_constraint_validations_messages
|
|
79
127
|
|
|
80
|
-
Plugins.inherited_instance_variables(self, :@pg_auto_constraint_validations=>nil, :@pg_auto_constraint_validations_messages=>nil)
|
|
128
|
+
Plugins.inherited_instance_variables(self, :@pg_auto_constraint_validations=>nil, :@pg_auto_constraint_validations_messages=>nil, :@pg_auto_constraint_validations_cache=>nil, :@pg_auto_constraint_validations_cache_file=>nil)
|
|
81
129
|
Plugins.after_set_dataset(self, :setup_pg_auto_constraint_validations)
|
|
82
130
|
|
|
131
|
+
# Dump the in-memory cached metadata to the cache file.
|
|
132
|
+
def dump_pg_auto_constraint_validations_cache
|
|
133
|
+
raise Error, "No pg_auto_constraint_validations setup" unless file = @pg_auto_constraint_validations_cache_file
|
|
134
|
+
File.open(file, 'wb'){|f| f.write(Marshal.dump(@pg_auto_constraint_validations_cache))}
|
|
135
|
+
nil
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Override the constraint validation columns and message for a given constraint
|
|
139
|
+
def pg_auto_constraint_validation_override(constraint, columns, message)
|
|
140
|
+
pgacv = Hash[@pg_auto_constraint_validations]
|
|
141
|
+
overrides = pgacv[:overrides] = Hash[pgacv[:overrides]]
|
|
142
|
+
overrides[constraint] = [Array(columns), message].freeze
|
|
143
|
+
overrides.freeze
|
|
144
|
+
@pg_auto_constraint_validations = pgacv.freeze
|
|
145
|
+
nil
|
|
146
|
+
end
|
|
147
|
+
|
|
83
148
|
private
|
|
84
149
|
|
|
85
150
|
# Get the list of constraints, unique indexes, foreign keys in the current
|
|
@@ -104,38 +169,51 @@ module Sequel
|
|
|
104
169
|
return
|
|
105
170
|
end
|
|
106
171
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
172
|
+
cache = @pg_auto_constraint_validations_cache
|
|
173
|
+
literal_table_name = dataset.literal(table_name)
|
|
174
|
+
unless cache && (metadata = cache[literal_table_name])
|
|
175
|
+
checks = {}
|
|
176
|
+
indexes = {}
|
|
177
|
+
foreign_keys = {}
|
|
178
|
+
referenced_by = {}
|
|
111
179
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
180
|
+
db.check_constraints(table_name).each do |k, v|
|
|
181
|
+
checks[k] = v[:columns].dup.freeze unless v[:columns].empty?
|
|
182
|
+
end
|
|
183
|
+
db.indexes(table_name, :include_partial=>true).each do |k, v|
|
|
184
|
+
if v[:unique]
|
|
185
|
+
indexes[k] = v[:columns].dup.freeze
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
db.foreign_key_list(table_name, :schema=>false).each do |fk|
|
|
189
|
+
foreign_keys[fk[:name]] = fk[:columns].dup.freeze
|
|
190
|
+
end
|
|
191
|
+
db.foreign_key_list(table_name, :reverse=>true, :schema=>false).each do |fk|
|
|
192
|
+
referenced_by[[fk[:schema], fk[:table], fk[:name]].freeze] = fk[:key].dup.freeze
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
schema, table = db[:pg_class].
|
|
196
|
+
join(:pg_namespace, :oid=>:relnamespace, db.send(:regclass_oid, table_name)=>:oid).
|
|
197
|
+
get([:nspname, :relname])
|
|
198
|
+
|
|
199
|
+
metadata = {
|
|
200
|
+
:schema=>schema,
|
|
201
|
+
:table=>table,
|
|
202
|
+
:check=>checks,
|
|
203
|
+
:unique=>indexes,
|
|
204
|
+
:foreign_key=>foreign_keys,
|
|
205
|
+
:referenced_by=>referenced_by,
|
|
206
|
+
:overrides=>OPTS
|
|
207
|
+
}.freeze
|
|
208
|
+
metadata.each_value(&:freeze)
|
|
209
|
+
|
|
210
|
+
if cache
|
|
211
|
+
cache[literal_table_name] = metadata
|
|
118
212
|
end
|
|
119
|
-
end
|
|
120
|
-
db.foreign_key_list(table_name, :schema=>false).each do |fk|
|
|
121
|
-
foreign_keys[fk[:name]] = fk[:columns].dup.freeze
|
|
122
|
-
end
|
|
123
|
-
db.foreign_key_list(table_name, :reverse=>true, :schema=>false).each do |fk|
|
|
124
|
-
referenced_by[[fk[:schema], fk[:table], fk[:name]].freeze] = fk[:key].dup.freeze
|
|
125
213
|
end
|
|
126
214
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
get([:nspname, :relname])
|
|
130
|
-
|
|
131
|
-
(@pg_auto_constraint_validations = {
|
|
132
|
-
:schema=>schema,
|
|
133
|
-
:table=>table,
|
|
134
|
-
:check=>checks,
|
|
135
|
-
:unique=>indexes,
|
|
136
|
-
:foreign_key=>foreign_keys,
|
|
137
|
-
:referenced_by=>referenced_by
|
|
138
|
-
}.freeze).each_value(&:freeze)
|
|
215
|
+
@pg_auto_constraint_validations = metadata
|
|
216
|
+
nil
|
|
139
217
|
end
|
|
140
218
|
end
|
|
141
219
|
|
|
@@ -158,44 +236,54 @@ module Sequel
|
|
|
158
236
|
m = ds.method(:output_identifier)
|
|
159
237
|
schema = info[:schema]
|
|
160
238
|
table = info[:table]
|
|
239
|
+
|
|
161
240
|
if constraint = info[:constraint]
|
|
162
241
|
constraint = m.call(constraint)
|
|
242
|
+
|
|
243
|
+
columns, message = cv_info[:overrides][constraint]
|
|
244
|
+
if columns
|
|
245
|
+
override = true
|
|
246
|
+
add_pg_constraint_validation_error(columns, message)
|
|
247
|
+
end
|
|
163
248
|
end
|
|
249
|
+
|
|
164
250
|
messages = model.pg_auto_constraint_validations_messages
|
|
165
251
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
when Sequel::ForeignKeyConstraintViolation
|
|
180
|
-
message_primary = info[:message_primary]
|
|
181
|
-
if message_primary.start_with?('update')
|
|
182
|
-
# This constraint violation is different from the others, because the constraint
|
|
183
|
-
# referenced is a constraint for a different table, not for this table. This
|
|
184
|
-
# happens when another table references the current table, and the referenced
|
|
185
|
-
# column in the current update is modified such that referential integrity
|
|
186
|
-
# would be broken. Use the reverse foreign key information to figure out
|
|
187
|
-
# which column is affected in that case.
|
|
188
|
-
skip_schema_table_check = true
|
|
189
|
-
if columns = cv_info[:referenced_by][[m.call(schema), m.call(table), constraint]]
|
|
190
|
-
add_pg_constraint_validation_error(columns, messages[:referenced_by])
|
|
252
|
+
unless override
|
|
253
|
+
case e
|
|
254
|
+
when Sequel::NotNullConstraintViolation
|
|
255
|
+
if column = info[:column]
|
|
256
|
+
add_pg_constraint_validation_error([m.call(column)], messages[:not_null])
|
|
257
|
+
end
|
|
258
|
+
when Sequel::CheckConstraintViolation
|
|
259
|
+
if columns = cv_info[:check][constraint]
|
|
260
|
+
add_pg_constraint_validation_error(columns, messages[:check])
|
|
261
|
+
end
|
|
262
|
+
when Sequel::UniqueConstraintViolation
|
|
263
|
+
if columns = cv_info[:unique][constraint]
|
|
264
|
+
add_pg_constraint_validation_error(columns, messages[:unique])
|
|
191
265
|
end
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
266
|
+
when Sequel::ForeignKeyConstraintViolation
|
|
267
|
+
message_primary = info[:message_primary]
|
|
268
|
+
if message_primary.start_with?('update')
|
|
269
|
+
# This constraint violation is different from the others, because the constraint
|
|
270
|
+
# referenced is a constraint for a different table, not for this table. This
|
|
271
|
+
# happens when another table references the current table, and the referenced
|
|
272
|
+
# column in the current update is modified such that referential integrity
|
|
273
|
+
# would be broken. Use the reverse foreign key information to figure out
|
|
274
|
+
# which column is affected in that case.
|
|
275
|
+
skip_schema_table_check = true
|
|
276
|
+
if columns = cv_info[:referenced_by][[m.call(schema), m.call(table), constraint]]
|
|
277
|
+
add_pg_constraint_validation_error(columns, messages[:referenced_by])
|
|
278
|
+
end
|
|
279
|
+
elsif message_primary.start_with?('insert')
|
|
280
|
+
if columns = cv_info[:foreign_key][constraint]
|
|
281
|
+
add_pg_constraint_validation_error(columns, messages[:foreign_key])
|
|
282
|
+
end
|
|
195
283
|
end
|
|
196
284
|
end
|
|
197
285
|
end
|
|
198
|
-
rescue
|
|
286
|
+
rescue
|
|
199
287
|
# If there is an error trying to conver the constraint violation
|
|
200
288
|
# into a validation failure, it's best to just raise the constraint
|
|
201
289
|
# violation. This can make debugging the above block of code more
|
|
@@ -41,11 +41,9 @@ module Sequel
|
|
|
41
41
|
# Create a prepared statement, but modify the SQL used so that the model's columns are explicitly
|
|
42
42
|
# selected instead of using *, assuming that the dataset selects from a single table.
|
|
43
43
|
def prepare_explicit_statement(ds, type, vals=OPTS)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if f && f.length == 1 && !ds.opts[:join] && (!s || s.empty?)
|
|
48
|
-
ds = ds.public_send(meth, *columns.map{|c| Sequel.identifier(c)})
|
|
44
|
+
s = ds.opts[:returning]
|
|
45
|
+
if !s || s.empty?
|
|
46
|
+
ds = ds.returning(*columns.map{|c| Sequel.identifier(c)})
|
|
49
47
|
end
|
|
50
48
|
|
|
51
49
|
prepare_statement(ds, type, vals)
|
|
@@ -70,9 +68,7 @@ module Sequel
|
|
|
70
68
|
# Return a prepared statement that can be used to insert a row using the given columns
|
|
71
69
|
# and return that column values for the row created.
|
|
72
70
|
def prepared_insert_select(cols)
|
|
73
|
-
|
|
74
|
-
cached_prepared_statement(:insert_select, prepared_columns(cols)){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)), :insert_select, prepared_statement_key_hash(cols))}
|
|
75
|
-
end
|
|
71
|
+
cached_prepared_statement(:insert_select, prepared_columns(cols)){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)), :insert_select, prepared_statement_key_hash(cols))}
|
|
76
72
|
end
|
|
77
73
|
|
|
78
74
|
# Return an array of two element arrays with the column symbol as the first entry and the
|
|
@@ -138,9 +134,7 @@ module Sequel
|
|
|
138
134
|
# and return the new column values.
|
|
139
135
|
def _insert_select_raw(ds)
|
|
140
136
|
if use_prepared_statements_for?(:insert_select)
|
|
141
|
-
|
|
142
|
-
_set_prepared_statement_server(ps).call(@values)
|
|
143
|
-
end
|
|
137
|
+
_set_prepared_statement_server(model.send(:prepared_insert_select, @values.keys)).call(@values)
|
|
144
138
|
else
|
|
145
139
|
super
|
|
146
140
|
end
|
|
@@ -149,7 +143,7 @@ module Sequel
|
|
|
149
143
|
# Use a prepared statement to update this model's columns in the database.
|
|
150
144
|
def _update_without_checking(columns)
|
|
151
145
|
if use_prepared_statements_for?(:update)
|
|
152
|
-
_set_prepared_statement_server(model.send(:prepared_update, columns.keys)).call(
|
|
146
|
+
_set_prepared_statement_server(model.send(:prepared_update, columns.keys)).call(columns.merge(pk_hash))
|
|
153
147
|
else
|
|
154
148
|
super
|
|
155
149
|
end
|
|
@@ -66,9 +66,7 @@ module Sequel
|
|
|
66
66
|
# Merge the current values into the default values to reduce the number
|
|
67
67
|
# of free columns.
|
|
68
68
|
def before_create
|
|
69
|
-
|
|
70
|
-
@values = Hash[v].merge!(values)
|
|
71
|
-
end
|
|
69
|
+
@values = model.prepared_statements_column_defaults.merge(@values)
|
|
72
70
|
super
|
|
73
71
|
end
|
|
74
72
|
|
|
@@ -105,7 +105,6 @@ module Sequel
|
|
|
105
105
|
key_present = lambda{|m| key_conv[m].all?}
|
|
106
106
|
prkey_conv = lambda{|m| prkey_array.map{|k| m[k]}}
|
|
107
107
|
key_aliases = (0...key_array.length).map{|i| :"#{ka}_#{i}"}
|
|
108
|
-
ka_conv = lambda{|m| key_aliases.map{|k| m[k]}}
|
|
109
108
|
ancestor_base_case_columns = prkey_array.zip(key_aliases).map{|k, ka_| SQL::AliasedExpression.new(k, ka_)} + c_all
|
|
110
109
|
descendant_base_case_columns = key_array.zip(key_aliases).map{|k, ka_| SQL::AliasedExpression.new(k, ka_)} + c_all
|
|
111
110
|
recursive_case_columns = prkey_array.zip(key_aliases).map{|k, ka_| SQL::QualifiedIdentifier.new(t, ka_)} + c_all
|
|
@@ -114,20 +113,22 @@ module Sequel
|
|
|
114
113
|
key_present = key_conv = lambda{|m| m[key]}
|
|
115
114
|
prkey_conv = lambda{|m| m[prkey]}
|
|
116
115
|
key_aliases = [ka]
|
|
117
|
-
ka_conv = lambda{|m| m[ka]}
|
|
118
116
|
ancestor_base_case_columns = [SQL::AliasedExpression.new(prkey, ka)] + c_all
|
|
119
117
|
descendant_base_case_columns = [SQL::AliasedExpression.new(key, ka)] + c_all
|
|
120
118
|
recursive_case_columns = [SQL::QualifiedIdentifier.new(t, ka)] + c_all
|
|
121
119
|
extract_key_alias = lambda{|m| bd_conv[m.values.delete(ka)]}
|
|
122
120
|
end
|
|
123
121
|
|
|
124
|
-
parent = opts.merge(opts.fetch(:parent,
|
|
125
|
-
childrena = opts.merge(opts.fetch(:children,
|
|
122
|
+
parent = opts.merge(opts.fetch(:parent, OPTS)).fetch(:name, :parent)
|
|
123
|
+
childrena = opts.merge(opts.fetch(:children, OPTS)).fetch(:name, :children)
|
|
126
124
|
|
|
127
125
|
opts[:reciprocal] = nil
|
|
128
|
-
a = opts.merge(opts.fetch(:ancestors,
|
|
126
|
+
a = opts.merge(opts.fetch(:ancestors, OPTS))
|
|
129
127
|
ancestors = a.fetch(:name, :ancestors)
|
|
130
128
|
a[:read_only] = true unless a.has_key?(:read_only)
|
|
129
|
+
a[:eager_grapher] = proc do |_|
|
|
130
|
+
raise Sequel::Error, "the #{ancestors} association for #{self} does not support eager graphing"
|
|
131
|
+
end
|
|
131
132
|
a[:eager_loader_key] = key
|
|
132
133
|
a[:dataset] ||= proc do
|
|
133
134
|
base_ds = model.where(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
|
|
@@ -191,23 +192,19 @@ module Sequel
|
|
|
191
192
|
:args=>((key_aliases + col_aliases) if col_aliases))
|
|
192
193
|
ds = r.apply_eager_dataset_changes(ds)
|
|
193
194
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
194
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
195
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil)) do |obj|
|
|
195
196
|
opk = prkey_conv[obj]
|
|
196
|
-
if parent_map
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
obj = idm_obj
|
|
200
|
-
end
|
|
197
|
+
if idm_obj = parent_map[opk]
|
|
198
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
199
|
+
obj = idm_obj
|
|
201
200
|
else
|
|
202
201
|
obj.associations[parent] = nil
|
|
203
202
|
parent_map[opk] = obj
|
|
204
203
|
(children_map[key_conv[obj]] ||= []) << obj
|
|
205
204
|
end
|
|
206
205
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
root.associations[ancestors] << obj
|
|
210
|
-
end
|
|
206
|
+
id_map[extract_key_alias[obj]].each do |root|
|
|
207
|
+
root.associations[ancestors] << obj
|
|
211
208
|
end
|
|
212
209
|
end
|
|
213
210
|
parent_map.each do |parent_id, obj|
|
|
@@ -220,9 +217,12 @@ module Sequel
|
|
|
220
217
|
end
|
|
221
218
|
model.one_to_many ancestors, a
|
|
222
219
|
|
|
223
|
-
d = opts.merge(opts.fetch(:descendants,
|
|
220
|
+
d = opts.merge(opts.fetch(:descendants, OPTS))
|
|
224
221
|
descendants = d.fetch(:name, :descendants)
|
|
225
222
|
d[:read_only] = true unless d.has_key?(:read_only)
|
|
223
|
+
d[:eager_grapher] = proc do |_|
|
|
224
|
+
raise Sequel::Error, "the #{descendants} association for #{self} does not support eager graphing"
|
|
225
|
+
end
|
|
226
226
|
la = d[:level_alias] ||= :x_level_x
|
|
227
227
|
d[:dataset] ||= proc do
|
|
228
228
|
base_ds = model.where(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
|
|
@@ -296,17 +296,15 @@ module Sequel
|
|
|
296
296
|
:args=>((key_aliases + col_aliases + (level ? [la] : [])) if col_aliases))
|
|
297
297
|
ds = r.apply_eager_dataset_changes(ds)
|
|
298
298
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
299
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
299
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil, :associations=>OPTS)) do |obj|
|
|
300
300
|
if level
|
|
301
301
|
no_cache = no_cache_level == obj.values.delete(la)
|
|
302
302
|
end
|
|
303
303
|
|
|
304
304
|
opk = prkey_conv[obj]
|
|
305
|
-
if parent_map
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
obj = idm_obj
|
|
309
|
-
end
|
|
305
|
+
if idm_obj = parent_map[opk]
|
|
306
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
307
|
+
obj = idm_obj
|
|
310
308
|
else
|
|
311
309
|
obj.associations[childrena] = [] unless no_cache
|
|
312
310
|
parent_map[opk] = obj
|