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
|
@@ -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,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
2
3
|
module Sequel
|
|
3
4
|
module Plugins
|
|
4
|
-
# The
|
|
5
|
+
# The force_encoding plugin allows you force specific encodings for all
|
|
5
6
|
# strings that are used by the model. When model instances are loaded
|
|
6
7
|
# from the database, all values in the hash that are strings are
|
|
7
8
|
# forced to the given encoding. Whenever you update a model column
|
|
@@ -12,11 +13,11 @@ module Sequel
|
|
|
12
13
|
#
|
|
13
14
|
# Usage:
|
|
14
15
|
#
|
|
15
|
-
# # Force all strings to be
|
|
16
|
+
# # Force all strings to be UTF-8 encoded in a all model subclasses
|
|
16
17
|
# # (called before loading subclasses)
|
|
17
18
|
# Sequel::Model.plugin :force_encoding, 'UTF-8'
|
|
18
19
|
#
|
|
19
|
-
# # Force the encoding for the Album model to
|
|
20
|
+
# # Force the encoding for the Album model to UTF-8
|
|
20
21
|
# Album.plugin :force_encoding
|
|
21
22
|
# Album.forced_encoding = 'UTF-8'
|
|
22
23
|
module ForceEncoding
|
|
@@ -56,15 +57,16 @@ module Sequel
|
|
|
56
57
|
|
|
57
58
|
# Force the encoding for all string values in the given row hash.
|
|
58
59
|
def force_hash_encoding(row)
|
|
59
|
-
fe = model.forced_encoding
|
|
60
|
-
|
|
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
|
|
61
63
|
row
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
# Force the encoding of all returned strings to the model's forced_encoding.
|
|
65
67
|
def typecast_value(column, value)
|
|
66
68
|
s = super
|
|
67
|
-
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)
|
|
68
70
|
s = s.dup if s.frozen?
|
|
69
71
|
s.force_encoding(fe)
|
|
70
72
|
end
|
|
@@ -74,8 +76,3 @@ module Sequel
|
|
|
74
76
|
end
|
|
75
77
|
end
|
|
76
78
|
end
|
|
77
|
-
else
|
|
78
|
-
# :nocov:
|
|
79
|
-
raise LoadError, 'ForceEncoding plugin only works on Ruby 1.9+'
|
|
80
|
-
# :nocov:
|
|
81
|
-
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
|
-
# Sequel's built-in
|
|
5
|
+
# Sequel's built-in hook_class_methods plugin is designed for backwards
|
|
4
6
|
# compatibility. Its use is not encouraged, it is recommended to use
|
|
5
|
-
# instance methods and super instead of this plugin.
|
|
6
|
-
#
|
|
7
|
+
# instance methods and super instead of this plugin. This plugin allows
|
|
8
|
+
# calling class methods with blocks to define hooks:
|
|
7
9
|
#
|
|
8
10
|
# # Block only, can cause duplicate hooks if code is reloaded
|
|
9
11
|
# before_save{self.created_at = Time.now}
|
|
@@ -13,17 +15,14 @@ module Sequel
|
|
|
13
15
|
# before_save(:set_created_at)
|
|
14
16
|
#
|
|
15
17
|
# Pretty much anything you can do with a hook class method, you can also
|
|
16
|
-
# 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:
|
|
17
20
|
#
|
|
18
21
|
# def before_save
|
|
19
|
-
#
|
|
22
|
+
# super
|
|
20
23
|
# self.created_at = Time.now
|
|
21
24
|
# end
|
|
22
25
|
#
|
|
23
|
-
# Note that returning false in any before hook block will skip further
|
|
24
|
-
# before hooks and abort the action. So if a before_save hook block returns
|
|
25
|
-
# false, future before_save hook blocks are not called, and the save is aborted.
|
|
26
|
-
#
|
|
27
26
|
# Usage:
|
|
28
27
|
#
|
|
29
28
|
# # Allow use of hook class methods in all model subclasses (called before loading subclasses)
|
|
@@ -39,46 +38,18 @@ module Sequel
|
|
|
39
38
|
end
|
|
40
39
|
|
|
41
40
|
module ClassMethods
|
|
42
|
-
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
|
|
43
48
|
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# and symbol is not, it adds the hook block to the hook type. If a block
|
|
49
|
-
# and symbol are both given, it replaces the hook block associated with
|
|
50
|
-
# that symbol for a given hook type, or adds it if there is no hook block
|
|
51
|
-
# with that symbol for that hook type. If no block is given, it assumes
|
|
52
|
-
# the symbol specifies an instance method to call and adds it to the hook
|
|
53
|
-
# type.
|
|
54
|
-
#
|
|
55
|
-
# If any before hook block returns false, the instance method will return false
|
|
56
|
-
# immediately without running the rest of the hooks of that type.
|
|
57
|
-
#
|
|
58
|
-
# It is recommended that you always provide a symbol to this method,
|
|
59
|
-
# for descriptive purposes. It's only necessary to do so when you
|
|
60
|
-
# are using a system that reloads code.
|
|
61
|
-
#
|
|
62
|
-
# Example of usage:
|
|
63
|
-
#
|
|
64
|
-
# class MyModel
|
|
65
|
-
# add_hook_type :before_move_to
|
|
66
|
-
# before_move_to(:check_move_allowed, &:allow_move?)
|
|
67
|
-
# def move_to(there)
|
|
68
|
-
# return if before_move_to == false
|
|
69
|
-
# # move MyModel object to there
|
|
70
|
-
# end
|
|
71
|
-
# end
|
|
72
|
-
#
|
|
73
|
-
# Do not call this method with untrusted input, as that can result in
|
|
74
|
-
# arbitrary code execution.
|
|
75
|
-
def add_hook_type(*hooks)
|
|
76
|
-
Model::HOOKS.concat(hooks)
|
|
77
|
-
hooks.each do |hook|
|
|
78
|
-
@hooks[hook] = []
|
|
79
|
-
instance_eval("def #{hook}(method = nil, &block); add_hook(:#{hook}, method, &block) end", __FILE__, __LINE__)
|
|
80
|
-
class_eval("def #{hook}; model.hook_blocks(:#{hook}){|b| return false if instance_eval(&b) == false}; end", __FILE__, __LINE__)
|
|
81
|
-
end
|
|
49
|
+
# Freeze hooks when freezing model class.
|
|
50
|
+
def freeze
|
|
51
|
+
@hooks.freeze.each_value(&:freeze)
|
|
52
|
+
super
|
|
82
53
|
end
|
|
83
54
|
|
|
84
55
|
# Returns true if there are any hook blocks for the given hook.
|
|
@@ -88,7 +59,14 @@ module Sequel
|
|
|
88
59
|
|
|
89
60
|
# Yield every block related to the given hook.
|
|
90
61
|
def hook_blocks(hook)
|
|
91
|
-
|
|
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}
|
|
92
70
|
end
|
|
93
71
|
|
|
94
72
|
Plugins.inherited_instance_variables(self, :@hooks=>:hash_dup)
|
|
@@ -101,24 +79,31 @@ module Sequel
|
|
|
101
79
|
def add_hook(hook, tag, &block)
|
|
102
80
|
unless block
|
|
103
81
|
(raise Error, 'No hook method specified') unless tag
|
|
104
|
-
|
|
82
|
+
# Allow calling private hook methods
|
|
83
|
+
block = proc {send(tag)}
|
|
105
84
|
end
|
|
85
|
+
|
|
106
86
|
h = @hooks[hook]
|
|
87
|
+
|
|
107
88
|
if tag && (old = h.find{|x| x[0] == tag})
|
|
108
89
|
old[1] = block
|
|
90
|
+
Plugins.def_sequel_method(self, old[2], 0, &block)
|
|
109
91
|
else
|
|
92
|
+
meth = Plugins.def_sequel_method(self, "validation_class_methods_#{hook}", 0, &block)
|
|
110
93
|
if hook.to_s =~ /^before/
|
|
111
|
-
h.unshift([tag,block])
|
|
94
|
+
h.unshift([tag, block, meth])
|
|
112
95
|
else
|
|
113
|
-
h << [tag, block]
|
|
96
|
+
h << [tag, block, meth]
|
|
114
97
|
end
|
|
115
98
|
end
|
|
116
99
|
end
|
|
117
100
|
end
|
|
118
101
|
|
|
119
102
|
module InstanceMethods
|
|
120
|
-
|
|
121
|
-
|
|
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__)}
|
|
122
107
|
end
|
|
123
108
|
end
|
|
124
109
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
module Plugins
|
|
3
5
|
# InputTransformer is a plugin that allows generic transformations
|
|
@@ -5,14 +7,14 @@ module Sequel
|
|
|
5
7
|
#
|
|
6
8
|
# Album.plugin :input_transformer
|
|
7
9
|
# Album.add_input_transformer(:reverser){|v| v.is_a?(String) ? v.reverse : v}
|
|
8
|
-
# album = Album.new(:
|
|
10
|
+
# album = Album.new(name: 'foo')
|
|
9
11
|
# album.name # => 'oof'
|
|
10
12
|
#
|
|
11
13
|
# You can specifically set some columns to skip some input
|
|
12
14
|
# input transformers:
|
|
13
15
|
#
|
|
14
16
|
# Album.skip_input_transformer(:reverser, :foo)
|
|
15
|
-
# Album.new(:
|
|
17
|
+
# Album.new(foo: 'bar').foo # => 'bar'
|
|
16
18
|
#
|
|
17
19
|
# Usage:
|
|
18
20
|
#
|
|
@@ -23,9 +25,8 @@ module Sequel
|
|
|
23
25
|
# Album.plugin :input_transformer
|
|
24
26
|
module InputTransformer
|
|
25
27
|
def self.apply(model, *)
|
|
26
|
-
model.
|
|
28
|
+
model.instance_exec do
|
|
27
29
|
@input_transformers = {}
|
|
28
|
-
@input_transformer_order = []
|
|
29
30
|
@skip_input_transformer_columns = {}
|
|
30
31
|
end
|
|
31
32
|
end
|
|
@@ -40,19 +41,28 @@ module Sequel
|
|
|
40
41
|
# Hash of input transformer name symbols to transformer callables.
|
|
41
42
|
attr_reader :input_transformers
|
|
42
43
|
|
|
43
|
-
# The order in which to call the input transformers.
|
|
44
|
-
|
|
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
|
|
45
48
|
|
|
46
|
-
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)
|
|
47
50
|
|
|
48
51
|
# Add an input transformer to this model.
|
|
49
52
|
def add_input_transformer(transformer_name, &block)
|
|
50
53
|
raise(Error, 'must provide both transformer name and block when adding input transformer') unless transformer_name && block
|
|
51
54
|
@input_transformers[transformer_name] = block
|
|
52
|
-
@input_transformer_order.unshift(transformer_name)
|
|
53
55
|
@skip_input_transformer_columns[transformer_name] = []
|
|
54
56
|
end
|
|
55
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
|
+
|
|
56
66
|
# Set columns that the transformer should skip.
|
|
57
67
|
def skip_input_transformer(transformer_name, *columns)
|
|
58
68
|
@skip_input_transformer_columns[transformer_name].concat(columns).uniq!
|
|
@@ -68,8 +78,8 @@ module Sequel
|
|
|
68
78
|
# Transform the input using all of the transformers, except those explicitly
|
|
69
79
|
# skipped, before setting the value in the model object.
|
|
70
80
|
def []=(k, v)
|
|
71
|
-
model.
|
|
72
|
-
v =
|
|
81
|
+
model.input_transformers.reverse_each do |name, transformer|
|
|
82
|
+
v = transformer.call(v) unless model.skip_input_transformer?(name, k)
|
|
73
83
|
end
|
|
74
84
|
super
|
|
75
85
|
end
|