sequel 5.20.0 → 5.49.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 +398 -1922
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +80 -16
- data/doc/cheat_sheet.rdoc +6 -5
- data/doc/code_order.rdoc +10 -12
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/fork_safety.rdoc +84 -0
- data/doc/migration.rdoc +11 -5
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +10 -2
- data/doc/postgresql.rdoc +82 -3
- data/doc/querying.rdoc +4 -4
- 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.39.0.txt +19 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/sharding.rdoc +2 -0
- data/doc/sql.rdoc +13 -1
- data/doc/testing.rdoc +20 -7
- data/doc/transactions.rdoc +0 -8
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +43 -35
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
- data/lib/sequel/adapters/jdbc.rb +24 -6
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +2 -3
- data/lib/sequel/adapters/odbc.rb +8 -6
- data/lib/sequel/adapters/oracle.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +15 -9
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +66 -21
- data/lib/sequel/adapters/shared/mysql.rb +27 -10
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +271 -32
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +161 -19
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +15 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +333 -319
- data/lib/sequel/database/connecting.rb +3 -4
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +31 -12
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +53 -51
- data/lib/sequel/database/schema_methods.rb +38 -23
- data/lib/sequel/database/transactions.rb +17 -18
- data/lib/sequel/dataset/actions.rb +14 -9
- data/lib/sequel/dataset/features.rb +16 -0
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +26 -9
- data/lib/sequel/dataset/sql.rb +76 -25
- data/lib/sequel/dataset.rb +4 -2
- 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/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/date_arithmetic.rb +36 -24
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- 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/inflector.rb +9 -1
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -3
- data/lib/sequel/extensions/named_timezones.rb +56 -8
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +5 -0
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +11 -3
- data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +36 -8
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +238 -0
- data/lib/sequel/extensions/pg_loose_count.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +17 -9
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +4 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +3 -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 +24 -7
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -1
- 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/associations.rb +356 -117
- data/lib/sequel/model/base.rb +107 -68
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- 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 +60 -18
- data/lib/sequel/plugins/association_proxies.rb +8 -2
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_validations.rb +39 -5
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- 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 +33 -28
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/composition.rb +7 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +2 -1
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/dataset_associations.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/json_serializer.rb +57 -35
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +108 -9
- data/lib/sequel/plugins/nested_attributes.rb +15 -3
- data/lib/sequel/plugins/pg_array_associations.rb +58 -41
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
- data/lib/sequel/plugins/prepared_statements.rb +15 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +43 -35
- data/lib/sequel/plugins/serialization.rb +8 -3
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +11 -5
- data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +9 -4
- 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/throw_failures.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/tree.rb +9 -4
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validation_class_methods.rb +5 -1
- data/lib/sequel/plugins/validation_helpers.rb +18 -11
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +20 -5
- data/lib/sequel/timezones.rb +63 -17
- data/lib/sequel/version.rb +1 -1
- metadata +113 -381
- 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 -1065
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4125
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2865
- data/spec/core/dataset_spec.rb +0 -5515
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1455
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- 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 -1826
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- 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 -28
- 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 -229
- 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/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- 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 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- 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 -150
- 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/eager_graph_eager_spec.rb +0 -100
- 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/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- 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 -402
- 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 -291
- 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 -864
- 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 -111
- data/spec/extensions/nested_attributes_spec.rb +0 -767
- 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 -172
- data/spec/extensions/pg_enum_spec.rb +0 -118
- 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 -519
- 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 -177
- 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 -870
- 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 -63
- 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 -471
- 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 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- 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 -334
- 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 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1981
- 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 -2396
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -889
- data/spec/integration/spec_helper.rb +0 -65
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- 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 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- 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
|
@@ -341,10 +341,9 @@ module Sequel
|
|
|
341
341
|
eo[:loader] = false
|
|
342
342
|
|
|
343
343
|
eager_load_results(opts, eo) do |assoc_record|
|
|
344
|
-
if pks
|
|
344
|
+
if pks = assoc_record.get_column_value(key)
|
|
345
345
|
pks.each do |pkv|
|
|
346
|
-
|
|
347
|
-
objects.each do |object|
|
|
346
|
+
id_map[pkv].each do |object|
|
|
348
347
|
object.associations[name].push(assoc_record)
|
|
349
348
|
end
|
|
350
349
|
end
|
|
@@ -385,26 +384,32 @@ module Sequel
|
|
|
385
384
|
save_opts = {:validate=>opts[:validate]}
|
|
386
385
|
save_opts[:raise_on_failure] = opts[:raise_on_save_failure] != false
|
|
387
386
|
|
|
388
|
-
opts
|
|
389
|
-
|
|
390
|
-
array
|
|
391
|
-
|
|
392
|
-
|
|
387
|
+
unless opts.has_key?(:adder)
|
|
388
|
+
opts[:adder] = proc do |o|
|
|
389
|
+
if array = o.get_column_value(key)
|
|
390
|
+
array << get_column_value(pk)
|
|
391
|
+
else
|
|
392
|
+
o.set_column_value("#{key}=", Sequel.pg_array([get_column_value(pk)], opts.array_type))
|
|
393
|
+
end
|
|
394
|
+
o.save(save_opts)
|
|
393
395
|
end
|
|
394
|
-
o.save(save_opts)
|
|
395
396
|
end
|
|
396
|
-
|
|
397
|
-
opts
|
|
398
|
-
|
|
399
|
-
array.
|
|
400
|
-
|
|
397
|
+
|
|
398
|
+
unless opts.has_key?(:remover)
|
|
399
|
+
opts[:remover] = proc do |o|
|
|
400
|
+
if (array = o.get_column_value(key)) && !array.empty?
|
|
401
|
+
array.delete(get_column_value(pk))
|
|
402
|
+
o.save(save_opts)
|
|
403
|
+
end
|
|
401
404
|
end
|
|
402
405
|
end
|
|
403
406
|
|
|
404
|
-
opts
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
407
|
+
unless opts.has_key?(:clearer)
|
|
408
|
+
opts[:clearer] = proc do
|
|
409
|
+
pk_value = get_column_value(pk)
|
|
410
|
+
db_type = opts.array_type
|
|
411
|
+
opts.associated_dataset.where(Sequel.pg_array_op(key).contains(Sequel.pg_array([pk_value], db_type))).update(key=>Sequel.function(:array_remove, key, Sequel.cast(pk_value, db_type)))
|
|
412
|
+
end
|
|
408
413
|
end
|
|
409
414
|
end
|
|
410
415
|
|
|
@@ -427,10 +432,12 @@ module Sequel
|
|
|
427
432
|
id_map = {}
|
|
428
433
|
pkm = opts.primary_key_method
|
|
429
434
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
associated_pks
|
|
433
|
-
|
|
435
|
+
Sequel.synchronize_with(eo[:mutex]) do
|
|
436
|
+
rows.each do |object|
|
|
437
|
+
if associated_pks = object.get_column_value(key)
|
|
438
|
+
associated_pks.each do |apk|
|
|
439
|
+
(id_map[apk] ||= []) << object
|
|
440
|
+
end
|
|
434
441
|
end
|
|
435
442
|
end
|
|
436
443
|
end
|
|
@@ -485,30 +492,36 @@ module Sequel
|
|
|
485
492
|
end
|
|
486
493
|
end
|
|
487
494
|
|
|
488
|
-
opts
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
+
unless opts.has_key?(:adder)
|
|
496
|
+
opts[:adder] = proc do |o|
|
|
497
|
+
opk = o.get_column_value(opts.primary_key)
|
|
498
|
+
if array = get_column_value(key)
|
|
499
|
+
modified!(key)
|
|
500
|
+
array << opk
|
|
501
|
+
else
|
|
502
|
+
set_column_value("#{key}=", Sequel.pg_array([opk], opts.array_type))
|
|
503
|
+
end
|
|
504
|
+
save_after_modify.call(self) if save_after_modify
|
|
495
505
|
end
|
|
496
|
-
save_after_modify.call(self) if save_after_modify
|
|
497
506
|
end
|
|
498
|
-
|
|
499
|
-
opts
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
507
|
+
|
|
508
|
+
unless opts.has_key?(:remover)
|
|
509
|
+
opts[:remover] = proc do |o|
|
|
510
|
+
if (array = get_column_value(key)) && !array.empty?
|
|
511
|
+
modified!(key)
|
|
512
|
+
array.delete(o.get_column_value(opts.primary_key))
|
|
513
|
+
save_after_modify.call(self) if save_after_modify
|
|
514
|
+
end
|
|
504
515
|
end
|
|
505
516
|
end
|
|
506
517
|
|
|
507
|
-
opts
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
518
|
+
unless opts.has_key?(:clearer)
|
|
519
|
+
opts[:clearer] = proc do
|
|
520
|
+
if (array = get_column_value(key)) && !array.empty?
|
|
521
|
+
modified!(key)
|
|
522
|
+
array.clear
|
|
523
|
+
save_after_modify.call(self) if save_after_modify
|
|
524
|
+
end
|
|
512
525
|
end
|
|
513
526
|
end
|
|
514
527
|
end
|
|
@@ -521,7 +534,9 @@ module Sequel
|
|
|
521
534
|
def many_to_pg_array_association_filter_expression(op, ref, obj)
|
|
522
535
|
pk = ref.qualify(model.table_name, ref.primary_key)
|
|
523
536
|
key = ref[:key]
|
|
537
|
+
# :nocov:
|
|
524
538
|
expr = case obj
|
|
539
|
+
# :nocov:
|
|
525
540
|
when Sequel::Model
|
|
526
541
|
if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
|
|
527
542
|
Sequel[pk=>assoc_pks.to_a]
|
|
@@ -541,7 +556,9 @@ module Sequel
|
|
|
541
556
|
# Support filtering by pg_array_to_many associations using a subquery.
|
|
542
557
|
def pg_array_to_many_association_filter_expression(op, ref, obj)
|
|
543
558
|
key = ref.qualify(model.table_name, ref[:key_column])
|
|
559
|
+
# :nocov:
|
|
544
560
|
expr = case obj
|
|
561
|
+
# :nocov:
|
|
545
562
|
when Sequel::Model
|
|
546
563
|
if pkv = obj.get_column_value(ref.primary_key_method)
|
|
547
564
|
Sequel.pg_array_op(key).contains(Sequel.pg_array([pkv], ref.array_type))
|
|
@@ -45,6 +45,31 @@ module Sequel
|
|
|
45
45
|
# to be associated to particular column(s), and use a specific error message:
|
|
46
46
|
#
|
|
47
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.
|
|
48
73
|
#
|
|
49
74
|
# Usage:
|
|
50
75
|
#
|
|
@@ -67,13 +92,28 @@ module Sequel
|
|
|
67
92
|
}.freeze).each_value(&:freeze)
|
|
68
93
|
|
|
69
94
|
# Setup the constraint violation metadata. Options:
|
|
95
|
+
# :cache_file :: File storing cached metadata, to avoid queries for each model
|
|
70
96
|
# :messages :: Override the default error messages for each constraint
|
|
71
97
|
# violation type (:not_null, :check, :unique, :foreign_key, :referenced_by)
|
|
72
98
|
def self.configure(model, opts=OPTS)
|
|
73
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
|
+
|
|
74
113
|
setup_pg_auto_constraint_validations
|
|
75
114
|
@pg_auto_constraint_validations_messages = (@pg_auto_constraint_validations_messages || DEFAULT_ERROR_MESSAGES).merge(opts[:messages] || OPTS).freeze
|
|
76
115
|
end
|
|
116
|
+
nil
|
|
77
117
|
end
|
|
78
118
|
|
|
79
119
|
module ClassMethods
|
|
@@ -85,9 +125,16 @@ module Sequel
|
|
|
85
125
|
# generated validation failures.
|
|
86
126
|
attr_reader :pg_auto_constraint_validations_messages
|
|
87
127
|
|
|
88
|
-
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)
|
|
89
129
|
Plugins.after_set_dataset(self, :setup_pg_auto_constraint_validations)
|
|
90
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
|
+
|
|
91
138
|
# Override the constraint validation columns and message for a given constraint
|
|
92
139
|
def pg_auto_constraint_validation_override(constraint, columns, message)
|
|
93
140
|
pgacv = Hash[@pg_auto_constraint_validations]
|
|
@@ -122,39 +169,51 @@ module Sequel
|
|
|
122
169
|
return
|
|
123
170
|
end
|
|
124
171
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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 = {}
|
|
129
179
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
136
212
|
end
|
|
137
|
-
end
|
|
138
|
-
db.foreign_key_list(table_name, :schema=>false).each do |fk|
|
|
139
|
-
foreign_keys[fk[:name]] = fk[:columns].dup.freeze
|
|
140
|
-
end
|
|
141
|
-
db.foreign_key_list(table_name, :reverse=>true, :schema=>false).each do |fk|
|
|
142
|
-
referenced_by[[fk[:schema], fk[:table], fk[:name]].freeze] = fk[:key].dup.freeze
|
|
143
213
|
end
|
|
144
214
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
get([:nspname, :relname])
|
|
148
|
-
|
|
149
|
-
(@pg_auto_constraint_validations = {
|
|
150
|
-
:schema=>schema,
|
|
151
|
-
:table=>table,
|
|
152
|
-
:check=>checks,
|
|
153
|
-
:unique=>indexes,
|
|
154
|
-
:foreign_key=>foreign_keys,
|
|
155
|
-
:referenced_by=>referenced_by,
|
|
156
|
-
:overrides=>OPTS
|
|
157
|
-
}.freeze).each_value(&:freeze)
|
|
215
|
+
@pg_auto_constraint_validations = metadata
|
|
216
|
+
nil
|
|
158
217
|
end
|
|
159
218
|
end
|
|
160
219
|
|
|
@@ -191,7 +250,9 @@ module Sequel
|
|
|
191
250
|
messages = model.pg_auto_constraint_validations_messages
|
|
192
251
|
|
|
193
252
|
unless override
|
|
253
|
+
# :nocov:
|
|
194
254
|
case e
|
|
255
|
+
# :nocov:
|
|
195
256
|
when Sequel::NotNullConstraintViolation
|
|
196
257
|
if column = info[:column]
|
|
197
258
|
add_pg_constraint_validation_error([m.call(column)], messages[:not_null])
|
|
@@ -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
|
|
@@ -175,8 +169,17 @@ module Sequel
|
|
|
175
169
|
end
|
|
176
170
|
|
|
177
171
|
case type
|
|
178
|
-
when :insert, :
|
|
172
|
+
when :insert, :update
|
|
179
173
|
true
|
|
174
|
+
when :insert_select
|
|
175
|
+
# SQLite RETURNING support has a bug that doesn't allow for committing transactions
|
|
176
|
+
# when a prepared statement with RETURNING has been used on the connection:
|
|
177
|
+
#
|
|
178
|
+
# SQLite3::BusyException: cannot commit transaction - SQL statements in progress: COMMIT
|
|
179
|
+
#
|
|
180
|
+
# Disabling usage of prepared statements for insert_select on SQLite seems to be the
|
|
181
|
+
# simplest way to workaround the problem.
|
|
182
|
+
db.database_type != :sqlite
|
|
180
183
|
# :nocov:
|
|
181
184
|
when :delete, :refresh
|
|
182
185
|
Sequel::Deprecation.deprecate("The :delete and :refresh prepared statement types", "There should be no need to check if these types are supported")
|
|
@@ -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 = v.merge(values)
|
|
71
|
-
end
|
|
69
|
+
@values = model.prepared_statements_column_defaults.merge(@values)
|
|
72
70
|
super
|
|
73
71
|
end
|
|
74
72
|
|
|
@@ -126,6 +126,9 @@ module Sequel
|
|
|
126
126
|
a = opts.merge(opts.fetch(:ancestors, OPTS))
|
|
127
127
|
ancestors = a.fetch(:name, :ancestors)
|
|
128
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
|
|
129
132
|
a[:eager_loader_key] = key
|
|
130
133
|
a[:dataset] ||= proc do
|
|
131
134
|
base_ds = model.where(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
|
|
@@ -167,11 +170,13 @@ module Sequel
|
|
|
167
170
|
id_map = eo[:id_map]
|
|
168
171
|
parent_map = {}
|
|
169
172
|
children_map = {}
|
|
170
|
-
eo[:
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
Sequel.synchronize_with(eo[:mutex]) do
|
|
174
|
+
eo[:rows].each do |obj|
|
|
175
|
+
parent_map[prkey_conv[obj]] = obj
|
|
176
|
+
(children_map[key_conv[obj]] ||= []) << obj
|
|
177
|
+
obj.associations[ancestors] = []
|
|
178
|
+
obj.associations[parent] = nil
|
|
179
|
+
end
|
|
175
180
|
end
|
|
176
181
|
r = model.association_reflection(ancestors)
|
|
177
182
|
base_case = model.where(prkey=>id_map.keys).
|
|
@@ -189,29 +194,27 @@ module Sequel
|
|
|
189
194
|
:args=>((key_aliases + col_aliases) if col_aliases))
|
|
190
195
|
ds = r.apply_eager_dataset_changes(ds)
|
|
191
196
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
192
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
197
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil)) do |obj|
|
|
193
198
|
opk = prkey_conv[obj]
|
|
194
|
-
if parent_map
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
obj = idm_obj
|
|
198
|
-
end
|
|
199
|
+
if idm_obj = parent_map[opk]
|
|
200
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
201
|
+
obj = idm_obj
|
|
199
202
|
else
|
|
200
203
|
obj.associations[parent] = nil
|
|
201
204
|
parent_map[opk] = obj
|
|
202
205
|
(children_map[key_conv[obj]] ||= []) << obj
|
|
203
206
|
end
|
|
204
207
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
root.associations[ancestors] << obj
|
|
208
|
-
end
|
|
208
|
+
id_map[extract_key_alias[obj]].each do |root|
|
|
209
|
+
root.associations[ancestors] << obj
|
|
209
210
|
end
|
|
210
211
|
end
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
children
|
|
214
|
-
|
|
212
|
+
Sequel.synchronize_with(eo[:mutex]) do
|
|
213
|
+
parent_map.each do |parent_id, obj|
|
|
214
|
+
if children = children_map[parent_id]
|
|
215
|
+
children.each do |child|
|
|
216
|
+
child.associations[parent] = obj
|
|
217
|
+
end
|
|
215
218
|
end
|
|
216
219
|
end
|
|
217
220
|
end
|
|
@@ -221,6 +224,9 @@ module Sequel
|
|
|
221
224
|
d = opts.merge(opts.fetch(:descendants, OPTS))
|
|
222
225
|
descendants = d.fetch(:name, :descendants)
|
|
223
226
|
d[:read_only] = true unless d.has_key?(:read_only)
|
|
227
|
+
d[:eager_grapher] = proc do |_|
|
|
228
|
+
raise Sequel::Error, "the #{descendants} association for #{self} does not support eager graphing"
|
|
229
|
+
end
|
|
224
230
|
la = d[:level_alias] ||= :x_level_x
|
|
225
231
|
d[:dataset] ||= proc do
|
|
226
232
|
base_ds = model.where(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
|
|
@@ -266,10 +272,12 @@ module Sequel
|
|
|
266
272
|
associations = eo[:associations]
|
|
267
273
|
parent_map = {}
|
|
268
274
|
children_map = {}
|
|
269
|
-
eo[:
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
275
|
+
Sequel.synchronize_with(eo[:mutex]) do
|
|
276
|
+
eo[:rows].each do |obj|
|
|
277
|
+
parent_map[prkey_conv[obj]] = obj
|
|
278
|
+
obj.associations[descendants] = []
|
|
279
|
+
obj.associations[childrena] = []
|
|
280
|
+
end
|
|
273
281
|
end
|
|
274
282
|
r = model.association_reflection(descendants)
|
|
275
283
|
base_case = model.where(key=>id_map.keys).
|
|
@@ -294,17 +302,15 @@ module Sequel
|
|
|
294
302
|
:args=>((key_aliases + col_aliases + (level ? [la] : [])) if col_aliases))
|
|
295
303
|
ds = r.apply_eager_dataset_changes(ds)
|
|
296
304
|
ds = ds.select_append(ka) unless ds.opts[:select] == nil
|
|
297
|
-
model.eager_load_results(r, eo.merge(:loader=>false, :
|
|
305
|
+
model.eager_load_results(r, eo.merge(:loader=>false, :initialize_rows=>false, :dataset=>ds, :id_map=>nil, :associations=>OPTS)) do |obj|
|
|
298
306
|
if level
|
|
299
307
|
no_cache = no_cache_level == obj.values.delete(la)
|
|
300
308
|
end
|
|
301
309
|
|
|
302
310
|
opk = prkey_conv[obj]
|
|
303
|
-
if parent_map
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
obj = idm_obj
|
|
307
|
-
end
|
|
311
|
+
if idm_obj = parent_map[opk]
|
|
312
|
+
key_aliases.each{|ka_| idm_obj.values[ka_] = obj.values[ka_]}
|
|
313
|
+
obj = idm_obj
|
|
308
314
|
else
|
|
309
315
|
obj.associations[childrena] = [] unless no_cache
|
|
310
316
|
parent_map[opk] = obj
|
|
@@ -316,12 +322,14 @@ module Sequel
|
|
|
316
322
|
|
|
317
323
|
(children_map[key_conv[obj]] ||= []) << obj
|
|
318
324
|
end
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
+
Sequel.synchronize_with(eo[:mutex]) do
|
|
326
|
+
children_map.each do |parent_id, objs|
|
|
327
|
+
objs = objs.uniq
|
|
328
|
+
parent_obj = parent_map[parent_id]
|
|
329
|
+
parent_obj.associations[childrena] = objs
|
|
330
|
+
objs.each do |obj|
|
|
331
|
+
obj.associations[parent] = parent_obj
|
|
332
|
+
end
|
|
325
333
|
end
|
|
326
334
|
end
|
|
327
335
|
end
|
|
@@ -127,7 +127,7 @@ module Sequel
|
|
|
127
127
|
def serialize_attributes(format, *columns)
|
|
128
128
|
if format.is_a?(Symbol)
|
|
129
129
|
unless format = Sequel.synchronize{REGISTERED_FORMATS[format]}
|
|
130
|
-
raise(Error, "Unsupported serialization format: #{format} (valid formats: #{Sequel.synchronize{REGISTERED_FORMATS.keys}.
|
|
130
|
+
raise(Error, "Unsupported serialization format: #{format} (valid formats: #{Sequel.synchronize{REGISTERED_FORMATS.keys}.inspect})")
|
|
131
131
|
end
|
|
132
132
|
end
|
|
133
133
|
serializer, deserializer = format
|
|
@@ -154,7 +154,10 @@ module Sequel
|
|
|
154
154
|
deserialized_values[column] = deserialize_value(column, super())
|
|
155
155
|
end
|
|
156
156
|
end
|
|
157
|
-
|
|
157
|
+
alias_method(column, column)
|
|
158
|
+
|
|
159
|
+
setter = :"#{column}="
|
|
160
|
+
define_method(setter) do |v|
|
|
158
161
|
cc = changed_columns
|
|
159
162
|
if !cc.include?(column) && (new? || get_column_value(column) != v)
|
|
160
163
|
cc << column
|
|
@@ -164,6 +167,7 @@ module Sequel
|
|
|
164
167
|
|
|
165
168
|
deserialized_values[column] = v
|
|
166
169
|
end
|
|
170
|
+
alias_method(setter, setter)
|
|
167
171
|
end
|
|
168
172
|
end
|
|
169
173
|
end
|
|
@@ -177,8 +181,9 @@ module Sequel
|
|
|
177
181
|
|
|
178
182
|
# Freeze the deserialized values
|
|
179
183
|
def freeze
|
|
180
|
-
deserialized_values
|
|
184
|
+
deserialized_values
|
|
181
185
|
super
|
|
186
|
+
deserialized_values.freeze
|
|
182
187
|
end
|
|
183
188
|
|
|
184
189
|
# Serialize deserialized values before saving
|
|
@@ -107,12 +107,18 @@ module Sequel
|
|
|
107
107
|
# previous row_proc, but calls set_server on the output of that row_proc,
|
|
108
108
|
# ensuring that objects retrieved by a specific shard know which shard they
|
|
109
109
|
# are tied to.
|
|
110
|
-
def
|
|
111
|
-
|
|
112
|
-
if rp
|
|
113
|
-
|
|
110
|
+
def row_proc
|
|
111
|
+
rp = super
|
|
112
|
+
if rp
|
|
113
|
+
case server = db.pool.send(:pick_server, opts[:server])
|
|
114
|
+
when nil, :default, :read_only
|
|
115
|
+
# nothing
|
|
116
|
+
else
|
|
117
|
+
old_rp = rp
|
|
118
|
+
rp = proc{|r| old_rp.call(r).set_server(server)}
|
|
119
|
+
end
|
|
114
120
|
end
|
|
115
|
-
|
|
121
|
+
rp
|
|
116
122
|
end
|
|
117
123
|
end
|
|
118
124
|
end
|
|
@@ -163,21 +163,6 @@ module Sequel
|
|
|
163
163
|
super
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
-
# Copy the necessary attributes to the subclasses, and filter the
|
|
167
|
-
# subclass's dataset based on the sti_kep_map entry for the class.
|
|
168
|
-
def inherited(subclass)
|
|
169
|
-
super
|
|
170
|
-
key = Array(sti_key_map[subclass]).dup
|
|
171
|
-
sti_subclass_added(key)
|
|
172
|
-
rp = dataset.row_proc
|
|
173
|
-
subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
|
|
174
|
-
subclass.instance_exec do
|
|
175
|
-
@dataset = @dataset.with_row_proc(rp)
|
|
176
|
-
@sti_key_array = key
|
|
177
|
-
self.simple_table = nil
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
|
|
181
166
|
# Return an instance of the class specified by sti_key,
|
|
182
167
|
# used by the row_proc.
|
|
183
168
|
def sti_load(r)
|
|
@@ -208,6 +193,21 @@ module Sequel
|
|
|
208
193
|
super
|
|
209
194
|
end
|
|
210
195
|
|
|
196
|
+
# Copy the necessary attributes to the subclasses, and filter the
|
|
197
|
+
# subclass's dataset based on the sti_kep_map entry for the class.
|
|
198
|
+
def inherited(subclass)
|
|
199
|
+
super
|
|
200
|
+
key = Array(sti_key_map[subclass]).dup
|
|
201
|
+
sti_subclass_added(key)
|
|
202
|
+
rp = dataset.row_proc
|
|
203
|
+
subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
|
|
204
|
+
subclass.instance_exec do
|
|
205
|
+
@dataset = @dataset.with_row_proc(rp)
|
|
206
|
+
@sti_key_array = key
|
|
207
|
+
self.simple_table = nil
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
211
|
# If calling set_dataset manually, make sure to set the dataset
|
|
212
212
|
# row proc to one that handles inheritance correctly.
|
|
213
213
|
def set_dataset_row_proc(ds)
|
|
@@ -250,6 +250,13 @@ module Sequel
|
|
|
250
250
|
end
|
|
251
251
|
super
|
|
252
252
|
end
|
|
253
|
+
|
|
254
|
+
private
|
|
255
|
+
|
|
256
|
+
# Don't allow use of prepared statements.
|
|
257
|
+
def use_prepared_statements_for?(type)
|
|
258
|
+
false
|
|
259
|
+
end
|
|
253
260
|
end
|
|
254
261
|
end
|
|
255
262
|
end
|