sequel 4.26.0 → 5.37.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 +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.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.2.0.txt +33 -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.3.0.txt +121 -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.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- 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 +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- 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.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- 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/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- 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 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- 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 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- 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 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- 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/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/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/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 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# This plugin implements a simple database-independent locking mechanism
|
|
@@ -9,11 +11,11 @@ module Sequel
|
|
|
9
11
|
# end
|
|
10
12
|
# p1 = Person[1]
|
|
11
13
|
# p2 = Person[1]
|
|
12
|
-
# p1.update(:
|
|
13
|
-
# p2.update(:
|
|
14
|
+
# p1.update(name: 'Jim') # works
|
|
15
|
+
# p2.update(name: 'Bob') # raises Sequel::Plugins::OptimisticLocking::Error
|
|
14
16
|
#
|
|
15
17
|
# In order for this plugin to work, you need to make sure that the database
|
|
16
|
-
# table has a lock_version column (or other column you name via the lock_column
|
|
18
|
+
# table has a +lock_version+ column (or other column you name via the lock_column
|
|
17
19
|
# class level accessor) that defaults to 0.
|
|
18
20
|
#
|
|
19
21
|
# This plugin relies on the instance_filters plugin.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
extension :pg_array, :pg_array_ops
|
|
3
5
|
|
|
@@ -73,12 +75,12 @@ module Sequel
|
|
|
73
75
|
module PgArrayAssociations
|
|
74
76
|
# The AssociationReflection subclass for many_to_pg_array associations.
|
|
75
77
|
class ManyToPgArrayAssociationReflection < Sequel::Model::Associations::AssociationReflection
|
|
76
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:many_to_pg_array] = self
|
|
78
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:many_to_pg_array] = self}
|
|
77
79
|
|
|
78
80
|
def array_type
|
|
79
81
|
cached_fetch(:array_type) do
|
|
80
82
|
if (sch = associated_class.db_schema) && (s = sch[self[:key]]) && (t = s[:db_type])
|
|
81
|
-
t
|
|
83
|
+
t.sub(/\[\]\z/, '').freeze
|
|
82
84
|
else
|
|
83
85
|
:integer
|
|
84
86
|
end
|
|
@@ -120,6 +122,13 @@ module Sequel
|
|
|
120
122
|
nil
|
|
121
123
|
end
|
|
122
124
|
|
|
125
|
+
FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
|
|
126
|
+
:array_type=>:array_type
|
|
127
|
+
).freeze
|
|
128
|
+
def finalize_settings
|
|
129
|
+
FINALIZE_SETTINGS
|
|
130
|
+
end
|
|
131
|
+
|
|
123
132
|
# Handle silent failure of add/remove methods if raise_on_save_failure is false.
|
|
124
133
|
def handle_silent_modification_failure?
|
|
125
134
|
self[:raise_on_save_failure] == false
|
|
@@ -151,7 +160,7 @@ module Sequel
|
|
|
151
160
|
|
|
152
161
|
def filter_by_associations_add_conditions_dataset_filter(ds)
|
|
153
162
|
key = qualify(associated_class.table_name, self[:key])
|
|
154
|
-
ds.
|
|
163
|
+
ds.cross_join(Sequel.function(:unnest, key).as(:_smtopgaa_, [:_smtopgaa_key_])).exclude(key=>nil).select(:_smtopgaa_key_)
|
|
155
164
|
end
|
|
156
165
|
|
|
157
166
|
def filter_by_associations_conditions_key
|
|
@@ -175,12 +184,12 @@ module Sequel
|
|
|
175
184
|
|
|
176
185
|
# The AssociationReflection subclass for pg_array_to_many associations.
|
|
177
186
|
class PgArrayToManyAssociationReflection < Sequel::Model::Associations::AssociationReflection
|
|
178
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:pg_array_to_many] = self
|
|
187
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:pg_array_to_many] = self}
|
|
179
188
|
|
|
180
189
|
def array_type
|
|
181
190
|
cached_fetch(:array_type) do
|
|
182
191
|
if (sch = self[:model].db_schema) && (s = sch[self[:key]]) && (t = s[:db_type])
|
|
183
|
-
t
|
|
192
|
+
t.sub(/\[\]\z/, '').freeze
|
|
184
193
|
else
|
|
185
194
|
:integer
|
|
186
195
|
end
|
|
@@ -227,6 +236,15 @@ module Sequel
|
|
|
227
236
|
nil
|
|
228
237
|
end
|
|
229
238
|
|
|
239
|
+
FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
|
|
240
|
+
:array_type=>:array_type,
|
|
241
|
+
:primary_key=>:primary_key,
|
|
242
|
+
:primary_key_method=>:primary_key_method
|
|
243
|
+
).freeze
|
|
244
|
+
def finalize_settings
|
|
245
|
+
FINALIZE_SETTINGS
|
|
246
|
+
end
|
|
247
|
+
|
|
230
248
|
# Handle silent failure of add/remove methods if raise_on_save_failure is false
|
|
231
249
|
# and save_after_modify is true.
|
|
232
250
|
def handle_silent_modification_failure?
|
|
@@ -279,6 +297,11 @@ module Sequel
|
|
|
279
297
|
end
|
|
280
298
|
end
|
|
281
299
|
|
|
300
|
+
# Add the pg_array extension to the database
|
|
301
|
+
def self.apply(model)
|
|
302
|
+
model.db.extension(:pg_array)
|
|
303
|
+
end
|
|
304
|
+
|
|
282
305
|
module ClassMethods
|
|
283
306
|
# Create a many_to_pg_array association, for the case where the associated
|
|
284
307
|
# table contains the array with foreign keys pointing to the current table.
|
|
@@ -305,18 +328,22 @@ module Sequel
|
|
|
305
328
|
opts[:key] = opts.default_key unless opts.has_key?(:key)
|
|
306
329
|
key = opts[:key]
|
|
307
330
|
key_column = opts[:key_column] ||= opts[:key]
|
|
308
|
-
|
|
331
|
+
if opts[:uniq]
|
|
332
|
+
opts[:after_load] ||= []
|
|
333
|
+
opts[:after_load].unshift(:array_uniq!)
|
|
334
|
+
end
|
|
309
335
|
opts[:dataset] ||= lambda do
|
|
310
336
|
opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([get_column_value(pk)], opts.array_type)))
|
|
311
337
|
end
|
|
312
338
|
opts[:eager_loader] ||= proc do |eo|
|
|
313
339
|
id_map = eo[:id_map]
|
|
340
|
+
eo = Hash[eo]
|
|
341
|
+
eo[:loader] = false
|
|
314
342
|
|
|
315
|
-
eager_load_results(opts,
|
|
316
|
-
if pks
|
|
343
|
+
eager_load_results(opts, eo) do |assoc_record|
|
|
344
|
+
if pks = assoc_record.get_column_value(key)
|
|
317
345
|
pks.each do |pkv|
|
|
318
|
-
|
|
319
|
-
objects.each do |object|
|
|
346
|
+
id_map[pkv].each do |object|
|
|
320
347
|
object.associations[name].push(assoc_record)
|
|
321
348
|
end
|
|
322
349
|
end
|
|
@@ -348,7 +375,7 @@ module Sequel
|
|
|
348
375
|
|
|
349
376
|
opts[:eager_grapher] ||= proc do |eo|
|
|
350
377
|
ds = eo[:self]
|
|
351
|
-
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)
|
|
352
379
|
ds
|
|
353
380
|
end
|
|
354
381
|
|
|
@@ -374,7 +401,9 @@ module Sequel
|
|
|
374
401
|
end
|
|
375
402
|
|
|
376
403
|
opts[:clearer] ||= proc do
|
|
377
|
-
|
|
404
|
+
pk_value = get_column_value(pk)
|
|
405
|
+
db_type = opts.array_type
|
|
406
|
+
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)))
|
|
378
407
|
end
|
|
379
408
|
end
|
|
380
409
|
|
|
@@ -385,7 +414,10 @@ module Sequel
|
|
|
385
414
|
key = opts[:key]
|
|
386
415
|
key_column = opts[:key_column] ||= key
|
|
387
416
|
opts[:eager_loader_key] = nil
|
|
388
|
-
|
|
417
|
+
if opts[:uniq]
|
|
418
|
+
opts[:after_load] ||= []
|
|
419
|
+
opts[:after_load].unshift(:array_uniq!)
|
|
420
|
+
end
|
|
389
421
|
opts[:dataset] ||= lambda do
|
|
390
422
|
opts.associated_dataset.where(opts.predicate_key=>get_column_value(key).to_a)
|
|
391
423
|
end
|
|
@@ -402,7 +434,9 @@ module Sequel
|
|
|
402
434
|
end
|
|
403
435
|
end
|
|
404
436
|
|
|
405
|
-
|
|
437
|
+
eo = Hash[eo]
|
|
438
|
+
eo[:id_map] = id_map
|
|
439
|
+
eager_load_results(opts, eo) do |assoc_record|
|
|
406
440
|
if objects = id_map[assoc_record.get_column_value(pkm)]
|
|
407
441
|
objects.each do |object|
|
|
408
442
|
object.associations[name].push(assoc_record)
|
|
@@ -435,7 +469,7 @@ module Sequel
|
|
|
435
469
|
|
|
436
470
|
opts[:eager_grapher] ||= proc do |eo|
|
|
437
471
|
ds = eo[:self]
|
|
438
|
-
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)
|
|
439
473
|
ds
|
|
440
474
|
end
|
|
441
475
|
|
|
@@ -489,14 +523,14 @@ module Sequel
|
|
|
489
523
|
expr = case obj
|
|
490
524
|
when Sequel::Model
|
|
491
525
|
if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
|
|
492
|
-
Sequel
|
|
526
|
+
Sequel[pk=>assoc_pks.to_a]
|
|
493
527
|
end
|
|
494
528
|
when Array
|
|
495
529
|
if (assoc_pks = obj.map{|o| o.get_column_value(key)}.flatten.compact.uniq) && !assoc_pks.empty?
|
|
496
|
-
Sequel
|
|
530
|
+
Sequel[pk=>assoc_pks]
|
|
497
531
|
end
|
|
498
532
|
when Sequel::Dataset
|
|
499
|
-
|
|
533
|
+
obj.select(ref.qualify(obj.model.table_name, ref[:key_column]).as(:key)).from_self.where{{pk=>any(:key)}}.select(1).exists
|
|
500
534
|
end
|
|
501
535
|
expr = Sequel::SQL::Constants::FALSE unless expr
|
|
502
536
|
expr = add_association_filter_conditions(ref, obj, expr)
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module Plugins
|
|
5
|
+
# The pg_auto_constraint_validations plugin automatically converts some constraint
|
|
6
|
+
# violation exceptions that are raised by INSERT/UPDATE queries into validation
|
|
7
|
+
# failures. This can allow for using the same error handling code for both
|
|
8
|
+
# regular validation errors (checked before attempting the INSERT/UPDATE), and
|
|
9
|
+
# constraint violations (raised during the INSERT/UPDATE).
|
|
10
|
+
#
|
|
11
|
+
# This handles the following constraint violations:
|
|
12
|
+
#
|
|
13
|
+
# * NOT NULL
|
|
14
|
+
# * CHECK
|
|
15
|
+
# * UNIQUE (except expression/functional indexes)
|
|
16
|
+
# * FOREIGN KEY (both referencing and referenced by)
|
|
17
|
+
#
|
|
18
|
+
# If the plugin cannot convert the constraint violation error to a validation
|
|
19
|
+
# error, it just reraises the initial exception, so this should not cause
|
|
20
|
+
# problems if the plugin doesn't know how to convert the exception.
|
|
21
|
+
#
|
|
22
|
+
# This plugin is not intended as a replacement for other validations,
|
|
23
|
+
# it is intended as a last resort. The purpose of validations is to provide nice
|
|
24
|
+
# error messages for the user, and the error messages generated by this plugin are
|
|
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).
|
|
28
|
+
#
|
|
29
|
+
# This plugin only works on the postgres adapter when using the pg 0.16+ driver,
|
|
30
|
+
# PostgreSQL 9.3+ server, and PostgreSQL 9.3+ client library (libpq). In other cases
|
|
31
|
+
# it will be a no-op.
|
|
32
|
+
#
|
|
33
|
+
# Example:
|
|
34
|
+
#
|
|
35
|
+
# album = Album.new(:artist_id=>1) # Assume no such artist exists
|
|
36
|
+
# begin
|
|
37
|
+
# album.save
|
|
38
|
+
# rescue Sequel::ValidationFailed
|
|
39
|
+
# album.errors.on(:artist_id) # ['is invalid']
|
|
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.
|
|
73
|
+
#
|
|
74
|
+
# Usage:
|
|
75
|
+
#
|
|
76
|
+
# # Make all model subclasses automatically convert constraint violations
|
|
77
|
+
# # to validation failures (called before loading subclasses)
|
|
78
|
+
# Sequel::Model.plugin :pg_auto_constraint_validations
|
|
79
|
+
#
|
|
80
|
+
# # Make the Album class automatically convert constraint violations
|
|
81
|
+
# # to validation failures
|
|
82
|
+
# Album.plugin :pg_auto_constraint_validations
|
|
83
|
+
module PgAutoConstraintValidations
|
|
84
|
+
(
|
|
85
|
+
# The default error messages for each constraint violation type.
|
|
86
|
+
DEFAULT_ERROR_MESSAGES = {
|
|
87
|
+
:not_null=>"is not present",
|
|
88
|
+
:check=>"is invalid",
|
|
89
|
+
:unique=>'is already taken',
|
|
90
|
+
:foreign_key=>'is invalid',
|
|
91
|
+
:referenced_by=>'cannot be changed currently'
|
|
92
|
+
}.freeze).each_value(&:freeze)
|
|
93
|
+
|
|
94
|
+
# Setup the constraint violation metadata. Options:
|
|
95
|
+
# :cache_file :: File storing cached metadata, to avoid queries for each model
|
|
96
|
+
# :messages :: Override the default error messages for each constraint
|
|
97
|
+
# violation type (:not_null, :check, :unique, :foreign_key, :referenced_by)
|
|
98
|
+
def self.configure(model, opts=OPTS)
|
|
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
|
+
|
|
113
|
+
setup_pg_auto_constraint_validations
|
|
114
|
+
@pg_auto_constraint_validations_messages = (@pg_auto_constraint_validations_messages || DEFAULT_ERROR_MESSAGES).merge(opts[:messages] || OPTS).freeze
|
|
115
|
+
end
|
|
116
|
+
nil
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
module ClassMethods
|
|
120
|
+
# Hash of metadata checked when an instance attempts to convert a constraint
|
|
121
|
+
# violation into a validation failure.
|
|
122
|
+
attr_reader :pg_auto_constraint_validations
|
|
123
|
+
|
|
124
|
+
# Hash of error messages keyed by constraint type symbol to use in the
|
|
125
|
+
# generated validation failures.
|
|
126
|
+
attr_reader :pg_auto_constraint_validations_messages
|
|
127
|
+
|
|
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)
|
|
129
|
+
Plugins.after_set_dataset(self, :setup_pg_auto_constraint_validations)
|
|
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
|
+
|
|
148
|
+
private
|
|
149
|
+
|
|
150
|
+
# Get the list of constraints, unique indexes, foreign keys in the current
|
|
151
|
+
# table, and keys in the current table referenced by foreign keys in other
|
|
152
|
+
# tables. Store this information so that if a constraint violation occurs,
|
|
153
|
+
# all necessary metadata is already available in the model, so a query is
|
|
154
|
+
# not required at runtime. This is both for performance and because in
|
|
155
|
+
# general after the constraint violation failure you will be inside a
|
|
156
|
+
# failed transaction and not able to execute queries.
|
|
157
|
+
def setup_pg_auto_constraint_validations
|
|
158
|
+
return unless @dataset
|
|
159
|
+
|
|
160
|
+
case @dataset.first_source_table
|
|
161
|
+
when Symbol, String, SQL::Identifier, SQL::QualifiedIdentifier
|
|
162
|
+
convert_errors = db.respond_to?(:error_info)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
unless convert_errors
|
|
166
|
+
# Might be a table returning function or subquery, skip handling those.
|
|
167
|
+
# Might have db not support error_info, skip handling that.
|
|
168
|
+
@pg_auto_constraint_validations = nil
|
|
169
|
+
return
|
|
170
|
+
end
|
|
171
|
+
|
|
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 = {}
|
|
179
|
+
|
|
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
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
@pg_auto_constraint_validations = metadata
|
|
216
|
+
nil
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
module InstanceMethods
|
|
221
|
+
private
|
|
222
|
+
|
|
223
|
+
# Yield to the given block, and if a Sequel::ConstraintViolation is raised, try
|
|
224
|
+
# to convert it to a Sequel::ValidationFailed error using the PostgreSQL error
|
|
225
|
+
# metadata.
|
|
226
|
+
def check_pg_constraint_error(ds)
|
|
227
|
+
yield
|
|
228
|
+
rescue Sequel::ConstraintViolation => e
|
|
229
|
+
begin
|
|
230
|
+
unless cv_info = model.pg_auto_constraint_validations
|
|
231
|
+
# Necessary metadata does not exist, just reraise the exception.
|
|
232
|
+
raise e
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
info = ds.db.error_info(e)
|
|
236
|
+
m = ds.method(:output_identifier)
|
|
237
|
+
schema = info[:schema]
|
|
238
|
+
table = info[:table]
|
|
239
|
+
|
|
240
|
+
if constraint = info[:constraint]
|
|
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
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
messages = model.pg_auto_constraint_validations_messages
|
|
251
|
+
|
|
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])
|
|
265
|
+
end
|
|
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
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
rescue
|
|
287
|
+
# If there is an error trying to conver the constraint violation
|
|
288
|
+
# into a validation failure, it's best to just raise the constraint
|
|
289
|
+
# violation. This can make debugging the above block of code more
|
|
290
|
+
# difficult.
|
|
291
|
+
raise e
|
|
292
|
+
else
|
|
293
|
+
unless skip_schema_table_check
|
|
294
|
+
# The constraint violation could be caused by a trigger modifying
|
|
295
|
+
# a different table. Check that the error schema and table
|
|
296
|
+
# match the model's schema and table, or clear the validation error
|
|
297
|
+
# that was set above.
|
|
298
|
+
if schema != cv_info[:schema] || table != cv_info[:table]
|
|
299
|
+
errors.clear
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
if errors.empty?
|
|
304
|
+
# If we weren't able to parse the constraint violation metadata and
|
|
305
|
+
# convert it to an appropriate validation failure, or the schema/table
|
|
306
|
+
# didn't match, then raise the constraint violation.
|
|
307
|
+
raise e
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Integrate with error_splitter plugin to split any multi-column errors
|
|
311
|
+
# and add them as separate single column errors
|
|
312
|
+
if respond_to?(:split_validation_errors, true)
|
|
313
|
+
split_validation_errors(errors)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
vf = ValidationFailed.new(self)
|
|
317
|
+
vf.set_backtrace(e.backtrace)
|
|
318
|
+
vf.wrapped_exception = e
|
|
319
|
+
raise vf
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# If there is a single column instead of an array of columns, add the error
|
|
324
|
+
# for the column, otherwise add the error for the array of columns.
|
|
325
|
+
def add_pg_constraint_validation_error(column, message)
|
|
326
|
+
column = column.first if column.length == 1
|
|
327
|
+
errors.add(column, message)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
# Convert PostgreSQL constraint errors when inserting.
|
|
331
|
+
def _insert_raw(ds)
|
|
332
|
+
check_pg_constraint_error(ds){super}
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
# Convert PostgreSQL constraint errors when inserting.
|
|
336
|
+
def _insert_select_raw(ds)
|
|
337
|
+
check_pg_constraint_error(ds){super}
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
# Convert PostgreSQL constraint errors when updating.
|
|
341
|
+
def _update_without_checking(_)
|
|
342
|
+
check_pg_constraint_error(_update_dataset){super}
|
|
343
|
+
end
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|