sequel 4.36.0 → 5.61.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 +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- 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/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- 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 +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- 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.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -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/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -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 +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- 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 +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -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 +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -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 +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- 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 +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -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/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -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 +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -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/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -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 +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- 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.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.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 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- 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 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- 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 -203
- data/spec/core/schema_spec.rb +0 -1676
- 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/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- 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 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- 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/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- 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_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- 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 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- 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 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- 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 -728
- 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/no_auto_literal_strings_spec.rb +0 -65
- 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 -390
- 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 -275
- 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 -473
- 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 -814
- 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/server_logging_spec.rb +0 -45
- 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_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- 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/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- 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/uuid_spec.rb +0 -106
- 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 -554
- 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/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 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
@@ -0,0 +1,216 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
# The forbid_lazy_load plugin forbids lazy loading of associations
|
6
|
+
# for objects in cases where the object wasn't loaded with a
|
7
|
+
# method that only returns a single object.
|
8
|
+
#
|
9
|
+
# The main reason for doing this is it makes it easier to detect
|
10
|
+
# N+1 query issues. Note that Sequel also offers a
|
11
|
+
# tactical_eager_loading plugin which will automatically eagerly
|
12
|
+
# load associations for all objects retrived in the same query
|
13
|
+
# if any object would attempt to lazily load an association. That
|
14
|
+
# approach may be simpler if you are trying to prevent N+1 issues,
|
15
|
+
# though it does retain more objects in memory.
|
16
|
+
#
|
17
|
+
# This plugin offers multiple different ways to forbid lazy
|
18
|
+
# loading. You can forbid lazy loading associations for individual
|
19
|
+
# model instances:
|
20
|
+
#
|
21
|
+
# obj = Album[1]
|
22
|
+
# obj.forbid_lazy_load
|
23
|
+
# obj.artist # raises Sequel::Plugins::ForbidLazyLoad::Error
|
24
|
+
#
|
25
|
+
# +forbid_lazy_load+ is automatically called on instances if the
|
26
|
+
# instances are loaded via a method such as Dataset#all,
|
27
|
+
# Dataset#each, and other methods that load multiple instances
|
28
|
+
# at once. These are the cases where lazily loading associations
|
29
|
+
# for such instances can cause N+1 issues.
|
30
|
+
#
|
31
|
+
# Album.all.first.artist
|
32
|
+
# objs.first.artist # raises Sequel::Plugins::ForbidLazyLoad::Error
|
33
|
+
#
|
34
|
+
# Album.each do |obj|
|
35
|
+
# obj.artist # raises Sequel::Plugins::ForbidLazyLoad::Error
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# Album[1].artist # no error
|
39
|
+
#
|
40
|
+
# Album.first.artist # no error
|
41
|
+
#
|
42
|
+
# You can allow lazy loading associations for an instance that it
|
43
|
+
# was previously forbidden for:
|
44
|
+
#
|
45
|
+
# obj = Album.all.first
|
46
|
+
# obj.allow_lazy_load
|
47
|
+
# obj.artist # no error
|
48
|
+
#
|
49
|
+
# You can forbid lazy loading associations on a per-call basis,
|
50
|
+
# even if lazy loading of associations is allowed for the instance:
|
51
|
+
#
|
52
|
+
# obj = Album[1]
|
53
|
+
# obj.artist(forbid_lazy_load: true)
|
54
|
+
# # raises Sequel::Plugins::ForbidLazyLoad::Error
|
55
|
+
#
|
56
|
+
# This also works for allowing lazy loading associations for a
|
57
|
+
# specific association load even if it is forbidden for the instance:
|
58
|
+
#
|
59
|
+
# obj = Album.all.first
|
60
|
+
# obj.artist(forbid_lazy_load: false)
|
61
|
+
# # nothing raised
|
62
|
+
#
|
63
|
+
# You can also forbid lazy loading on a per-association basis using the
|
64
|
+
# +:forbid_lazy_load+ association option with a +true+ value:
|
65
|
+
#
|
66
|
+
# Album.many_to_one :artist, forbid_lazy_load: true
|
67
|
+
# Album[1].artist # raises Sequel::Plugins::ForbidLazyLoad::Error
|
68
|
+
#
|
69
|
+
# However, you probably don't want to do this as it will forbid any
|
70
|
+
# lazy loading of the association, even if the loading could not
|
71
|
+
# result in an N+1 issue.
|
72
|
+
#
|
73
|
+
# On the flip side, you can allow lazy loading using the
|
74
|
+
# +:forbid_lazy_load+ association option with a +false+ value:
|
75
|
+
#
|
76
|
+
# Album.many_to_one :artist, forbid_lazy_load: false
|
77
|
+
# Album.all.first.artist # no error
|
78
|
+
#
|
79
|
+
# One reason to do this is when using a plugin like static_cache
|
80
|
+
# on the associated model, where a query is not actually issued
|
81
|
+
# when doing a lazy association load. To make that particular
|
82
|
+
# case easier, this plugin makes Model.finalize_associations
|
83
|
+
# automatically set the association option if the associated
|
84
|
+
# class uses the static_cache plugin.
|
85
|
+
#
|
86
|
+
# Note that even with this plugin, there can still be N+1 issues,
|
87
|
+
# such as:
|
88
|
+
#
|
89
|
+
# Album.each do |obj| # 1 query for all albums
|
90
|
+
# Artist[obj.artist_id] # 1 query per album for each artist
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# Usage:
|
94
|
+
#
|
95
|
+
# # Make all model subclasses support forbidding lazy load
|
96
|
+
# # (called before loading subclasses)
|
97
|
+
# Sequel::Model.plugin :forbid_lazy_load
|
98
|
+
#
|
99
|
+
# # Make the Album class support forbidding lazy load
|
100
|
+
# Album.plugin :forbid_lazy_load
|
101
|
+
module ForbidLazyLoad
|
102
|
+
# Error raised when attempting to lazy load an association when
|
103
|
+
# lazy loading has been forbidden.
|
104
|
+
class Error < StandardError
|
105
|
+
end
|
106
|
+
|
107
|
+
module ClassMethods
|
108
|
+
Plugins.def_dataset_methods(self, :forbid_lazy_load)
|
109
|
+
|
110
|
+
# If the static_cache plugin is used by the associated class for
|
111
|
+
# an association, allow lazy loading that association, since the
|
112
|
+
# lazy association load will use a hash table lookup and not a query.
|
113
|
+
def allow_lazy_load_for_static_cache_associations
|
114
|
+
# :nocov:
|
115
|
+
if defined?(::Sequel::Plugins::StaticCache::ClassMethods)
|
116
|
+
# :nocov:
|
117
|
+
@association_reflections.each_value do |ref|
|
118
|
+
if ref.associated_class.is_a?(::Sequel::Plugins::StaticCache::ClassMethods)
|
119
|
+
ref[:forbid_lazy_load] = false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Allow lazy loading for static cache associations before finalizing.
|
126
|
+
def finalize_associations
|
127
|
+
allow_lazy_load_for_static_cache_associations
|
128
|
+
super
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
module InstanceMethods
|
133
|
+
# Set this model instance to allow lazy loading of associations.
|
134
|
+
def allow_lazy_load
|
135
|
+
@forbid_lazy_load = false
|
136
|
+
self
|
137
|
+
end
|
138
|
+
|
139
|
+
# Set this model instance to not allow lazy loading of associations.
|
140
|
+
def forbid_lazy_load
|
141
|
+
@forbid_lazy_load = true
|
142
|
+
self
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
# Allow lazy loading for objects returned by singular associations.
|
148
|
+
def _load_associated_object(opts, dynamic_opts)
|
149
|
+
# The implementation that loads these associations does
|
150
|
+
# .all.first, which would result in the object returned being
|
151
|
+
# marked as forbidding lazy load.
|
152
|
+
obj = super
|
153
|
+
obj.allow_lazy_load if obj.is_a?(InstanceMethods)
|
154
|
+
obj
|
155
|
+
end
|
156
|
+
|
157
|
+
# Raise an Error if lazy loading has been forbidden for
|
158
|
+
# the instance, association, or call.
|
159
|
+
def _load_associated_objects(opts, dynamic_opts=OPTS)
|
160
|
+
case dynamic_opts[:forbid_lazy_load]
|
161
|
+
when false
|
162
|
+
# nothing
|
163
|
+
when nil
|
164
|
+
unless dynamic_opts[:reload]
|
165
|
+
case opts[:forbid_lazy_load]
|
166
|
+
when nil
|
167
|
+
raise Error, "lazy loading forbidden for this object (association: #{opts.inspect}, object: #{inspect})" if @forbid_lazy_load
|
168
|
+
when false
|
169
|
+
# nothing
|
170
|
+
else
|
171
|
+
raise Error, "lazy loading forbidden for this association (#{opts.inspect})"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
else
|
175
|
+
raise Error, "lazy loading forbidden for this association method call (association: #{opts.inspect})"
|
176
|
+
end
|
177
|
+
|
178
|
+
super
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
module DatasetMethods
|
183
|
+
# Mark model instances retrieved in this call as forbidding lazy loading.
|
184
|
+
def each
|
185
|
+
if row_proc
|
186
|
+
super do |obj|
|
187
|
+
obj.forbid_lazy_load if obj.is_a?(InstanceMethods)
|
188
|
+
yield obj
|
189
|
+
end
|
190
|
+
else
|
191
|
+
super
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Mark model instances retrieved in this call as forbidding lazy loading.
|
196
|
+
def with_sql_each(sql)
|
197
|
+
if row_proc
|
198
|
+
super(sql) do |obj|
|
199
|
+
obj.forbid_lazy_load if obj.is_a?(InstanceMethods)
|
200
|
+
yield obj
|
201
|
+
end
|
202
|
+
else
|
203
|
+
super
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Mark model instances retrieved in this call as allowing lazy loading.
|
208
|
+
def with_sql_first(sql)
|
209
|
+
obj = super
|
210
|
+
obj.allow_lazy_load if obj.is_a?(InstanceMethods)
|
211
|
+
obj
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
if RUBY_VERSION >= '1.9.0'
|
4
3
|
module Sequel
|
5
4
|
module Plugins
|
6
|
-
# The
|
5
|
+
# The force_encoding plugin allows you force specific encodings for all
|
7
6
|
# strings that are used by the model. When model instances are loaded
|
8
7
|
# from the database, all values in the hash that are strings are
|
9
8
|
# forced to the given encoding. Whenever you update a model column
|
@@ -14,11 +13,11 @@ module Sequel
|
|
14
13
|
#
|
15
14
|
# Usage:
|
16
15
|
#
|
17
|
-
# # Force all strings to be
|
16
|
+
# # Force all strings to be UTF-8 encoded in a all model subclasses
|
18
17
|
# # (called before loading subclasses)
|
19
18
|
# Sequel::Model.plugin :force_encoding, 'UTF-8'
|
20
19
|
#
|
21
|
-
# # Force the encoding for the Album model to
|
20
|
+
# # Force the encoding for the Album model to UTF-8
|
22
21
|
# Album.plugin :force_encoding
|
23
22
|
# Album.forced_encoding = 'UTF-8'
|
24
23
|
module ForceEncoding
|
@@ -58,15 +57,16 @@ module Sequel
|
|
58
57
|
|
59
58
|
# Force the encoding for all string values in the given row hash.
|
60
59
|
def force_hash_encoding(row)
|
61
|
-
fe = model.forced_encoding
|
62
|
-
|
60
|
+
if fe = model.forced_encoding
|
61
|
+
row.each_value{|v| v.force_encoding(fe) if v.is_a?(String) && !v.is_a?(Sequel::SQL::Blob)}
|
62
|
+
end
|
63
63
|
row
|
64
64
|
end
|
65
65
|
|
66
66
|
# Force the encoding of all returned strings to the model's forced_encoding.
|
67
67
|
def typecast_value(column, value)
|
68
68
|
s = super
|
69
|
-
if s.is_a?(String) && (fe = model.forced_encoding)
|
69
|
+
if s.is_a?(String) && !s.is_a?(Sequel::SQL::Blob) && (fe = model.forced_encoding)
|
70
70
|
s = s.dup if s.frozen?
|
71
71
|
s.force_encoding(fe)
|
72
72
|
end
|
@@ -76,8 +76,3 @@ module Sequel
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
79
|
-
else
|
80
|
-
# :nocov:
|
81
|
-
raise LoadError, 'ForceEncoding plugin only works on Ruby 1.9+'
|
82
|
-
# :nocov:
|
83
|
-
end
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
|
-
# Sequel's built-in
|
5
|
+
# Sequel's built-in hook_class_methods plugin is designed for backwards
|
6
6
|
# compatibility. Its use is not encouraged, it is recommended to use
|
7
|
-
# instance methods and super instead of this plugin.
|
8
|
-
#
|
7
|
+
# instance methods and super instead of this plugin. This plugin allows
|
8
|
+
# calling class methods with blocks to define hooks:
|
9
9
|
#
|
10
10
|
# # Block only, can cause duplicate hooks if code is reloaded
|
11
11
|
# before_save{self.created_at = Time.now}
|
@@ -15,17 +15,14 @@ module Sequel
|
|
15
15
|
# before_save(:set_created_at)
|
16
16
|
#
|
17
17
|
# Pretty much anything you can do with a hook class method, you can also
|
18
|
-
# do with an instance method instead
|
18
|
+
# do with an instance method instead (making sure to call super), which is
|
19
|
+
# the recommended way to add hooks in Sequel:
|
19
20
|
#
|
20
21
|
# def before_save
|
21
|
-
#
|
22
|
+
# super
|
22
23
|
# self.created_at = Time.now
|
23
24
|
# end
|
24
25
|
#
|
25
|
-
# Note that returning false in any before hook block will skip further
|
26
|
-
# before hooks and abort the action. So if a before_save hook block returns
|
27
|
-
# false, future before_save hook blocks are not called, and the save is aborted.
|
28
|
-
#
|
29
26
|
# Usage:
|
30
27
|
#
|
31
28
|
# # Allow use of hook class methods in all model subclasses (called before loading subclasses)
|
@@ -41,46 +38,18 @@ module Sequel
|
|
41
38
|
end
|
42
39
|
|
43
40
|
module ClassMethods
|
44
|
-
Model::HOOKS.each
|
41
|
+
Model::HOOKS.each do |h|
|
42
|
+
class_eval(<<-END, __FILE__, __LINE__ + 1)
|
43
|
+
def #{h}(method = nil, &block)
|
44
|
+
add_hook(:#{h}, method, &block)
|
45
|
+
end
|
46
|
+
END
|
47
|
+
end
|
45
48
|
|
46
|
-
#
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
# and symbol is not, it adds the hook block to the hook type. If a block
|
51
|
-
# and symbol are both given, it replaces the hook block associated with
|
52
|
-
# that symbol for a given hook type, or adds it if there is no hook block
|
53
|
-
# with that symbol for that hook type. If no block is given, it assumes
|
54
|
-
# the symbol specifies an instance method to call and adds it to the hook
|
55
|
-
# type.
|
56
|
-
#
|
57
|
-
# If any before hook block returns false, the instance method will return false
|
58
|
-
# immediately without running the rest of the hooks of that type.
|
59
|
-
#
|
60
|
-
# It is recommended that you always provide a symbol to this method,
|
61
|
-
# for descriptive purposes. It's only necessary to do so when you
|
62
|
-
# are using a system that reloads code.
|
63
|
-
#
|
64
|
-
# Example of usage:
|
65
|
-
#
|
66
|
-
# class MyModel
|
67
|
-
# add_hook_type :before_move_to
|
68
|
-
# before_move_to(:check_move_allowed, &:allow_move?)
|
69
|
-
# def move_to(there)
|
70
|
-
# return if before_move_to == false
|
71
|
-
# # move MyModel object to there
|
72
|
-
# end
|
73
|
-
# end
|
74
|
-
#
|
75
|
-
# Do not call this method with untrusted input, as that can result in
|
76
|
-
# arbitrary code execution.
|
77
|
-
def add_hook_type(*hooks)
|
78
|
-
Model::HOOKS.concat(hooks)
|
79
|
-
hooks.each do |hook|
|
80
|
-
@hooks[hook] = []
|
81
|
-
instance_eval("def #{hook}(method = nil, &block); add_hook(:#{hook}, method, &block) end", __FILE__, __LINE__)
|
82
|
-
class_eval("def #{hook}; model.hook_blocks(:#{hook}){|b| return false if instance_eval(&b) == false}; end", __FILE__, __LINE__)
|
83
|
-
end
|
49
|
+
# Freeze hooks when freezing model class.
|
50
|
+
def freeze
|
51
|
+
@hooks.freeze.each_value(&:freeze)
|
52
|
+
super
|
84
53
|
end
|
85
54
|
|
86
55
|
# Returns true if there are any hook blocks for the given hook.
|
@@ -90,7 +59,14 @@ module Sequel
|
|
90
59
|
|
91
60
|
# Yield every block related to the given hook.
|
92
61
|
def hook_blocks(hook)
|
93
|
-
|
62
|
+
# SEQUEL6: Remove
|
63
|
+
Sequel::Deprecation.deprecate("The hook_blocks class method in the hook_class_methods plugin is deprecated and will be removed in Sequel 6.")
|
64
|
+
@hooks[hook].each{|_,v,_| yield v}
|
65
|
+
end
|
66
|
+
|
67
|
+
# Yield every method related to the given hook.
|
68
|
+
def hook_methods_for(hook)
|
69
|
+
@hooks[hook].each{|_,_,m| yield m}
|
94
70
|
end
|
95
71
|
|
96
72
|
Plugins.inherited_instance_variables(self, :@hooks=>:hash_dup)
|
@@ -103,24 +79,31 @@ module Sequel
|
|
103
79
|
def add_hook(hook, tag, &block)
|
104
80
|
unless block
|
105
81
|
(raise Error, 'No hook method specified') unless tag
|
106
|
-
|
82
|
+
# Allow calling private hook methods
|
83
|
+
block = proc {send(tag)}
|
107
84
|
end
|
85
|
+
|
108
86
|
h = @hooks[hook]
|
87
|
+
|
109
88
|
if tag && (old = h.find{|x| x[0] == tag})
|
110
89
|
old[1] = block
|
90
|
+
Plugins.def_sequel_method(self, old[2], 0, &block)
|
111
91
|
else
|
92
|
+
meth = Plugins.def_sequel_method(self, "validation_class_methods_#{hook}", 0, &block)
|
112
93
|
if hook.to_s =~ /^before/
|
113
|
-
h.unshift([tag,block])
|
94
|
+
h.unshift([tag, block, meth])
|
114
95
|
else
|
115
|
-
h << [tag, block]
|
96
|
+
h << [tag, block, meth]
|
116
97
|
end
|
117
98
|
end
|
118
99
|
end
|
119
100
|
end
|
120
101
|
|
121
102
|
module InstanceMethods
|
122
|
-
|
123
|
-
|
103
|
+
# hook methods are private
|
104
|
+
[:before_create, :before_update, :before_validation, :before_save, :before_destroy].each{|h| class_eval("def #{h}; model.hook_methods_for(:#{h}){|m| send(m)}; super end", __FILE__, __LINE__)}
|
105
|
+
|
106
|
+
[:after_create, :after_update, :after_validation, :after_save, :after_destroy].each{|h| class_eval("def #{h}; super; model.hook_methods_for(:#{h}){|m| send(m)}; end", __FILE__, __LINE__)}
|
124
107
|
end
|
125
108
|
end
|
126
109
|
end
|
@@ -7,14 +7,14 @@ module Sequel
|
|
7
7
|
#
|
8
8
|
# Album.plugin :input_transformer
|
9
9
|
# Album.add_input_transformer(:reverser){|v| v.is_a?(String) ? v.reverse : v}
|
10
|
-
# album = Album.new(:
|
10
|
+
# album = Album.new(name: 'foo')
|
11
11
|
# album.name # => 'oof'
|
12
12
|
#
|
13
13
|
# You can specifically set some columns to skip some input
|
14
14
|
# input transformers:
|
15
15
|
#
|
16
16
|
# Album.skip_input_transformer(:reverser, :foo)
|
17
|
-
# Album.new(:
|
17
|
+
# Album.new(foo: 'bar').foo # => 'bar'
|
18
18
|
#
|
19
19
|
# Usage:
|
20
20
|
#
|
@@ -25,9 +25,8 @@ module Sequel
|
|
25
25
|
# Album.plugin :input_transformer
|
26
26
|
module InputTransformer
|
27
27
|
def self.apply(model, *)
|
28
|
-
model.
|
28
|
+
model.instance_exec do
|
29
29
|
@input_transformers = {}
|
30
|
-
@input_transformer_order = []
|
31
30
|
@skip_input_transformer_columns = {}
|
32
31
|
end
|
33
32
|
end
|
@@ -42,19 +41,28 @@ module Sequel
|
|
42
41
|
# Hash of input transformer name symbols to transformer callables.
|
43
42
|
attr_reader :input_transformers
|
44
43
|
|
45
|
-
# The order in which to call the input transformers.
|
46
|
-
|
44
|
+
# The order in which to call the input transformers. For backwards compatibility only.
|
45
|
+
def input_transformer_order
|
46
|
+
input_transformers.keys.reverse
|
47
|
+
end
|
47
48
|
|
48
|
-
Plugins.inherited_instance_variables(self, :@skip_input_transformer_columns=>:hash_dup, :@input_transformers=>:dup
|
49
|
+
Plugins.inherited_instance_variables(self, :@skip_input_transformer_columns=>:hash_dup, :@input_transformers=>:dup)
|
49
50
|
|
50
51
|
# Add an input transformer to this model.
|
51
52
|
def add_input_transformer(transformer_name, &block)
|
52
53
|
raise(Error, 'must provide both transformer name and block when adding input transformer') unless transformer_name && block
|
53
54
|
@input_transformers[transformer_name] = block
|
54
|
-
@input_transformer_order.unshift(transformer_name)
|
55
55
|
@skip_input_transformer_columns[transformer_name] = []
|
56
56
|
end
|
57
57
|
|
58
|
+
# Freeze input transformers when freezing model class
|
59
|
+
def freeze
|
60
|
+
@input_transformers.freeze
|
61
|
+
@skip_input_transformer_columns.freeze.each_value(&:freeze)
|
62
|
+
|
63
|
+
super
|
64
|
+
end
|
65
|
+
|
58
66
|
# Set columns that the transformer should skip.
|
59
67
|
def skip_input_transformer(transformer_name, *columns)
|
60
68
|
@skip_input_transformer_columns[transformer_name].concat(columns).uniq!
|
@@ -70,8 +78,8 @@ module Sequel
|
|
70
78
|
# Transform the input using all of the transformers, except those explicitly
|
71
79
|
# skipped, before setting the value in the model object.
|
72
80
|
def []=(k, v)
|
73
|
-
model.
|
74
|
-
v =
|
81
|
+
model.input_transformers.reverse_each do |name, transformer|
|
82
|
+
v = transformer.call(v) unless model.skip_input_transformer?(name, k)
|
75
83
|
end
|
76
84
|
super
|
77
85
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
# The insert_conflict plugin allows handling conflicts due to unique
|
6
|
+
# constraints when saving new model instance, using the INSERT ON CONFLICT
|
7
|
+
# support in PostgreSQL 9.5+ and SQLite 3.24.0+. Example:
|
8
|
+
#
|
9
|
+
# class Album < Sequel::Model
|
10
|
+
# plugin :insert_conflict
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Album.new(name: 'Foo', copies_sold: 1000).
|
14
|
+
# insert_conflict(
|
15
|
+
# target: :name,
|
16
|
+
# update: {copies_sold: Sequel[:excluded][:b]}
|
17
|
+
# ).
|
18
|
+
# save
|
19
|
+
#
|
20
|
+
# This example will try to insert the album, but if there is an existing
|
21
|
+
# album with the name 'Foo', this will update the copies_sold attribute
|
22
|
+
# for that album. See the PostgreSQL and SQLite adapter documention for
|
23
|
+
# the options you can pass to the insert_conflict method.
|
24
|
+
#
|
25
|
+
# You should not attempt to use this plugin to ignore conflicts when
|
26
|
+
# inserting, you should only use it to turn insert conflicts into updates.
|
27
|
+
# Any usage to ignore conflicts is not recommended or supported.
|
28
|
+
#
|
29
|
+
# Usage:
|
30
|
+
#
|
31
|
+
# # Make all model subclasses support insert_conflict
|
32
|
+
# Sequel::Model.plugin :insert_conflict
|
33
|
+
#
|
34
|
+
# # Make the Album class support insert_conflict
|
35
|
+
# Album.plugin :insert_conflict
|
36
|
+
module InsertConflict
|
37
|
+
def self.configure(model)
|
38
|
+
model.instance_exec do
|
39
|
+
if @dataset && !@dataset.respond_to?(:insert_conflict)
|
40
|
+
raise Error, "#{self}'s dataset does not support insert_conflict"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module InstanceMethods
|
46
|
+
# Set the insert_conflict options to pass to the dataset when inserting.
|
47
|
+
def insert_conflict(opts=OPTS)
|
48
|
+
raise Error, "Model#insert_conflict is only supported on new model instances" unless new?
|
49
|
+
@insert_conflict_opts = opts
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Set the dataset used for inserting to use INSERT ON CONFLICT
|
56
|
+
# Model#insert_conflict has been called on the instance previously.
|
57
|
+
def _insert_dataset
|
58
|
+
ds = super
|
59
|
+
|
60
|
+
if @insert_conflict_opts
|
61
|
+
ds = ds.insert_conflict(@insert_conflict_opts)
|
62
|
+
end
|
63
|
+
|
64
|
+
ds
|
65
|
+
end
|
66
|
+
|
67
|
+
# Disable the use of prepared insert statements, as they are not compatible
|
68
|
+
# with this plugin.
|
69
|
+
def use_prepared_statements_for?(type)
|
70
|
+
return false if type == :insert || type == :insert_select
|
71
|
+
super if defined?(super)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -21,7 +21,7 @@ module Sequel
|
|
21
21
|
# Modify the current model's dataset selection, if the model
|
22
22
|
# has a dataset.
|
23
23
|
def self.configure(model)
|
24
|
-
model.
|
24
|
+
model.instance_exec do
|
25
25
|
self.dataset = dataset if @dataset && @dataset.opts[:select]
|
26
26
|
end
|
27
27
|
end
|
@@ -35,7 +35,7 @@ module Sequel
|
|
35
35
|
# When reseting the instance dataset, also reset the instance_insert_dataset.
|
36
36
|
def reset_instance_dataset
|
37
37
|
ret = super
|
38
|
-
ds = @instance_dataset
|
38
|
+
return unless ds = @instance_dataset
|
39
39
|
|
40
40
|
if columns = insert_returning_columns(ds)
|
41
41
|
ds = ds.returning(*columns)
|
@@ -7,7 +7,9 @@ module Sequel
|
|
7
7
|
# where you would normally have to drop down to the dataset level
|
8
8
|
# to get the necessary control, because you only want to delete or
|
9
9
|
# update the rows in certain cases based on the current status of
|
10
|
-
# the row in the database.
|
10
|
+
# the row in the database. The main purpose of this plugin is to
|
11
|
+
# avoid race conditions by relying on the atomic properties of database
|
12
|
+
# transactions.
|
11
13
|
#
|
12
14
|
# class Item < Sequel::Model
|
13
15
|
# plugin :instance_filters
|
@@ -15,12 +17,12 @@ module Sequel
|
|
15
17
|
#
|
16
18
|
# # These are two separate objects that represent the same
|
17
19
|
# # database row.
|
18
|
-
# i1 = Item.first(:
|
19
|
-
# i2 = Item.first(:
|
20
|
+
# i1 = Item.first(id: 1, delete_allowed: false)
|
21
|
+
# i2 = Item.first(id: 1, delete_allowed: false)
|
20
22
|
#
|
21
23
|
# # Add an instance filter to the object. This filter is in effect
|
22
24
|
# # until the object is successfully updated or deleted.
|
23
|
-
# i1.instance_filter(:
|
25
|
+
# i1.instance_filter(delete_allowed: true)
|
24
26
|
#
|
25
27
|
# # Attempting to delete the object where the filter doesn't
|
26
28
|
# # match any rows raises an error.
|
@@ -28,7 +30,7 @@ module Sequel
|
|
28
30
|
#
|
29
31
|
# # The other object that represents the same row has no
|
30
32
|
# # instance filters, and can be updated normally.
|
31
|
-
# i2.update(:
|
33
|
+
# i2.update(delete_allowed: true)
|
32
34
|
#
|
33
35
|
# # Even though the filter is now still in effect, since the
|
34
36
|
# # database row has been updated to allow deleting,
|
@@ -100,7 +102,7 @@ module Sequel
|
|
100
102
|
|
101
103
|
# Apply the instance filters to the given dataset
|
102
104
|
def apply_instance_filters(ds)
|
103
|
-
instance_filters.inject(ds){|ds1, i| ds1.
|
105
|
+
instance_filters.inject(ds){|ds1, i| ds1.where(*i[0], &i[1])}
|
104
106
|
end
|
105
107
|
|
106
108
|
# Clear the instance filters.
|
@@ -121,10 +123,10 @@ module Sequel
|
|
121
123
|
# Only use prepared statements for update and delete queries
|
122
124
|
# if there are no instance filters.
|
123
125
|
def use_prepared_statements_for?(type)
|
124
|
-
if
|
126
|
+
if type == :update && !instance_filters.empty?
|
125
127
|
false
|
126
128
|
else
|
127
|
-
super
|
129
|
+
super if defined?(super)
|
128
130
|
end
|
129
131
|
end
|
130
132
|
end
|