sequel 5.8.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +409 -1795
- data/MIT-LICENSE +1 -1
- data/README.rdoc +4 -4
- data/bin/sequel +4 -0
- data/doc/advanced_associations.rdoc +136 -18
- data/doc/association_basics.rdoc +10 -5
- data/doc/cheat_sheet.rdoc +1 -0
- data/doc/code_order.rdoc +12 -2
- data/doc/dataset_filtering.rdoc +17 -2
- data/doc/mass_assignment.rdoc +3 -3
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +30 -8
- data/doc/postgresql.rdoc +107 -2
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/security.rdoc +10 -0
- data/doc/sharding.rdoc +42 -28
- data/doc/sql.rdoc +12 -0
- data/doc/testing.rdoc +24 -17
- data/doc/transactions.rdoc +78 -0
- data/doc/validations.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +26 -18
- data/lib/sequel/adapters/ado/access.rb +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +5 -8
- data/lib/sequel/adapters/amalgalite.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +71 -27
- data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
- data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
- data/lib/sequel/adapters/mysql.rb +14 -15
- data/lib/sequel/adapters/mysql2.rb +5 -3
- data/lib/sequel/adapters/odbc.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +7 -7
- data/lib/sequel/adapters/postgres.rb +52 -16
- data/lib/sequel/adapters/shared/access.rb +16 -12
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/mssql.rb +41 -18
- data/lib/sequel/adapters/shared/mysql.rb +66 -19
- data/lib/sequel/adapters/shared/oracle.rb +29 -23
- data/lib/sequel/adapters/shared/postgres.rb +341 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +174 -21
- data/lib/sequel/adapters/sqlanywhere.rb +33 -17
- data/lib/sequel/adapters/sqlite.rb +78 -68
- data/lib/sequel/adapters/tinytds.rb +14 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
- data/lib/sequel/connection_pool.rb +2 -6
- data/lib/sequel/connection_pool/sharded_single.rb +7 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +26 -11
- data/lib/sequel/core.rb +327 -319
- data/lib/sequel/database/connecting.rb +7 -8
- data/lib/sequel/database/logging.rb +7 -1
- data/lib/sequel/database/misc.rb +68 -34
- data/lib/sequel/database/query.rb +6 -4
- data/lib/sequel/database/schema_generator.rb +31 -11
- data/lib/sequel/database/schema_methods.rb +32 -22
- data/lib/sequel/database/transactions.rb +129 -25
- data/lib/sequel/dataset.rb +4 -2
- data/lib/sequel/dataset/actions.rb +34 -23
- data/lib/sequel/dataset/features.rb +34 -0
- data/lib/sequel/dataset/graph.rb +27 -11
- data/lib/sequel/dataset/misc.rb +17 -3
- data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
- data/lib/sequel/dataset/prepared_statements.rb +96 -26
- data/lib/sequel/dataset/query.rb +43 -8
- data/lib/sequel/dataset/sql.rb +189 -41
- data/lib/sequel/deprecated.rb +3 -1
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -2
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -2
- data/lib/sequel/extensions/connection_expiration.rb +6 -6
- data/lib/sequel/extensions/connection_validator.rb +7 -6
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +53 -28
- data/lib/sequel/extensions/core_refinements.rb +2 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +3 -1
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -3
- data/lib/sequel/extensions/migration.rb +13 -6
- data/lib/sequel/extensions/named_timezones.rb +84 -23
- data/lib/sequel/extensions/pg_array.rb +87 -79
- data/lib/sequel/extensions/pg_array_ops.rb +14 -6
- data/lib/sequel/extensions/pg_enum.rb +34 -18
- data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_inet.rb +15 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +387 -123
- data/lib/sequel/extensions/pg_json_ops.rb +168 -0
- data/lib/sequel/extensions/pg_range.rb +20 -10
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +3 -2
- data/lib/sequel/extensions/pg_row_ops.rb +24 -0
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/query.rb +1 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +13 -7
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
- data/lib/sequel/extensions/server_block.rb +18 -7
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
- data/lib/sequel/extensions/to_dot.rb +9 -3
- data/lib/sequel/model.rb +3 -1
- data/lib/sequel/model/associations.rb +403 -69
- data/lib/sequel/model/base.rb +170 -90
- data/lib/sequel/model/plugins.rb +105 -0
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +74 -22
- data/lib/sequel/plugins/association_proxies.rb +6 -2
- data/lib/sequel/plugins/auto_validations.rb +36 -17
- data/lib/sequel/plugins/blacklist_security.rb +1 -2
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/caching.rb +3 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
- data/lib/sequel/plugins/composition.rb +13 -9
- data/lib/sequel/plugins/csv_serializer.rb +28 -9
- data/lib/sequel/plugins/defaults_setter.rb +2 -2
- data/lib/sequel/plugins/dirty.rb +60 -22
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/finder.rb +2 -2
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/hook_class_methods.rb +17 -5
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +2 -2
- data/lib/sequel/plugins/json_serializer.rb +21 -14
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +22 -10
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +27 -5
- data/lib/sequel/plugins/pg_array_associations.rb +12 -9
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
- data/lib/sequel/plugins/prepared_statements.rb +6 -12
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
- data/lib/sequel/plugins/rcte_tree.rb +20 -22
- data/lib/sequel/plugins/sharding.rb +13 -7
- data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/static_cache.rb +36 -17
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +1 -1
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/tree.rb +49 -31
- data/lib/sequel/plugins/typecast_on_load.rb +3 -2
- data/lib/sequel/plugins/validation_class_methods.rb +11 -5
- data/lib/sequel/plugins/validation_helpers.rb +2 -2
- data/lib/sequel/sql.rb +120 -30
- data/lib/sequel/timezones.rb +55 -14
- data/lib/sequel/version.rb +6 -1
- metadata +101 -361
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -804
- data/spec/adapters/mysql_spec.rb +0 -1041
- data/spec/adapters/oracle_spec.rb +0 -327
- data/spec/adapters/postgres_spec.rb +0 -4000
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -600
- data/spec/bin_spec.rb +0 -269
- data/spec/core/connection_pool_spec.rb +0 -1228
- data/spec/core/database_spec.rb +0 -2673
- data/spec/core/dataset_spec.rb +0 -5419
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1344
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -306
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1820
- data/spec/core/spec_helper.rb +0 -23
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -762
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -202
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/class_table_inheritance_spec.rb +0 -568
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -133
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -395
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -141
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -189
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -74
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -380
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -336
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -275
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -840
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -109
- data/spec/extensions/nested_attributes_spec.rb +0 -703
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
- data/spec/extensions/pg_enum_spec.rb +0 -113
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -289
- data/spec/extensions/pg_json_spec.rb +0 -262
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -487
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -182
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -381
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -868
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -97
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -189
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -61
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_spec.rb +0 -410
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -284
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -58
- data/spec/integration/associations_test.rb +0 -2513
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1880
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2302
- data/spec/integration/prepared_statement_test.rb +0 -398
- data/spec/integration/schema_test.rb +0 -869
- data/spec/integration/spec_helper.rb +0 -64
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -354
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4538
- data/spec/model/base_spec.rb +0 -817
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2262
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -953
- data/spec/model/plugins_spec.rb +0 -318
- data/spec/model/record_spec.rb +0 -2107
- data/spec/model/spec_helper.rb +0 -45
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -4
- data/spec/spec_config.rb +0 -12
|
@@ -25,13 +25,19 @@ module Sequel
|
|
|
25
25
|
# Otherwise, add the block to the list of blocks to call after the currently
|
|
26
26
|
# in progress transaction commits (and only if it commits).
|
|
27
27
|
# Options:
|
|
28
|
+
# :savepoint :: If currently inside a savepoint, only run this hook on transaction
|
|
29
|
+
# commit if all enclosing savepoints have been released.
|
|
28
30
|
# :server :: The server/shard to use.
|
|
29
31
|
def after_commit(opts=OPTS, &block)
|
|
30
32
|
raise Error, "must provide block to after_commit" unless block
|
|
31
33
|
synchronize(opts[:server]) do |conn|
|
|
32
34
|
if h = _trans(conn)
|
|
33
35
|
raise Error, "cannot call after_commit in a prepared transaction" if h[:prepare]
|
|
34
|
-
|
|
36
|
+
if opts[:savepoint] && in_savepoint?(conn)
|
|
37
|
+
add_savepoint_hook(conn, :after_commit, block)
|
|
38
|
+
else
|
|
39
|
+
add_transaction_hook(conn, :after_commit, block)
|
|
40
|
+
end
|
|
35
41
|
else
|
|
36
42
|
yield
|
|
37
43
|
end
|
|
@@ -42,17 +48,65 @@ module Sequel
|
|
|
42
48
|
# Otherwise, add the block to the list of the blocks to call after the currently
|
|
43
49
|
# in progress transaction rolls back (and only if it rolls back).
|
|
44
50
|
# Options:
|
|
51
|
+
# :savepoint :: If currently inside a savepoint, run this hook immediately when
|
|
52
|
+
# any enclosing savepoint is rolled back, which may be before the transaction
|
|
53
|
+
# commits or rollsback.
|
|
45
54
|
# :server :: The server/shard to use.
|
|
46
55
|
def after_rollback(opts=OPTS, &block)
|
|
47
56
|
raise Error, "must provide block to after_rollback" unless block
|
|
48
57
|
synchronize(opts[:server]) do |conn|
|
|
49
58
|
if h = _trans(conn)
|
|
50
59
|
raise Error, "cannot call after_rollback in a prepared transaction" if h[:prepare]
|
|
51
|
-
|
|
60
|
+
if opts[:savepoint] && in_savepoint?(conn)
|
|
61
|
+
add_savepoint_hook(conn, :after_rollback, block)
|
|
62
|
+
else
|
|
63
|
+
add_transaction_hook(conn, :after_rollback, block)
|
|
64
|
+
end
|
|
52
65
|
end
|
|
53
66
|
end
|
|
54
67
|
end
|
|
55
|
-
|
|
68
|
+
|
|
69
|
+
# When exiting the transaction block through methods other than an exception
|
|
70
|
+
# (e.g. normal exit, non-local return, or throw), set the current transaction
|
|
71
|
+
# to rollback instead of committing. This is designed for use in cases where
|
|
72
|
+
# you want to preform a non-local return but also want to rollback instead of
|
|
73
|
+
# committing.
|
|
74
|
+
# Options:
|
|
75
|
+
# :cancel :: Cancel the current rollback_on_exit setting, so exiting will commit instead
|
|
76
|
+
# of rolling back.
|
|
77
|
+
# :savepoint :: Rollback only the current savepoint if inside a savepoint.
|
|
78
|
+
# Can also be an positive integer value to rollback that number of enclosing savepoints,
|
|
79
|
+
# up to and including the transaction itself.
|
|
80
|
+
# If the database does not support savepoints, this option is ignored and the entire
|
|
81
|
+
# transaction is affected.
|
|
82
|
+
# :server :: The server/shard the transaction is being executed on.
|
|
83
|
+
def rollback_on_exit(opts=OPTS)
|
|
84
|
+
synchronize(opts[:server]) do |conn|
|
|
85
|
+
raise Error, "Cannot call Sequel:: Database#rollback_on_exit! unless inside a transaction" unless h = _trans(conn)
|
|
86
|
+
rollback = !opts[:cancel]
|
|
87
|
+
|
|
88
|
+
if supports_savepoints?
|
|
89
|
+
savepoints = h[:savepoints]
|
|
90
|
+
|
|
91
|
+
if level = opts[:savepoint]
|
|
92
|
+
level = 1 if level == true
|
|
93
|
+
raise Error, "invalid :savepoint option to Database#rollback_on_exit: #{level.inspect}" unless level.is_a?(Integer)
|
|
94
|
+
raise Error, "cannot pass nonpositive integer (#{level.inspect}) as :savepoint option to Database#rollback_on_exit" if level < 1
|
|
95
|
+
level.times do |i|
|
|
96
|
+
break unless savepoint = savepoints[-1 - i]
|
|
97
|
+
savepoint[:rollback_on_exit] = rollback
|
|
98
|
+
end
|
|
99
|
+
else
|
|
100
|
+
savepoints[0][:rollback_on_exit] = rollback
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
h[:rollback_on_exit] = rollback
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
nil
|
|
108
|
+
end
|
|
109
|
+
|
|
56
110
|
# Return true if already in a transaction given the options,
|
|
57
111
|
# false otherwise. Respects the :server option for selecting
|
|
58
112
|
# a shard.
|
|
@@ -88,7 +142,7 @@ module Sequel
|
|
|
88
142
|
# :num_retries :: The number of times to retry if the :retry_on option is used.
|
|
89
143
|
# The default is 5 times. Can be set to nil to retry indefinitely,
|
|
90
144
|
# but that is not recommended.
|
|
91
|
-
# :before_retry :: Proc to execute before
|
|
145
|
+
# :before_retry :: Proc to execute before retrying if the :retry_on option is used.
|
|
92
146
|
# Called with two arguments: the number of retry attempts (counting
|
|
93
147
|
# the current one) and the error the last attempt failed with.
|
|
94
148
|
# :prepare :: A string to use as the transaction identifier for a
|
|
@@ -100,7 +154,7 @@ module Sequel
|
|
|
100
154
|
# Note that this should not be used unless the entire transaction
|
|
101
155
|
# block is idempotent, as otherwise it can cause non-idempotent
|
|
102
156
|
# behavior to execute multiple times.
|
|
103
|
-
# :rollback :: Can
|
|
157
|
+
# :rollback :: Can be set to :reraise to reraise any Sequel::Rollback exceptions
|
|
104
158
|
# raised, or :always to always rollback even if no exceptions occur
|
|
105
159
|
# (useful for testing).
|
|
106
160
|
# :server :: The server to use for the transaction. Set to :default, :read_only, or
|
|
@@ -124,19 +178,15 @@ module Sequel
|
|
|
124
178
|
opts = Hash[opts]
|
|
125
179
|
if retry_on = opts[:retry_on]
|
|
126
180
|
tot_retries = opts.fetch(:num_retries, 5)
|
|
127
|
-
num_retries = 0
|
|
181
|
+
num_retries = 0
|
|
128
182
|
begin
|
|
129
183
|
opts[:retry_on] = nil
|
|
130
184
|
opts[:retrying] = true
|
|
131
185
|
transaction(opts, &block)
|
|
132
186
|
rescue *retry_on => e
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
opts[:before_retry].call(num_retries, e) if opts[:before_retry]
|
|
137
|
-
retry
|
|
138
|
-
end
|
|
139
|
-
else
|
|
187
|
+
num_retries += 1
|
|
188
|
+
if tot_retries.nil? || num_retries <= tot_retries
|
|
189
|
+
opts[:before_retry].call(num_retries, e) if opts[:before_retry]
|
|
140
190
|
retry
|
|
141
191
|
end
|
|
142
192
|
raise
|
|
@@ -155,6 +205,10 @@ module Sequel
|
|
|
155
205
|
end
|
|
156
206
|
end
|
|
157
207
|
|
|
208
|
+
if opts[:savepoint] && !supports_savepoints?
|
|
209
|
+
raise Sequel::InvalidOperation, "savepoints not supported on #{database_type}"
|
|
210
|
+
end
|
|
211
|
+
|
|
158
212
|
if already_in_transaction?(conn, opts)
|
|
159
213
|
if opts[:rollback] == :always && !opts.has_key?(:savepoint)
|
|
160
214
|
if supports_savepoints?
|
|
@@ -164,7 +218,7 @@ module Sequel
|
|
|
164
218
|
end
|
|
165
219
|
end
|
|
166
220
|
|
|
167
|
-
if opts[:savepoint] != false && (stack = _trans(conn)[:savepoints]) && stack.last
|
|
221
|
+
if opts[:savepoint] != false && (stack = _trans(conn)[:savepoints]) && stack.last[:auto_savepoint]
|
|
168
222
|
opts[:savepoint] = true
|
|
169
223
|
end
|
|
170
224
|
|
|
@@ -242,10 +296,10 @@ module Sequel
|
|
|
242
296
|
|
|
243
297
|
if supports_savepoints?
|
|
244
298
|
if t = _trans(conn)
|
|
245
|
-
t[:savepoints].push(opts[:auto_savepoint])
|
|
299
|
+
t[:savepoints].push({:auto_savepoint=>opts[:auto_savepoint]})
|
|
246
300
|
return
|
|
247
301
|
else
|
|
248
|
-
hash[:savepoints] = [opts[:auto_savepoint]]
|
|
302
|
+
hash[:savepoints] = [{:auto_savepoint=>opts[:auto_savepoint]}]
|
|
249
303
|
if (prep = opts[:prepare]) && supports_prepared_transactions?
|
|
250
304
|
hash[:prepare] = prep
|
|
251
305
|
end
|
|
@@ -257,6 +311,13 @@ module Sequel
|
|
|
257
311
|
Sequel.synchronize{@transactions[conn] = hash}
|
|
258
312
|
end
|
|
259
313
|
|
|
314
|
+
# Set the given callable as a hook to be called. Type should be either
|
|
315
|
+
# :after_commit or :after_rollback.
|
|
316
|
+
def add_savepoint_hook(conn, type, block)
|
|
317
|
+
savepoint = _trans(conn)[:savepoints].last
|
|
318
|
+
(savepoint[type] ||= []) << block
|
|
319
|
+
end
|
|
320
|
+
|
|
260
321
|
# Set the given callable as a hook to be called. Type should be either
|
|
261
322
|
# :after_commit or :after_rollback.
|
|
262
323
|
def add_transaction_hook(conn, type, block)
|
|
@@ -293,12 +354,8 @@ module Sequel
|
|
|
293
354
|
|
|
294
355
|
# Start a new database transaction or a new savepoint on the given connection.
|
|
295
356
|
def begin_transaction(conn, opts=OPTS)
|
|
296
|
-
if
|
|
297
|
-
|
|
298
|
-
begin_savepoint(conn, opts)
|
|
299
|
-
else
|
|
300
|
-
begin_new_transaction(conn, opts)
|
|
301
|
-
end
|
|
357
|
+
if in_savepoint?(conn)
|
|
358
|
+
begin_savepoint(conn, opts)
|
|
302
359
|
else
|
|
303
360
|
begin_new_transaction(conn, opts)
|
|
304
361
|
end
|
|
@@ -318,7 +375,7 @@ module Sequel
|
|
|
318
375
|
if exception
|
|
319
376
|
false
|
|
320
377
|
else
|
|
321
|
-
if
|
|
378
|
+
if rollback_on_transaction_exit?(conn, opts)
|
|
322
379
|
rollback_transaction(conn, opts)
|
|
323
380
|
false
|
|
324
381
|
else
|
|
@@ -359,10 +416,22 @@ module Sequel
|
|
|
359
416
|
[]
|
|
360
417
|
end
|
|
361
418
|
|
|
419
|
+
# Whether the connection is currently inside a savepoint.
|
|
420
|
+
def in_savepoint?(conn)
|
|
421
|
+
supports_savepoints? && savepoint_level(conn) > 1
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
# Retrieve the savepoint hooks that should be run for the given
|
|
425
|
+
# connection and commit status. This expacts that you are
|
|
426
|
+
# already inside a savepoint when calling.
|
|
427
|
+
def savepoint_hooks(conn, committed)
|
|
428
|
+
_trans(conn)[:savepoints].last[committed ? :after_commit : :after_rollback]
|
|
429
|
+
end
|
|
430
|
+
|
|
362
431
|
# Retrieve the transaction hooks that should be run for the given
|
|
363
432
|
# connection and commit status.
|
|
364
433
|
def transaction_hooks(conn, committed)
|
|
365
|
-
|
|
434
|
+
unless in_savepoint?(conn)
|
|
366
435
|
_trans(conn)[committed ? :after_commit : :after_rollback]
|
|
367
436
|
end
|
|
368
437
|
end
|
|
@@ -370,12 +439,36 @@ module Sequel
|
|
|
370
439
|
# Remove the current thread from the list of active transactions
|
|
371
440
|
def remove_transaction(conn, committed)
|
|
372
441
|
callbacks = transaction_hooks(conn, committed)
|
|
442
|
+
if in_savepoint?(conn)
|
|
443
|
+
savepoint_callbacks = savepoint_hooks(conn, committed)
|
|
444
|
+
if committed
|
|
445
|
+
savepoint_rollback_callbacks = savepoint_hooks(conn, false)
|
|
446
|
+
end
|
|
447
|
+
end
|
|
373
448
|
|
|
374
449
|
if transaction_finished?(conn)
|
|
375
|
-
h =
|
|
450
|
+
h = _trans(conn)
|
|
376
451
|
rolled_back = !committed
|
|
377
452
|
Sequel.synchronize{h[:rolled_back] = rolled_back}
|
|
378
453
|
Sequel.synchronize{@transactions.delete(conn)}
|
|
454
|
+
elsif savepoint_callbacks || savepoint_rollback_callbacks
|
|
455
|
+
if committed
|
|
456
|
+
meth = in_savepoint?(conn) ? :add_savepoint_hook : :add_transaction_hook
|
|
457
|
+
|
|
458
|
+
if savepoint_callbacks
|
|
459
|
+
savepoint_callbacks.each do |block|
|
|
460
|
+
send(meth, conn, :after_commit, block)
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
if savepoint_rollback_callbacks
|
|
465
|
+
savepoint_rollback_callbacks.each do |block|
|
|
466
|
+
send(meth, conn, :after_rollback, block)
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
else
|
|
470
|
+
savepoint_callbacks.each(&:call)
|
|
471
|
+
end
|
|
379
472
|
end
|
|
380
473
|
|
|
381
474
|
callbacks.each(&:call) if callbacks
|
|
@@ -386,6 +479,17 @@ module Sequel
|
|
|
386
479
|
"ROLLBACK TO SAVEPOINT autopoint_#{depth}"
|
|
387
480
|
end
|
|
388
481
|
|
|
482
|
+
# Whether to rollback the transaction when exiting the transaction.
|
|
483
|
+
def rollback_on_transaction_exit?(conn, opts)
|
|
484
|
+
return true if Thread.current.status == 'aborting'
|
|
485
|
+
h = _trans(conn)
|
|
486
|
+
if supports_savepoints?
|
|
487
|
+
h[:savepoints].last[:rollback_on_exit]
|
|
488
|
+
else
|
|
489
|
+
h[:rollback_on_exit]
|
|
490
|
+
end
|
|
491
|
+
end
|
|
492
|
+
|
|
389
493
|
# Rollback the active transaction on the connection
|
|
390
494
|
def rollback_transaction(conn, opts=OPTS)
|
|
391
495
|
if supports_savepoints?
|
data/lib/sequel/dataset.rb
CHANGED
|
@@ -20,8 +20,10 @@ module Sequel
|
|
|
20
20
|
# old_posts = posts.where{stamp < Date.today - 7}
|
|
21
21
|
# davids_old_posts = davids_posts.where{stamp < Date.today - 7}
|
|
22
22
|
#
|
|
23
|
-
# Datasets are Enumerable objects, so they can be manipulated using
|
|
24
|
-
# of the Enumerable methods, such as map
|
|
23
|
+
# Datasets are Enumerable objects, so they can be manipulated using many
|
|
24
|
+
# of the Enumerable methods, such as +map+ and +inject+. Note that there are some methods
|
|
25
|
+
# that Dataset defines that override methods defined in Enumerable and result in different
|
|
26
|
+
# behavior, such as +select+ and +group_by+.
|
|
25
27
|
#
|
|
26
28
|
# For more information, see the {"Dataset Basics" guide}[rdoc-ref:doc/dataset_basics.rdoc].
|
|
27
29
|
class Dataset
|
|
@@ -18,7 +18,7 @@ module Sequel
|
|
|
18
18
|
where_all where_each where_single_value
|
|
19
19
|
METHS
|
|
20
20
|
|
|
21
|
-
# The clone options to use when
|
|
21
|
+
# The clone options to use when retrieving columns for a dataset.
|
|
22
22
|
COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 1, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
|
|
23
23
|
|
|
24
24
|
# Inserts the given argument into the database. Returns self so it
|
|
@@ -58,7 +58,8 @@ module Sequel
|
|
|
58
58
|
# # => 3
|
|
59
59
|
# DB[:table].avg{function(column)} # SELECT avg(function(column)) FROM table LIMIT 1
|
|
60
60
|
# # => 1
|
|
61
|
-
def avg(arg=
|
|
61
|
+
def avg(arg=(no_arg = true), &block)
|
|
62
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
|
62
63
|
_aggregate(:avg, arg)
|
|
63
64
|
end
|
|
64
65
|
|
|
@@ -231,10 +232,11 @@ module Sequel
|
|
|
231
232
|
|
|
232
233
|
return res
|
|
233
234
|
end
|
|
235
|
+
where_args = args
|
|
234
236
|
args = arg
|
|
235
237
|
end
|
|
236
238
|
|
|
237
|
-
if loader =
|
|
239
|
+
if loader = cached_where_placeholder_literalizer(where_args||args, block, :_first_cond_loader) do |pl|
|
|
238
240
|
_single_record_ds.where(pl.arg)
|
|
239
241
|
end
|
|
240
242
|
|
|
@@ -331,6 +333,7 @@ module Sequel
|
|
|
331
333
|
# after every 50 records.
|
|
332
334
|
# :return :: When this is set to :primary_key, returns an array of
|
|
333
335
|
# autoincremented primary key values for the rows inserted.
|
|
336
|
+
# This does not have an effect if +values+ is a Dataset.
|
|
334
337
|
# :server :: Set the server/shard to use for the transaction and insert
|
|
335
338
|
# queries.
|
|
336
339
|
# :slice :: Same as :commit_every, :commit_every takes precedence.
|
|
@@ -356,7 +359,7 @@ module Sequel
|
|
|
356
359
|
|
|
357
360
|
# Inserts values into the associated table. The returned value is generally
|
|
358
361
|
# the value of the autoincremented primary key for the inserted row, assuming that
|
|
359
|
-
#
|
|
362
|
+
# a single row is inserted and the table has an autoincrementing primary key.
|
|
360
363
|
#
|
|
361
364
|
# +insert+ handles a number of different argument formats:
|
|
362
365
|
# no arguments or single empty hash :: Uses DEFAULT VALUES
|
|
@@ -449,7 +452,8 @@ module Sequel
|
|
|
449
452
|
# # => 10
|
|
450
453
|
# DB[:table].max{function(column)} # SELECT max(function(column)) FROM table LIMIT 1
|
|
451
454
|
# # => 7
|
|
452
|
-
def max(arg=
|
|
455
|
+
def max(arg=(no_arg = true), &block)
|
|
456
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
|
453
457
|
_aggregate(:max, arg)
|
|
454
458
|
end
|
|
455
459
|
|
|
@@ -460,7 +464,8 @@ module Sequel
|
|
|
460
464
|
# # => 1
|
|
461
465
|
# DB[:table].min{function(column)} # SELECT min(function(column)) FROM table LIMIT 1
|
|
462
466
|
# # => 0
|
|
463
|
-
def min(arg=
|
|
467
|
+
def min(arg=(no_arg = true), &block)
|
|
468
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
|
464
469
|
_aggregate(:min, arg)
|
|
465
470
|
end
|
|
466
471
|
|
|
@@ -482,7 +487,7 @@ module Sequel
|
|
|
482
487
|
import(columns, hashes.map{|h| columns.map{|c| h[c]}}, opts)
|
|
483
488
|
end
|
|
484
489
|
|
|
485
|
-
# Yields each row in the dataset, but
|
|
490
|
+
# Yields each row in the dataset, but internally uses multiple queries as needed to
|
|
486
491
|
# process the entire result set without keeping all rows in the dataset in memory,
|
|
487
492
|
# even if the underlying driver buffers all query results in memory.
|
|
488
493
|
#
|
|
@@ -508,7 +513,7 @@ module Sequel
|
|
|
508
513
|
# NULLs. Note that some Sequel adapters have optimized implementations that will
|
|
509
514
|
# use cursors or streaming regardless of the :strategy option used.
|
|
510
515
|
# :filter_values :: If the strategy: :filter option is used, this option should be a proc
|
|
511
|
-
# that accepts the last
|
|
516
|
+
# that accepts the last retrieved row for the previous page and an array of
|
|
512
517
|
# ORDER BY expressions, and returns an array of values relating to those
|
|
513
518
|
# expressions for the last retrieved row. You will need to use this option
|
|
514
519
|
# if your ORDER BY expressions are not simple columns, if they contain
|
|
@@ -602,14 +607,16 @@ module Sequel
|
|
|
602
607
|
# as_hash, it accepts an optional :hash parameter, into which entries will
|
|
603
608
|
# be merged.
|
|
604
609
|
#
|
|
605
|
-
# DB[:table].select_hash(:id, :name)
|
|
610
|
+
# DB[:table].select_hash(:id, :name)
|
|
611
|
+
# # SELECT id, name FROM table
|
|
606
612
|
# # => {1=>'a', 2=>'b', ...}
|
|
607
613
|
#
|
|
608
614
|
# You can also provide an array of column names for either the key_column,
|
|
609
615
|
# the value column, or both:
|
|
610
616
|
#
|
|
611
|
-
# DB[:table].select_hash([:id, :foo], [:name, :bar])
|
|
612
|
-
# #
|
|
617
|
+
# DB[:table].select_hash([:id, :foo], [:name, :bar])
|
|
618
|
+
# # SELECT id, foo, name, bar FROM table
|
|
619
|
+
# # => {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
|
|
613
620
|
#
|
|
614
621
|
# When using this method, you must be sure that each expression has an alias
|
|
615
622
|
# that Sequel can determine.
|
|
@@ -621,14 +628,16 @@ module Sequel
|
|
|
621
628
|
# Similar to to_hash_groups, but only selects the columns given. Like to_hash_groups,
|
|
622
629
|
# it accepts an optional :hash parameter, into which entries will be merged.
|
|
623
630
|
#
|
|
624
|
-
# DB[:table].select_hash_groups(:name, :id)
|
|
631
|
+
# DB[:table].select_hash_groups(:name, :id)
|
|
632
|
+
# # SELECT id, name FROM table
|
|
625
633
|
# # => {'a'=>[1, 4, ...], 'b'=>[2, ...], ...}
|
|
626
634
|
#
|
|
627
635
|
# You can also provide an array of column names for either the key_column,
|
|
628
636
|
# the value column, or both:
|
|
629
637
|
#
|
|
630
|
-
# DB[:table].select_hash_groups([:first, :middle], [:last, :id])
|
|
631
|
-
# #
|
|
638
|
+
# DB[:table].select_hash_groups([:first, :middle], [:last, :id])
|
|
639
|
+
# # SELECT first, middle, last, id FROM table
|
|
640
|
+
# # => {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
|
|
632
641
|
#
|
|
633
642
|
# When using this method, you must be sure that each expression has an alias
|
|
634
643
|
# that Sequel can determine.
|
|
@@ -732,7 +741,8 @@ module Sequel
|
|
|
732
741
|
# # => 55
|
|
733
742
|
# DB[:table].sum{function(column)} # SELECT sum(function(column)) FROM table LIMIT 1
|
|
734
743
|
# # => 10
|
|
735
|
-
def sum(arg=
|
|
744
|
+
def sum(arg=(no_arg = true), &block)
|
|
745
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
|
736
746
|
_aggregate(:sum, arg)
|
|
737
747
|
end
|
|
738
748
|
|
|
@@ -875,7 +885,7 @@ module Sequel
|
|
|
875
885
|
# DB[:table].where_all(id: [1,2,3])
|
|
876
886
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
|
877
887
|
def where_all(cond, &block)
|
|
878
|
-
if loader = _where_loader
|
|
888
|
+
if loader = _where_loader([cond], nil)
|
|
879
889
|
loader.all(filter_expr(cond), &block)
|
|
880
890
|
else
|
|
881
891
|
where(cond).all(&block)
|
|
@@ -889,7 +899,7 @@ module Sequel
|
|
|
889
899
|
# DB[:table].where_each(id: [1,2,3]){|row| p row}
|
|
890
900
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
|
891
901
|
def where_each(cond, &block)
|
|
892
|
-
if loader = _where_loader
|
|
902
|
+
if loader = _where_loader([cond], nil)
|
|
893
903
|
loader.each(filter_expr(cond), &block)
|
|
894
904
|
else
|
|
895
905
|
where(cond).each(&block)
|
|
@@ -904,7 +914,7 @@ module Sequel
|
|
|
904
914
|
# DB[:table].select(:name).where_single_value(id: 1)
|
|
905
915
|
# # SELECT name FROM table WHERE (id = 1) LIMIT 1
|
|
906
916
|
def where_single_value(cond)
|
|
907
|
-
if loader =
|
|
917
|
+
if loader = cached_where_placeholder_literalizer([cond], nil, :_where_single_value_loader) do |pl|
|
|
908
918
|
single_value_ds.where(pl.arg)
|
|
909
919
|
end
|
|
910
920
|
|
|
@@ -966,7 +976,8 @@ module Sequel
|
|
|
966
976
|
# separate insert commands for each row. Otherwise, call #multi_insert_sql
|
|
967
977
|
# and execute each statement it gives separately.
|
|
968
978
|
def _import(columns, values, opts)
|
|
969
|
-
trans_opts = Hash[opts]
|
|
979
|
+
trans_opts = Hash[opts]
|
|
980
|
+
trans_opts[:server] = @opts[:server]
|
|
970
981
|
if opts[:return] == :primary_key
|
|
971
982
|
@db.transaction(trans_opts){values.map{|v| insert(columns, v)}}
|
|
972
983
|
else
|
|
@@ -1039,8 +1050,8 @@ module Sequel
|
|
|
1039
1050
|
end
|
|
1040
1051
|
|
|
1041
1052
|
# Loader used for where_all and where_each.
|
|
1042
|
-
def _where_loader
|
|
1043
|
-
|
|
1053
|
+
def _where_loader(where_args, where_block)
|
|
1054
|
+
cached_where_placeholder_literalizer(where_args, where_block, :_where_loader) do |pl|
|
|
1044
1055
|
where(pl.arg)
|
|
1045
1056
|
end
|
|
1046
1057
|
end
|
|
@@ -1063,7 +1074,7 @@ module Sequel
|
|
|
1063
1074
|
|
|
1064
1075
|
# Set the server to use to :default unless it is already set in the passed opts
|
|
1065
1076
|
def default_server_opts(opts)
|
|
1066
|
-
if @db.sharded?
|
|
1077
|
+
if @db.sharded? && !opts.has_key?(:server)
|
|
1067
1078
|
opts = Hash[opts]
|
|
1068
1079
|
opts[:server] = @opts[:server] || :default
|
|
1069
1080
|
end
|
|
@@ -1074,7 +1085,7 @@ module Sequel
|
|
|
1074
1085
|
# :read_only server unless a specific server is set.
|
|
1075
1086
|
def execute(sql, opts=OPTS, &block)
|
|
1076
1087
|
db = @db
|
|
1077
|
-
if db.sharded?
|
|
1088
|
+
if db.sharded? && !opts.has_key?(:server)
|
|
1078
1089
|
opts = Hash[opts]
|
|
1079
1090
|
opts[:server] = @opts[:server] || (@opts[:lock] ? :default : :read_only)
|
|
1080
1091
|
opts
|