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
data/doc/sql.rdoc
CHANGED
|
@@ -229,6 +229,18 @@ If the database supports window functions, Sequel can handle them by calling the
|
|
|
229
229
|
DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6.desc])}
|
|
230
230
|
# SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6 DESC) FROM albums
|
|
231
231
|
|
|
232
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>:rows)}
|
|
233
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM albums
|
|
234
|
+
|
|
235
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>1, :end=>1})}
|
|
236
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
|
|
237
|
+
|
|
238
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
|
|
239
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
|
|
240
|
+
|
|
241
|
+
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
|
|
242
|
+
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
|
|
243
|
+
|
|
232
244
|
=== Schema Qualified Functions
|
|
233
245
|
|
|
234
246
|
If the database supports schema qualified functions, Sequel can handle them by calling the +function+ method on a qualified identifier:
|
data/doc/testing.rdoc
CHANGED
|
@@ -8,34 +8,39 @@ These run each test in its own transaction, the recommended way to test.
|
|
|
8
8
|
|
|
9
9
|
=== minitest/spec
|
|
10
10
|
|
|
11
|
-
==== with minitest-hooks
|
|
12
|
-
|
|
11
|
+
==== with minitest-hooks
|
|
13
12
|
require 'minitest/hooks/default'
|
|
13
|
+
|
|
14
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
15
|
+
|
|
14
16
|
class Minitest::HooksSpec
|
|
15
17
|
def around
|
|
16
|
-
|
|
18
|
+
DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
|
|
17
19
|
end
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
==== without minitest-hooks
|
|
21
|
-
|
|
22
|
+
==== without minitest-hooks
|
|
23
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
24
|
+
|
|
22
25
|
class Minitest::Spec
|
|
23
26
|
def run(*args, &block)
|
|
24
|
-
|
|
27
|
+
DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
|
|
25
28
|
end
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
=== minitest/test
|
|
29
|
-
|
|
32
|
+
DB = Sequel.postgres # change if using sqlite etc
|
|
33
|
+
|
|
30
34
|
# Use this class as the base class for your tests
|
|
31
35
|
class SequelTestCase < Minitest::Test
|
|
32
36
|
def run(*args, &block)
|
|
33
|
-
|
|
37
|
+
DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
|
|
34
38
|
end
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
=== rspec >= 2.8
|
|
38
|
-
|
|
42
|
+
DB = Sequel.postgres # change the database if you are using sqlite etc.
|
|
43
|
+
|
|
39
44
|
RSpec.configure do |c|
|
|
40
45
|
c.around(:each) do |example|
|
|
41
46
|
DB.transaction(:rollback=>:always, :auto_savepoint=>true){example.run}
|
|
@@ -46,7 +51,7 @@ These run each test in its own transaction, the recommended way to test.
|
|
|
46
51
|
|
|
47
52
|
You can use the Sequel.transaction method to run a transaction on multiple databases, rolling all of them back. Instead of:
|
|
48
53
|
|
|
49
|
-
|
|
54
|
+
DB.transaction(:rollback=>:always)
|
|
50
55
|
|
|
51
56
|
Use Sequel.transaction with an array of databases:
|
|
52
57
|
|
|
@@ -66,11 +71,11 @@ Example:
|
|
|
66
71
|
require 'minitest/hooks/default'
|
|
67
72
|
class Minitest::HooksSpec
|
|
68
73
|
def around
|
|
69
|
-
|
|
74
|
+
DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true){super}
|
|
70
75
|
end
|
|
71
76
|
|
|
72
77
|
def around_all
|
|
73
|
-
|
|
78
|
+
DB.transaction(:rollback=>:always){super}
|
|
74
79
|
end
|
|
75
80
|
end
|
|
76
81
|
|
|
@@ -90,9 +95,9 @@ The order in which you delete/truncate the tables is important if you are using
|
|
|
90
95
|
|
|
91
96
|
describe "some test suite" do
|
|
92
97
|
after do
|
|
93
|
-
[:table1, :table2].each{|x|
|
|
98
|
+
[:table1, :table2].each{|x| DB.from(x).truncate}
|
|
94
99
|
# or
|
|
95
|
-
[:table1, :table2].each{|x|
|
|
100
|
+
[:table1, :table2].each{|x| DB.from(x).delete}
|
|
96
101
|
end
|
|
97
102
|
end
|
|
98
103
|
|
|
@@ -100,9 +105,9 @@ The order in which you delete/truncate the tables is important if you are using
|
|
|
100
105
|
|
|
101
106
|
class SomeTestClass < Minitest::Test
|
|
102
107
|
def teardown
|
|
103
|
-
[:table1, :table2].each{|x|
|
|
108
|
+
[:table1, :table2].each{|x| DB.from(x).truncate}
|
|
104
109
|
# or
|
|
105
|
-
[:table1, :table2].each{|x|
|
|
110
|
+
[:table1, :table2].each{|x| DB.from(x).delete}
|
|
106
111
|
end
|
|
107
112
|
end
|
|
108
113
|
|
|
@@ -157,14 +162,16 @@ SEQUEL_CONNECTION_VALIDATOR :: Use the connection validator extension when runni
|
|
|
157
162
|
SEQUEL_DUPLICATE_COLUMNS_HANDLER :: Use the duplicate columns handler extension with value given when running the specs
|
|
158
163
|
SEQUEL_ERROR_SQL :: Use the error_sql extension when running the specs
|
|
159
164
|
SEQUEL_INDEX_CACHING :: Use the index_caching extension when running the specs
|
|
165
|
+
SEQUEL_FIBER_CONCURRENCY :: Use the fiber_concurrency extension when running the adapter and integration specs
|
|
160
166
|
SEQUEL_FREEZE_DATABASE :: Freeze the database before running the integration specs
|
|
161
167
|
SEQUEL_IDENTIFIER_MANGLING :: Use the identifier_mangling extension when running the specs
|
|
162
168
|
SEQUEL_INTEGER64 :: Use the integer64 extension when running the adapter or integration specs
|
|
163
169
|
SEQUEL_MODEL_PREPARED_STATEMENTS :: Use the prepared_statements plugin when running the specs
|
|
170
|
+
SEQUEL_MODEL_THROW_FAILURES :: Use the throw_failures plugin when running the specs
|
|
164
171
|
SEQUEL_NO_CACHE_ASSOCIATIONS :: Don't cache association metadata when running the specs
|
|
165
|
-
SEQUEL_NO_CHECK_SQLS :: Don't check for specific SQL syntax when running the specs
|
|
166
172
|
SEQUEL_CHECK_PENDING :: Try running all specs (note, can cause lockups for some adapters), and raise errors for skipped specs that don't fail
|
|
167
173
|
SEQUEL_NO_PENDING :: Don't skip any specs, try running all specs (note, can cause lockups for some adapters)
|
|
168
174
|
SEQUEL_PG_TIMESTAMPTZ :: Use the pg_timestamptz extension when running the postgres specs
|
|
169
175
|
SEQUEL_SPLIT_SYMBOLS :: Turn on symbol splitting when running the adapter and integration specs
|
|
170
176
|
SEQUEL_SYNCHRONIZE_SQL :: Use the synchronize_sql extension when running the specs
|
|
177
|
+
SEQUEL_TZINFO_VERSION :: Force the given tzinfo version when running the specs (e.g. '>=2')
|
data/doc/transactions.rdoc
CHANGED
|
@@ -36,6 +36,12 @@ If any other exception is raised, the transaction is rolled back, and the except
|
|
|
36
36
|
end # ROLLBACK
|
|
37
37
|
# ArgumentError raised
|
|
38
38
|
|
|
39
|
+
If you want the current transaction to be rolled back when the transaction block exits instead of being committed (even if an exception is not raised), use <tt>Database#rollback_on_exit</tt>
|
|
40
|
+
|
|
41
|
+
DB.transaction do # BEGIN
|
|
42
|
+
DB.rollback_on_exit
|
|
43
|
+
end # ROLLBACK
|
|
44
|
+
|
|
39
45
|
If you want Sequel::Rollback exceptions to be reraised, use the <tt>rollback: :reraise</tt> option:
|
|
40
46
|
|
|
41
47
|
DB.transaction(rollback: :reraise) do # BEGIN
|
|
@@ -121,6 +127,78 @@ Other exceptions, unless rescued inside the outer transaction block, will rollba
|
|
|
121
127
|
end # ROLLBACK
|
|
122
128
|
# ArgumentError raised
|
|
123
129
|
|
|
130
|
+
If you want the current savepoint to be rolled back when the savepoint block exits instead of being committed (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>true)</tt>
|
|
131
|
+
|
|
132
|
+
DB.transaction do # BEGIN
|
|
133
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
134
|
+
DB.rollback_on_exit(:savepoint=>true)
|
|
135
|
+
end # ROLLBACK TO SAVEPOINT
|
|
136
|
+
end # COMMIT
|
|
137
|
+
|
|
138
|
+
DB.transaction do # BEGIN
|
|
139
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
140
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
141
|
+
DB.rollback_on_exit(:savepoint=>true)
|
|
142
|
+
end # ROLLBACK TO SAVEPOINT
|
|
143
|
+
end # RELEASE SAVEPOINT
|
|
144
|
+
end # COMMIT
|
|
145
|
+
|
|
146
|
+
If you want the current savepoint and potentially enclosing savepoints to be rolled back when the savepoint blocks exit (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>integer)</tt>
|
|
147
|
+
|
|
148
|
+
DB.transaction do # BEGIN
|
|
149
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
150
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
151
|
+
DB.rollback_on_exit(:savepoint=>2)
|
|
152
|
+
end # ROLLBACK TO SAVEPOINT
|
|
153
|
+
end # ROLLBACK TO SAVEPOINT
|
|
154
|
+
end # COMMIT
|
|
155
|
+
|
|
156
|
+
DB.transaction do # BEGIN
|
|
157
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
158
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
159
|
+
DB.rollback_on_exit(:savepoint=>3)
|
|
160
|
+
end # ROLLBACK TO SAVEPOINT
|
|
161
|
+
end # ROLLBACK TO SAVEPOINT
|
|
162
|
+
end # ROLLBACK
|
|
163
|
+
|
|
164
|
+
=== Savepoint Hooks
|
|
165
|
+
|
|
166
|
+
When using savepoints, you can use the +:savepoint+ option to +after_commit+ or +after_rollback+ to use a savepoint hook. For +after_commit+, this will only run the hook after transaction commit if all enclosing savepoints are released (not rolled back). For +after_rollback+, this will run the hook after any enclosing savepoint is rolled back (before transaction commit), or after the transaction is rolled back if all enclosing savepoints are released:
|
|
167
|
+
|
|
168
|
+
x = nil
|
|
169
|
+
DB.transaction do # BEGIN
|
|
170
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
171
|
+
DB.after_commit(savepoint: true){x = 1}
|
|
172
|
+
DB.after_rollback(savepoint: true){x = 2}
|
|
173
|
+
x # nil
|
|
174
|
+
end # RELEASE SAVEPOINT
|
|
175
|
+
x # nil
|
|
176
|
+
end # COMMIT
|
|
177
|
+
x # 1
|
|
178
|
+
|
|
179
|
+
x = nil
|
|
180
|
+
DB.transaction do # BEGIN
|
|
181
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
182
|
+
DB.after_commit(savepoint: true){x = 1}
|
|
183
|
+
DB.after_rollback(savepoint: true){x = 2}
|
|
184
|
+
x # nil
|
|
185
|
+
raise Sequel::Rollback
|
|
186
|
+
end # ROLLBACK TO SAVEPOINT
|
|
187
|
+
x # 2
|
|
188
|
+
end # COMMIT
|
|
189
|
+
x # 2
|
|
190
|
+
|
|
191
|
+
x = nil
|
|
192
|
+
DB.transaction do # BEGIN
|
|
193
|
+
DB.transaction(savepoint: true) do # SAVEPOINT
|
|
194
|
+
DB.after_commit(savepoint: true){x = 1}
|
|
195
|
+
DB.after_rollback(savepoint: true){x = 2}
|
|
196
|
+
end # RELEASE SAVEPOINT
|
|
197
|
+
x # nil
|
|
198
|
+
raise Sequel::Rollback
|
|
199
|
+
end
|
|
200
|
+
x # 2
|
|
201
|
+
|
|
124
202
|
== Prepared Transactions / Two-Phase Commit
|
|
125
203
|
|
|
126
204
|
Sequel supports database prepared transactions on PostgreSQL, MySQL, and H2. With prepared transactions, at the end of the transaction, the transaction is not immediately committed (it acts like a rollback). Later, you can call +commit_prepared_transaction+ to commit the transaction or +rollback_prepared_transaction+ to roll the transaction back. Prepared transactions are usually used with distributed databases to make sure all databases commit the same transaction or none of them do.
|
data/doc/validations.rdoc
CHANGED
|
@@ -232,7 +232,7 @@ These methods check that the specified attributes can be valid integers or valid
|
|
|
232
232
|
|
|
233
233
|
=== +validates_operator+
|
|
234
234
|
|
|
235
|
-
+validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
|
|
235
|
+
+validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc.) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
|
|
236
236
|
|
|
237
237
|
class Album < Sequel::Model
|
|
238
238
|
def validate
|
|
@@ -535,7 +535,7 @@ Note that the column names used in the errors are used verbatim in the error mes
|
|
|
535
535
|
errors.full_messages
|
|
536
536
|
# => ["Album name is not valid"]
|
|
537
537
|
|
|
538
|
-
Alternatively, feel free to override Sequel::Model::Errors#full_messages. As long as it returns an array of strings,
|
|
538
|
+
Alternatively, feel free to override Sequel::Model::Errors#full_messages. As long as it returns an array of strings, overriding it is completely safe.
|
|
539
539
|
|
|
540
540
|
=== +count+
|
|
541
541
|
|
data/lib/sequel/adapters/ado.rb
CHANGED
|
@@ -47,34 +47,40 @@ module Sequel
|
|
|
47
47
|
#AdVarWChar = 202
|
|
48
48
|
#AdWChar = 130
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def cp.bigint(v)
|
|
50
|
+
bigint = Object.new
|
|
51
|
+
def bigint.call(v)
|
|
53
52
|
v.to_i
|
|
54
53
|
end
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
numeric = Object.new
|
|
56
|
+
def numeric.call(v)
|
|
57
|
+
if v.include?(',')
|
|
58
|
+
BigDecimal(v.tr(',', '.'))
|
|
59
|
+
else
|
|
60
|
+
BigDecimal(v)
|
|
61
|
+
end
|
|
58
62
|
end
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
binary = Object.new
|
|
65
|
+
def binary.call(v)
|
|
61
66
|
Sequel.blob(v.pack('c*'))
|
|
62
67
|
end
|
|
63
68
|
|
|
64
|
-
|
|
69
|
+
date = Object.new
|
|
70
|
+
def date.call(v)
|
|
65
71
|
Date.new(v.year, v.month, v.day)
|
|
66
72
|
end
|
|
67
73
|
|
|
68
74
|
CONVERSION_PROCS = {}
|
|
69
75
|
[
|
|
70
|
-
[
|
|
71
|
-
[
|
|
72
|
-
[
|
|
73
|
-
[
|
|
74
|
-
].each do |
|
|
75
|
-
|
|
76
|
+
[bigint, AdBigInt],
|
|
77
|
+
[numeric, AdNumeric, AdVarNumeric],
|
|
78
|
+
[date, AdDBDate],
|
|
79
|
+
[binary, AdBinary, AdVarBinary, AdLongVarBinary]
|
|
80
|
+
].each do |callable, *types|
|
|
81
|
+
callable.freeze
|
|
76
82
|
types.each do |i|
|
|
77
|
-
CONVERSION_PROCS[i] =
|
|
83
|
+
CONVERSION_PROCS[i] = callable
|
|
78
84
|
end
|
|
79
85
|
end
|
|
80
86
|
CONVERSION_PROCS.freeze
|
|
@@ -227,7 +233,6 @@ module Sequel
|
|
|
227
233
|
cols = []
|
|
228
234
|
conversion_procs = db.conversion_procs
|
|
229
235
|
|
|
230
|
-
i = -1
|
|
231
236
|
ts_cp = nil
|
|
232
237
|
recordset.Fields.each do |field|
|
|
233
238
|
type = field.Type
|
|
@@ -244,18 +249,21 @@ module Sequel
|
|
|
244
249
|
else
|
|
245
250
|
conversion_procs[type]
|
|
246
251
|
end
|
|
247
|
-
cols << [output_identifier(field.Name), cp
|
|
252
|
+
cols << [output_identifier(field.Name), cp]
|
|
248
253
|
end
|
|
249
254
|
|
|
250
255
|
self.columns = cols.map(&:first)
|
|
251
256
|
return if recordset.EOF
|
|
257
|
+
max = cols.length
|
|
252
258
|
|
|
253
259
|
recordset.GetRows.transpose.each do |field_values|
|
|
254
260
|
h = {}
|
|
255
261
|
|
|
256
|
-
|
|
262
|
+
i = -1
|
|
263
|
+
while (i += 1) < max
|
|
264
|
+
name, cp = cols[i]
|
|
257
265
|
h[name] = if (v = field_values[i]) && cp
|
|
258
|
-
cp
|
|
266
|
+
cp.call(v)
|
|
259
267
|
else
|
|
260
268
|
v
|
|
261
269
|
end
|
|
@@ -111,7 +111,7 @@ module Sequel
|
|
|
111
111
|
log_connection_yield(sql, conn){conn.Execute(sql)}
|
|
112
112
|
last_insert_sql = "SELECT @@IDENTITY"
|
|
113
113
|
res = log_connection_yield(last_insert_sql, conn){conn.Execute(last_insert_sql)}
|
|
114
|
-
res.
|
|
114
|
+
res.GetRows.transpose.each{|r| return r.shift}
|
|
115
115
|
rescue ::WIN32OLERuntimeError => e
|
|
116
116
|
raise_error(e)
|
|
117
117
|
end
|
|
@@ -296,7 +296,7 @@ module Sequel
|
|
|
296
296
|
execute_open_ado_schema(type, criteria) do |s|
|
|
297
297
|
cols = []
|
|
298
298
|
s.Fields.each{|f| cols << f.Name}
|
|
299
|
-
s.
|
|
299
|
+
s.GetRows.transpose.each do |r|
|
|
300
300
|
row = {}
|
|
301
301
|
cols.each{|c| row[c] = r.shift}
|
|
302
302
|
yield row
|
|
@@ -7,17 +7,14 @@ module Sequel
|
|
|
7
7
|
module MSSQL
|
|
8
8
|
module DatabaseMethods
|
|
9
9
|
include Sequel::MSSQL::DatabaseMethods
|
|
10
|
-
|
|
11
|
-
# use pass by reference with an integer variable, which is
|
|
12
|
-
# not supported directly in ruby, and I'm not aware of a workaround.
|
|
10
|
+
|
|
13
11
|
def execute_dui(sql, opts=OPTS)
|
|
14
12
|
return super unless @opts[:provider]
|
|
15
13
|
synchronize(opts[:server]) do |conn|
|
|
16
14
|
begin
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
res.getRows.transpose.each{|r| return r.shift}
|
|
15
|
+
sql = "SET NOCOUNT ON; #{sql}; SELECT @@ROWCOUNT"
|
|
16
|
+
rst = log_connection_yield(sql, conn){conn.Execute(sql)}
|
|
17
|
+
rst.GetRows[0][0]
|
|
21
18
|
rescue ::WIN32OLERuntimeError => e
|
|
22
19
|
raise_error(e)
|
|
23
20
|
end
|
|
@@ -50,7 +47,7 @@ module Sequel
|
|
|
50
47
|
# is necessary as ADO's default :provider uses a separate native
|
|
51
48
|
# connection for each query.
|
|
52
49
|
def insert(*values)
|
|
53
|
-
return super if @opts[:sql] || @opts[:returning]
|
|
50
|
+
return super if (@opts[:sql] && !@opts[:prepared_sql]) || @opts[:returning]
|
|
54
51
|
with_sql("SET NOCOUNT ON; #{insert_sql(*values)}; SELECT CAST(SCOPE_IDENTITY() AS INTEGER)").single_value
|
|
55
52
|
end
|
|
56
53
|
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
|
@@ -17,7 +17,19 @@ module Sequel
|
|
|
17
17
|
# Contains procs keyed on subadapter type that extend the
|
|
18
18
|
# given database object so it supports the correct database type.
|
|
19
19
|
DATABASE_SETUP = {}
|
|
20
|
+
|
|
21
|
+
# Create custom NativeException alias for nicer access, and also so that
|
|
22
|
+
# JRuby 9.2+ so it doesn't use the deprecated ::NativeException
|
|
23
|
+
NativeException = java.lang.Exception
|
|
20
24
|
|
|
25
|
+
# Default database error classes
|
|
26
|
+
DATABASE_ERROR_CLASSES = [NativeException]
|
|
27
|
+
if JRUBY_VERSION < '9.2'
|
|
28
|
+
# On JRuby <9.2, still include ::NativeException, as it is still needed in some cases
|
|
29
|
+
DATABASE_ERROR_CLASSES << ::NativeException
|
|
30
|
+
end
|
|
31
|
+
DATABASE_ERROR_CLASSES.freeze
|
|
32
|
+
|
|
21
33
|
# Allow loading the necessary JDBC support via a gem.
|
|
22
34
|
def self.load_gem(name)
|
|
23
35
|
begin
|
|
@@ -39,55 +51,80 @@ module Sequel
|
|
|
39
51
|
# Raise a Sequel::AdapterNotFound if evaluating the class name raises a NameError.
|
|
40
52
|
def self.load_driver(drv, gem=nil)
|
|
41
53
|
load_gem(gem) if gem
|
|
42
|
-
|
|
54
|
+
if drv.is_a?(String)
|
|
55
|
+
eval drv
|
|
56
|
+
else
|
|
57
|
+
*try, last = drv
|
|
58
|
+
try.each do |try_drv|
|
|
59
|
+
begin
|
|
60
|
+
return eval(try_drv)
|
|
61
|
+
rescue NameError
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
eval last
|
|
66
|
+
end
|
|
43
67
|
rescue NameError
|
|
44
68
|
raise Sequel::AdapterNotFound, "#{drv} not loaded#{", try installing jdbc-#{gem.to_s.downcase} gem" if gem}"
|
|
45
69
|
end
|
|
46
70
|
|
|
47
71
|
class TypeConvertor
|
|
72
|
+
CONVERTORS = convertors = {}
|
|
48
73
|
%w'Boolean Float Double Int Long Short'.each do |meth|
|
|
49
|
-
|
|
74
|
+
x = convertors[meth.to_sym] = Object.new
|
|
75
|
+
class_eval("def x.call(r, i) v = r.get#{meth}(i); v unless r.wasNull end", __FILE__, __LINE__)
|
|
50
76
|
end
|
|
51
77
|
%w'Object Array String Time Date Timestamp BigDecimal Blob Bytes Clob'.each do |meth|
|
|
52
|
-
|
|
78
|
+
x = convertors[meth.to_sym] = Object.new
|
|
79
|
+
class_eval("def x.call(r, i) r.get#{meth}(i) end", __FILE__, __LINE__)
|
|
53
80
|
end
|
|
54
|
-
|
|
81
|
+
x = convertors[:RubyTime] = Object.new
|
|
82
|
+
def x.call(r, i)
|
|
55
83
|
if v = r.getTime(i)
|
|
56
84
|
Sequel.string_to_time("#{v.to_string}.#{sprintf('%03i', v.getTime.divmod(1000).last)}")
|
|
57
85
|
end
|
|
58
86
|
end
|
|
59
|
-
|
|
87
|
+
x = convertors[:RubyDate] = Object.new
|
|
88
|
+
def x.call(r, i)
|
|
60
89
|
if v = r.getDate(i)
|
|
61
90
|
Date.civil(v.getYear + 1900, v.getMonth + 1, v.getDate)
|
|
62
91
|
end
|
|
63
92
|
end
|
|
64
|
-
|
|
93
|
+
x = convertors[:RubyTimestamp] = Object.new
|
|
94
|
+
def x.call(r, i)
|
|
65
95
|
if v = r.getTimestamp(i)
|
|
66
96
|
Sequel.database_to_application_timestamp([v.getYear + 1900, v.getMonth + 1, v.getDate, v.getHours, v.getMinutes, v.getSeconds, v.getNanos])
|
|
67
97
|
end
|
|
68
98
|
end
|
|
69
|
-
|
|
99
|
+
x = convertors[:RubyBigDecimal] = Object.new
|
|
100
|
+
def x.call(r, i)
|
|
70
101
|
if v = r.getBigDecimal(i)
|
|
71
|
-
BigDecimal
|
|
102
|
+
::Kernel::BigDecimal(v.to_string)
|
|
72
103
|
end
|
|
73
104
|
end
|
|
74
|
-
|
|
105
|
+
x = convertors[:RubyBlob] = Object.new
|
|
106
|
+
def x.call(r, i)
|
|
75
107
|
if v = r.getBytes(i)
|
|
76
108
|
Sequel::SQL::Blob.new(String.from_java_bytes(v))
|
|
77
109
|
end
|
|
78
110
|
end
|
|
79
|
-
|
|
111
|
+
x = convertors[:RubyClob] = Object.new
|
|
112
|
+
def x.call(r, i)
|
|
80
113
|
if v = r.getClob(i)
|
|
81
114
|
v.getSubString(1, v.length)
|
|
82
115
|
end
|
|
83
116
|
end
|
|
117
|
+
x = convertors[:RubyArray] = Object.new
|
|
118
|
+
def x.call(r, i)
|
|
119
|
+
if v = r.getArray(i)
|
|
120
|
+
v.array.to_ary
|
|
121
|
+
end
|
|
122
|
+
end
|
|
84
123
|
|
|
85
|
-
|
|
86
|
-
MAP = Hash.new(o.method(:Object))
|
|
124
|
+
MAP = Hash.new(convertors[:Object])
|
|
87
125
|
types = Java::JavaSQL::Types
|
|
88
126
|
|
|
89
127
|
{
|
|
90
|
-
:ARRAY => :Array,
|
|
91
128
|
:BOOLEAN => :Boolean,
|
|
92
129
|
:CHAR => :String,
|
|
93
130
|
:DOUBLE => :Double,
|
|
@@ -101,11 +138,12 @@ module Sequel
|
|
|
101
138
|
:TINYINT => :Short,
|
|
102
139
|
:VARCHAR => :String,
|
|
103
140
|
}.each do |type, meth|
|
|
104
|
-
MAP[types.const_get(type)] =
|
|
141
|
+
MAP[types.const_get(type)] = convertors[meth]
|
|
105
142
|
end
|
|
106
143
|
BASIC_MAP = MAP.dup
|
|
107
144
|
|
|
108
145
|
{
|
|
146
|
+
:ARRAY => :Array,
|
|
109
147
|
:BINARY => :Blob,
|
|
110
148
|
:BLOB => :Blob,
|
|
111
149
|
:CLOB => :Clob,
|
|
@@ -118,13 +156,11 @@ module Sequel
|
|
|
118
156
|
:TIMESTAMP => :Timestamp,
|
|
119
157
|
:VARBINARY => :Blob,
|
|
120
158
|
}.each do |type, meth|
|
|
121
|
-
BASIC_MAP[types.const_get(type)] =
|
|
122
|
-
MAP[types.const_get(type)] =
|
|
159
|
+
BASIC_MAP[types.const_get(type)] = convertors[meth]
|
|
160
|
+
MAP[types.const_get(type)] = convertors[:"Ruby#{meth}"]
|
|
123
161
|
end
|
|
124
|
-
|
|
125
162
|
MAP.freeze
|
|
126
163
|
BASIC_MAP.freeze
|
|
127
|
-
freeze
|
|
128
164
|
end
|
|
129
165
|
|
|
130
166
|
class Database < Sequel::Database
|
|
@@ -168,7 +204,7 @@ module Sequel
|
|
|
168
204
|
last_insert_id(conn, opts)
|
|
169
205
|
end
|
|
170
206
|
end
|
|
171
|
-
rescue
|
|
207
|
+
rescue *DATABASE_ERROR_CLASSES => e
|
|
172
208
|
raise_error(e)
|
|
173
209
|
ensure
|
|
174
210
|
cps.close
|
|
@@ -189,7 +225,7 @@ module Sequel
|
|
|
189
225
|
JavaSQL::DriverManager.setLoginTimeout(opts[:login_timeout]) if opts[:login_timeout]
|
|
190
226
|
raise StandardError, "skipping regular connection" if opts[:jdbc_properties]
|
|
191
227
|
JavaSQL::DriverManager.getConnection(*args)
|
|
192
|
-
rescue
|
|
228
|
+
rescue StandardError, *DATABASE_ERROR_CLASSES => e
|
|
193
229
|
raise e unless driver
|
|
194
230
|
# If the DriverManager can't get the connection - use the connect
|
|
195
231
|
# method of the driver. (This happens under Tomcat for instance)
|
|
@@ -203,7 +239,7 @@ module Sequel
|
|
|
203
239
|
c = driver.new.connect(args[0], props)
|
|
204
240
|
raise(Sequel::DatabaseError, 'driver.new.connect returned nil: probably bad JDBC connection string') unless c
|
|
205
241
|
c
|
|
206
|
-
rescue
|
|
242
|
+
rescue StandardError, *DATABASE_ERROR_CLASSES => e2
|
|
207
243
|
if e2.respond_to?(:message=) && e2.message != e.message
|
|
208
244
|
e2.message = "#{e2.message}\n#{e.class.name}: #{e.message}"
|
|
209
245
|
end
|
|
@@ -236,7 +272,9 @@ module Sequel
|
|
|
236
272
|
log_connection_yield(sql, conn){stmt.execute(sql)}
|
|
237
273
|
when :insert
|
|
238
274
|
log_connection_yield(sql, conn){execute_statement_insert(stmt, sql)}
|
|
239
|
-
|
|
275
|
+
opts = Hash[opts]
|
|
276
|
+
opts[:stmt] = stmt
|
|
277
|
+
last_insert_id(conn, opts)
|
|
240
278
|
else
|
|
241
279
|
log_connection_yield(sql, conn){stmt.executeUpdate(sql)}
|
|
242
280
|
end
|
|
@@ -355,7 +393,7 @@ module Sequel
|
|
|
355
393
|
end
|
|
356
394
|
|
|
357
395
|
def database_error_classes
|
|
358
|
-
|
|
396
|
+
DATABASE_ERROR_CLASSES
|
|
359
397
|
end
|
|
360
398
|
|
|
361
399
|
def database_exception_sqlstate(exception, opts)
|
|
@@ -431,12 +469,15 @@ module Sequel
|
|
|
431
469
|
log_connection_yield(msg, conn, args){cps.execute}
|
|
432
470
|
when :insert
|
|
433
471
|
log_connection_yield(msg, conn, args){execute_prepared_statement_insert(cps)}
|
|
434
|
-
|
|
472
|
+
opts = Hash[opts]
|
|
473
|
+
opts[:prepared] = true
|
|
474
|
+
opts[:stmt] = cps
|
|
475
|
+
last_insert_id(conn, opts)
|
|
435
476
|
else
|
|
436
477
|
log_connection_yield(msg, conn, args){cps.executeUpdate}
|
|
437
478
|
end
|
|
438
479
|
end
|
|
439
|
-
rescue
|
|
480
|
+
rescue *DATABASE_ERROR_CLASSES => e
|
|
440
481
|
raise_error(e)
|
|
441
482
|
ensure
|
|
442
483
|
cps.close unless name
|
|
@@ -661,7 +702,7 @@ module Sequel
|
|
|
661
702
|
def statement(conn)
|
|
662
703
|
stmt = conn.createStatement
|
|
663
704
|
yield stmt
|
|
664
|
-
rescue
|
|
705
|
+
rescue *DATABASE_ERROR_CLASSES => e
|
|
665
706
|
raise_error(e)
|
|
666
707
|
ensure
|
|
667
708
|
stmt.close if stmt
|
|
@@ -773,11 +814,14 @@ module Sequel
|
|
|
773
814
|
i += 1
|
|
774
815
|
cols << [output_identifier(meta.getColumnLabel(i)), i, convert ? type_convertor(map, meta, meta.getColumnType(i), i) : basic_type_convertor(map, meta, meta.getColumnType(i), i)]
|
|
775
816
|
end
|
|
817
|
+
max = i
|
|
776
818
|
self.columns = cols.map{|c| c[0]}
|
|
777
819
|
|
|
778
820
|
while result.next
|
|
779
821
|
row = {}
|
|
780
|
-
|
|
822
|
+
i = -1
|
|
823
|
+
while (i += 1) < max
|
|
824
|
+
n, j, pr = cols[i]
|
|
781
825
|
row[n] = pr.call(result, j)
|
|
782
826
|
end
|
|
783
827
|
yield row
|