sequel 4.26.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
module Sequel
|
|
2
4
|
class Database
|
|
3
5
|
# ---------------------
|
|
@@ -7,21 +9,10 @@ module Sequel
|
|
|
7
9
|
# them do.
|
|
8
10
|
# ---------------------
|
|
9
11
|
|
|
10
|
-
SQL_BEGIN = 'BEGIN'.freeze
|
|
11
|
-
SQL_COMMIT = 'COMMIT'.freeze
|
|
12
|
-
SQL_RELEASE_SAVEPOINT = 'RELEASE SAVEPOINT autopoint_%d'.freeze
|
|
13
|
-
SQL_ROLLBACK = 'ROLLBACK'.freeze
|
|
14
|
-
SQL_ROLLBACK_TO_SAVEPOINT = 'ROLLBACK TO SAVEPOINT autopoint_%d'.freeze
|
|
15
|
-
SQL_SAVEPOINT = 'SAVEPOINT autopoint_%d'.freeze
|
|
16
|
-
|
|
17
|
-
TRANSACTION_BEGIN = 'Transaction.begin'.freeze
|
|
18
|
-
TRANSACTION_COMMIT = 'Transaction.commit'.freeze
|
|
19
|
-
TRANSACTION_ROLLBACK = 'Transaction.rollback'.freeze
|
|
20
|
-
|
|
21
12
|
TRANSACTION_ISOLATION_LEVELS = {:uncommitted=>'READ UNCOMMITTED'.freeze,
|
|
22
13
|
:committed=>'READ COMMITTED'.freeze,
|
|
23
14
|
:repeatable=>'REPEATABLE READ'.freeze,
|
|
24
|
-
:serializable=>'SERIALIZABLE'.freeze}
|
|
15
|
+
:serializable=>'SERIALIZABLE'.freeze}.freeze
|
|
25
16
|
|
|
26
17
|
# The default transaction isolation level for this database,
|
|
27
18
|
# used for all future transactions. For MSSQL, this should be set
|
|
@@ -30,6 +21,112 @@ module Sequel
|
|
|
30
21
|
# on the same connection.
|
|
31
22
|
attr_accessor :transaction_isolation_level
|
|
32
23
|
|
|
24
|
+
# If a transaction is not currently in process, yield to the block immediately.
|
|
25
|
+
# Otherwise, add the block to the list of blocks to call after the currently
|
|
26
|
+
# in progress transaction commits (and only if it commits).
|
|
27
|
+
# Options:
|
|
28
|
+
# :savepoint :: If currently inside a savepoint, only run this hook on transaction
|
|
29
|
+
# commit if all enclosing savepoints have been released.
|
|
30
|
+
# :server :: The server/shard to use.
|
|
31
|
+
def after_commit(opts=OPTS, &block)
|
|
32
|
+
raise Error, "must provide block to after_commit" unless block
|
|
33
|
+
synchronize(opts[:server]) do |conn|
|
|
34
|
+
if h = _trans(conn)
|
|
35
|
+
raise Error, "cannot call after_commit in a prepared transaction" if h[:prepare]
|
|
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
|
|
41
|
+
else
|
|
42
|
+
yield
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# If a transaction is not currently in progress, ignore the block.
|
|
48
|
+
# Otherwise, add the block to the list of the blocks to call after the currently
|
|
49
|
+
# in progress transaction rolls back (and only if it rolls back).
|
|
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.
|
|
54
|
+
# :server :: The server/shard to use.
|
|
55
|
+
def after_rollback(opts=OPTS, &block)
|
|
56
|
+
raise Error, "must provide block to after_rollback" unless block
|
|
57
|
+
synchronize(opts[:server]) do |conn|
|
|
58
|
+
if h = _trans(conn)
|
|
59
|
+
raise Error, "cannot call after_rollback in a prepared transaction" if h[:prepare]
|
|
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
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
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
|
+
|
|
110
|
+
# Return true if already in a transaction given the options,
|
|
111
|
+
# false otherwise. Respects the :server option for selecting
|
|
112
|
+
# a shard.
|
|
113
|
+
def in_transaction?(opts=OPTS)
|
|
114
|
+
synchronize(opts[:server]){|conn| !!_trans(conn)}
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Returns a proc that you can call to check if the transaction
|
|
118
|
+
# has been rolled back. The proc will return nil if the
|
|
119
|
+
# transaction is still in progress, true if the transaction was
|
|
120
|
+
# rolled back, and false if it was committed. Raises an
|
|
121
|
+
# Error if called outside a transaction. Respects the :server
|
|
122
|
+
# option for selecting a shard.
|
|
123
|
+
def rollback_checker(opts=OPTS)
|
|
124
|
+
synchronize(opts[:server]) do |conn|
|
|
125
|
+
raise Error, "not in a transaction" unless t = _trans(conn)
|
|
126
|
+
t[:rollback_checker] ||= proc{Sequel.synchronize{t[:rolled_back]}}
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
33
130
|
# Starts a database transaction. When a database transaction is used,
|
|
34
131
|
# either all statements are successful or none of the statements are
|
|
35
132
|
# successful. Note that MySQL MyISAM tables do not support transactions.
|
|
@@ -45,7 +142,7 @@ module Sequel
|
|
|
45
142
|
# :num_retries :: The number of times to retry if the :retry_on option is used.
|
|
46
143
|
# The default is 5 times. Can be set to nil to retry indefinitely,
|
|
47
144
|
# but that is not recommended.
|
|
48
|
-
# :before_retry :: Proc to execute before
|
|
145
|
+
# :before_retry :: Proc to execute before retrying if the :retry_on option is used.
|
|
49
146
|
# Called with two arguments: the number of retry attempts (counting
|
|
50
147
|
# the current one) and the error the last attempt failed with.
|
|
51
148
|
# :prepare :: A string to use as the transaction identifier for a
|
|
@@ -57,7 +154,7 @@ module Sequel
|
|
|
57
154
|
# Note that this should not be used unless the entire transaction
|
|
58
155
|
# block is idempotent, as otherwise it can cause non-idempotent
|
|
59
156
|
# behavior to execute multiple times.
|
|
60
|
-
# :rollback :: Can
|
|
157
|
+
# :rollback :: Can be set to :reraise to reraise any Sequel::Rollback exceptions
|
|
61
158
|
# raised, or :always to always rollback even if no exceptions occur
|
|
62
159
|
# (useful for testing).
|
|
63
160
|
# :server :: The server to use for the transaction. Set to :default, :read_only, or
|
|
@@ -67,6 +164,8 @@ module Sequel
|
|
|
67
164
|
# default Sequel will reuse an existing transaction, so if you want to
|
|
68
165
|
# use a savepoint you must use this option. If the surrounding transaction
|
|
69
166
|
# uses :auto_savepoint, you can set this to false to not use a savepoint.
|
|
167
|
+
# If the value given for this option is :only, it will only create a
|
|
168
|
+
# savepoint if it is inside a transaction.
|
|
70
169
|
#
|
|
71
170
|
# PostgreSQL specific options:
|
|
72
171
|
#
|
|
@@ -76,37 +175,62 @@ module Sequel
|
|
|
76
175
|
# appropriately. Valid values true, :on, false, :off, :local (9.1+),
|
|
77
176
|
# and :remote_write (9.2+).
|
|
78
177
|
def transaction(opts=OPTS, &block)
|
|
178
|
+
opts = Hash[opts]
|
|
79
179
|
if retry_on = opts[:retry_on]
|
|
80
180
|
tot_retries = opts.fetch(:num_retries, 5)
|
|
81
|
-
num_retries = 0
|
|
181
|
+
num_retries = 0
|
|
82
182
|
begin
|
|
83
|
-
|
|
183
|
+
opts[:retry_on] = nil
|
|
184
|
+
opts[:retrying] = true
|
|
185
|
+
transaction(opts, &block)
|
|
84
186
|
rescue *retry_on => e
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
opts[:before_retry].call(num_retries, e) if opts[:before_retry]
|
|
89
|
-
retry
|
|
90
|
-
end
|
|
91
|
-
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]
|
|
92
190
|
retry
|
|
93
191
|
end
|
|
94
192
|
raise
|
|
95
193
|
end
|
|
96
194
|
else
|
|
97
195
|
synchronize(opts[:server]) do |conn|
|
|
196
|
+
if opts[:savepoint] == :only
|
|
197
|
+
if supports_savepoints?
|
|
198
|
+
if _trans(conn)
|
|
199
|
+
opts[:savepoint] = true
|
|
200
|
+
else
|
|
201
|
+
return yield(conn)
|
|
202
|
+
end
|
|
203
|
+
else
|
|
204
|
+
opts[:savepoint] = false
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
if opts[:savepoint] && !supports_savepoints?
|
|
209
|
+
raise Sequel::InvalidOperation, "savepoints not supported on #{database_type}"
|
|
210
|
+
end
|
|
211
|
+
|
|
98
212
|
if already_in_transaction?(conn, opts)
|
|
99
|
-
if opts[:
|
|
100
|
-
|
|
213
|
+
if opts[:rollback] == :always && !opts.has_key?(:savepoint)
|
|
214
|
+
if supports_savepoints?
|
|
215
|
+
opts[:savepoint] = true
|
|
216
|
+
else
|
|
217
|
+
raise Sequel::Error, "cannot set :rollback=>:always transaction option if already inside a transaction"
|
|
218
|
+
end
|
|
101
219
|
end
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
220
|
+
|
|
221
|
+
if opts[:savepoint] != false && (stack = _trans(conn)[:savepoints]) && stack.last[:auto_savepoint]
|
|
222
|
+
opts[:savepoint] = true
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
unless opts[:savepoint]
|
|
226
|
+
if opts[:retrying]
|
|
227
|
+
raise Sequel::Error, "cannot set :retry_on options if you are already inside a transaction"
|
|
228
|
+
end
|
|
105
229
|
return yield(conn)
|
|
106
230
|
end
|
|
107
|
-
else
|
|
108
|
-
_transaction(conn, opts, &block)
|
|
109
231
|
end
|
|
232
|
+
|
|
233
|
+
_transaction(conn, opts, &block)
|
|
110
234
|
end
|
|
111
235
|
end
|
|
112
236
|
end
|
|
@@ -136,9 +260,10 @@ module Sequel
|
|
|
136
260
|
rescue Exception => e
|
|
137
261
|
begin
|
|
138
262
|
rollback_transaction(conn, opts)
|
|
139
|
-
rescue Exception
|
|
263
|
+
rescue Exception => e3
|
|
140
264
|
end
|
|
141
265
|
transaction_error(e, :conn=>conn, :rollback=>rollback)
|
|
266
|
+
raise e3 if e3
|
|
142
267
|
ret
|
|
143
268
|
ensure
|
|
144
269
|
begin
|
|
@@ -167,14 +292,14 @@ module Sequel
|
|
|
167
292
|
|
|
168
293
|
# Add the current thread to the list of active transactions
|
|
169
294
|
def add_transaction(conn, opts)
|
|
170
|
-
hash =
|
|
295
|
+
hash = transaction_options(conn, opts)
|
|
171
296
|
|
|
172
297
|
if supports_savepoints?
|
|
173
|
-
if _trans(conn)
|
|
174
|
-
|
|
175
|
-
|
|
298
|
+
if t = _trans(conn)
|
|
299
|
+
t[:savepoints].push({:auto_savepoint=>opts[:auto_savepoint]})
|
|
300
|
+
return
|
|
176
301
|
else
|
|
177
|
-
hash[:savepoints] = [opts[:auto_savepoint]]
|
|
302
|
+
hash[:savepoints] = [{:auto_savepoint=>opts[:auto_savepoint]}]
|
|
178
303
|
if (prep = opts[:prepare]) && supports_prepared_transactions?
|
|
179
304
|
hash[:prepare] = prep
|
|
180
305
|
end
|
|
@@ -183,16 +308,34 @@ module Sequel
|
|
|
183
308
|
hash[:prepare] = prep
|
|
184
309
|
end
|
|
185
310
|
|
|
186
|
-
|
|
187
|
-
Sequel.synchronize{@transactions[conn] = hash}
|
|
188
|
-
end
|
|
311
|
+
Sequel.synchronize{@transactions[conn] = hash}
|
|
189
312
|
end
|
|
190
313
|
|
|
191
|
-
#
|
|
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
|
+
|
|
321
|
+
# Set the given callable as a hook to be called. Type should be either
|
|
322
|
+
# :after_commit or :after_rollback.
|
|
323
|
+
def add_transaction_hook(conn, type, block)
|
|
324
|
+
hooks = _trans(conn)[type] ||= []
|
|
325
|
+
hooks << block
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# Whether the given connection is already inside a transaction
|
|
192
329
|
def already_in_transaction?(conn, opts)
|
|
193
330
|
_trans(conn) && (!supports_savepoints? || !opts[:savepoint])
|
|
194
331
|
end
|
|
195
332
|
|
|
333
|
+
# Derive the transaction hash from the options passed to the transaction.
|
|
334
|
+
# Meant to be overridden.
|
|
335
|
+
def transaction_options(conn, opts)
|
|
336
|
+
{}
|
|
337
|
+
end
|
|
338
|
+
|
|
196
339
|
# Issue query to begin a new savepoint.
|
|
197
340
|
def begin_savepoint(conn, opts)
|
|
198
341
|
log_connection_execute(conn, begin_savepoint_sql(savepoint_level(conn)-1))
|
|
@@ -200,10 +343,10 @@ module Sequel
|
|
|
200
343
|
|
|
201
344
|
# SQL to start a new savepoint
|
|
202
345
|
def begin_savepoint_sql(depth)
|
|
203
|
-
|
|
346
|
+
"SAVEPOINT autopoint_#{depth}"
|
|
204
347
|
end
|
|
205
348
|
|
|
206
|
-
# Start a new database
|
|
349
|
+
# Start a new database transaction on the given connection
|
|
207
350
|
def begin_new_transaction(conn, opts)
|
|
208
351
|
log_connection_execute(conn, begin_transaction_sql)
|
|
209
352
|
set_transaction_isolation(conn, opts)
|
|
@@ -211,12 +354,8 @@ module Sequel
|
|
|
211
354
|
|
|
212
355
|
# Start a new database transaction or a new savepoint on the given connection.
|
|
213
356
|
def begin_transaction(conn, opts=OPTS)
|
|
214
|
-
if
|
|
215
|
-
|
|
216
|
-
begin_savepoint(conn, opts)
|
|
217
|
-
else
|
|
218
|
-
begin_new_transaction(conn, opts)
|
|
219
|
-
end
|
|
357
|
+
if in_savepoint?(conn)
|
|
358
|
+
begin_savepoint(conn, opts)
|
|
220
359
|
else
|
|
221
360
|
begin_new_transaction(conn, opts)
|
|
222
361
|
end
|
|
@@ -224,19 +363,19 @@ module Sequel
|
|
|
224
363
|
|
|
225
364
|
# SQL to BEGIN a transaction.
|
|
226
365
|
def begin_transaction_sql
|
|
227
|
-
|
|
366
|
+
'BEGIN'
|
|
228
367
|
end
|
|
229
368
|
|
|
230
369
|
# Whether to commit the current transaction. Thread.current.status is
|
|
231
370
|
# checked because Thread#kill skips rescue blocks (so exception would be
|
|
232
371
|
# nil), but the transaction should still be rolled back. On Ruby 1.9 (but
|
|
233
|
-
# not
|
|
372
|
+
# not 2.0+), the thread status will still be "run", so Thread#kill
|
|
234
373
|
# will erroneously commit the transaction, and there isn't a workaround.
|
|
235
374
|
def commit_or_rollback_transaction(exception, conn, opts)
|
|
236
375
|
if exception
|
|
237
376
|
false
|
|
238
377
|
else
|
|
239
|
-
if
|
|
378
|
+
if rollback_on_transaction_exit?(conn, opts)
|
|
240
379
|
rollback_transaction(conn, opts)
|
|
241
380
|
false
|
|
242
381
|
else
|
|
@@ -248,7 +387,7 @@ module Sequel
|
|
|
248
387
|
|
|
249
388
|
# SQL to commit a savepoint
|
|
250
389
|
def commit_savepoint_sql(depth)
|
|
251
|
-
|
|
390
|
+
"RELEASE SAVEPOINT autopoint_#{depth}"
|
|
252
391
|
end
|
|
253
392
|
|
|
254
393
|
# Commit the active transaction on the connection
|
|
@@ -263,7 +402,7 @@ module Sequel
|
|
|
263
402
|
|
|
264
403
|
# SQL to COMMIT a transaction.
|
|
265
404
|
def commit_transaction_sql
|
|
266
|
-
|
|
405
|
+
'COMMIT'
|
|
267
406
|
end
|
|
268
407
|
|
|
269
408
|
# Method called on the connection object to execute SQL on the database,
|
|
@@ -272,20 +411,83 @@ module Sequel
|
|
|
272
411
|
:execute
|
|
273
412
|
end
|
|
274
413
|
|
|
414
|
+
# Which transaction errors to translate, blank by default.
|
|
415
|
+
def database_error_classes
|
|
416
|
+
[]
|
|
417
|
+
end
|
|
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
|
+
|
|
431
|
+
# Retrieve the transaction hooks that should be run for the given
|
|
432
|
+
# connection and commit status.
|
|
433
|
+
def transaction_hooks(conn, committed)
|
|
434
|
+
unless in_savepoint?(conn)
|
|
435
|
+
_trans(conn)[committed ? :after_commit : :after_rollback]
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
275
439
|
# Remove the current thread from the list of active transactions
|
|
276
440
|
def remove_transaction(conn, committed)
|
|
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
|
|
448
|
+
|
|
277
449
|
if transaction_finished?(conn)
|
|
278
|
-
|
|
450
|
+
h = _trans(conn)
|
|
451
|
+
rolled_back = !committed
|
|
452
|
+
Sequel.synchronize{h[:rolled_back] = rolled_back}
|
|
279
453
|
Sequel.synchronize{@transactions.delete(conn)}
|
|
280
|
-
|
|
281
|
-
|
|
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)
|
|
282
471
|
end
|
|
283
472
|
end
|
|
473
|
+
|
|
474
|
+
callbacks.each(&:call) if callbacks
|
|
284
475
|
end
|
|
285
476
|
|
|
286
477
|
# SQL to rollback to a savepoint
|
|
287
478
|
def rollback_savepoint_sql(depth)
|
|
288
|
-
|
|
479
|
+
"ROLLBACK TO SAVEPOINT autopoint_#{depth}"
|
|
480
|
+
end
|
|
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
|
|
289
491
|
end
|
|
290
492
|
|
|
291
493
|
# Rollback the active transaction on the connection
|
|
@@ -300,7 +502,7 @@ module Sequel
|
|
|
300
502
|
|
|
301
503
|
# SQL to ROLLBACK a transaction.
|
|
302
504
|
def rollback_transaction_sql
|
|
303
|
-
|
|
505
|
+
'ROLLBACK'
|
|
304
506
|
end
|
|
305
507
|
|
|
306
508
|
# Set the transaction isolation level on the given connection
|