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
data/doc/virtual_rows.rdoc
CHANGED
|
@@ -7,28 +7,16 @@ many Sequel::Dataset methods that take virtual row blocks.
|
|
|
7
7
|
|
|
8
8
|
== Why Virtual Rows
|
|
9
9
|
|
|
10
|
-
Virtual
|
|
11
|
-
|
|
12
|
-
following Sequel code historically worked on ruby 1.8, but not ruby 1.9:
|
|
10
|
+
Virtual rows offer a less verbose way to express many queries. For example,
|
|
11
|
+
by default if you want to express an inequality filter in Sequel, you can do:
|
|
13
12
|
|
|
14
|
-
dataset.where(:a > :b
|
|
15
|
-
# WHERE a > b(c)
|
|
16
|
-
|
|
17
|
-
This code does not work on ruby 1.9 for two reasons. First, Symbol#>
|
|
18
|
-
(like other inequality methods) is already defined in ruby 1.9, so Sequel
|
|
19
|
-
does not override it to return an SQL inequality expression. Second, Symbol#[]
|
|
20
|
-
is already defined on ruby 1.9, so Sequel does not override it to return an
|
|
21
|
-
SQL function expression.
|
|
22
|
-
|
|
23
|
-
It's possible to use Sequel's DSL to represent such expressions, but it is a
|
|
24
|
-
little verbose:
|
|
25
|
-
|
|
26
|
-
dataset.where(Sequel.expr(:a) > Sequel.function(:b, :c))
|
|
27
|
-
# WHERE a > b(c)
|
|
13
|
+
dataset.where(Sequel[:a] > Sequel.function(:b, :c))
|
|
14
|
+
# WHERE (a > b(c))
|
|
28
15
|
|
|
29
|
-
|
|
16
|
+
With virtual rows, you can use the less verbose:
|
|
30
17
|
|
|
31
18
|
dataset.where{a > b(c)}
|
|
19
|
+
# WHERE (a > b(c))
|
|
32
20
|
|
|
33
21
|
== Regular Procs vs Instance Evaled Procs
|
|
34
22
|
|
|
@@ -38,96 +26,110 @@ of Sequel::SQL::VirtualRow. If it does not accept an argument, it is
|
|
|
38
26
|
evaluated in the context of an instance of Sequel::SQL::VirtualRow.
|
|
39
27
|
|
|
40
28
|
ds = DB[:items]
|
|
41
|
-
# Regular
|
|
29
|
+
# Regular block
|
|
42
30
|
ds.where{|o| o.column > 1}
|
|
43
|
-
# WHERE column > 1
|
|
31
|
+
# WHERE (column > 1)
|
|
44
32
|
|
|
45
|
-
# Instance-evaled
|
|
33
|
+
# Instance-evaled block
|
|
46
34
|
ds.where{column > 1}
|
|
47
|
-
# WHERE column > 1
|
|
35
|
+
# WHERE (column > 1)
|
|
48
36
|
|
|
49
37
|
If you aren't familiar with the difference between regular blocks and instance
|
|
50
|
-
evaled blocks,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
38
|
+
evaled blocks, inside regular blocks methods called without an explicit receiver call
|
|
39
|
+
the method on the receiver in the surrounding scope, while instance
|
|
40
|
+
evaled blocks call the method on the receiver of the instance_eval call (the
|
|
41
|
+
Sequel::SQL::VirtualRow instance in this case).
|
|
42
|
+
|
|
54
43
|
in both cases, local variables available in the surrounding scope will be available
|
|
55
|
-
inside the
|
|
44
|
+
inside the block. However, instance variables in the surrounding scope will not
|
|
45
|
+
be available inside the block if using an instance evaled block, and methods called
|
|
46
|
+
without an explicit receiver inside an instance evaled block will not call
|
|
47
|
+
methods in the surrounding scope. For example:
|
|
56
48
|
|
|
57
49
|
def self.a
|
|
58
50
|
42
|
|
59
51
|
end
|
|
60
52
|
b = 32
|
|
53
|
+
@d = 100
|
|
61
54
|
|
|
62
|
-
# Regular
|
|
63
|
-
ds.where{|o| o.c > a - b}
|
|
64
|
-
# WHERE c >
|
|
55
|
+
# Regular block
|
|
56
|
+
ds.where{|o| o.c > a - b + @d}
|
|
57
|
+
# WHERE (c > 100)
|
|
65
58
|
|
|
66
|
-
# Instance-evaled
|
|
67
|
-
ds.where{c > a - b}
|
|
68
|
-
# WHERE c > (a - 32)
|
|
59
|
+
# Instance-evaled block
|
|
60
|
+
ds.where{c > a - b + @d}
|
|
61
|
+
# WHERE (c > ((a - 32) + NULL))
|
|
69
62
|
|
|
70
|
-
There are
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
There are three related differences here:
|
|
64
|
+
|
|
65
|
+
* Regular blocks use +o.c+ instead of just +c+
|
|
66
|
+
* +a+ results in 42 in the regular block, but creates an expression object in the instance evaled block
|
|
67
|
+
* @d results in 100 in the regular block, but nil in the instance evaled block
|
|
68
|
+
|
|
69
|
+
In the regular block, you need to call +c+ with an explicit receiver (the virtual
|
|
70
|
+
row block argument), while in the instance evaled block +c+ can be called directly,
|
|
71
|
+
as the default receiver has changed inside the block.
|
|
72
|
+
|
|
73
|
+
For +a+, note how ruby calls the method on
|
|
74
|
+
the receiver of the surrounding scope in the regular block, which returns an integer,
|
|
75
75
|
and does the subtraction before Sequel gets access to it. In the instance evaled
|
|
76
|
-
|
|
76
|
+
block, calling +a+ without a receiver calls the a method on the VirtualRow instance.
|
|
77
|
+
For @d, note that in a regular block, the value hasn't changed, but in the instance evaled
|
|
78
|
+
block, instance variable access returns nil.
|
|
77
79
|
For +b+, note that it operates the same in both cases, as it is a local variable.
|
|
78
80
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Instance evaled
|
|
82
|
-
can be more difficult
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
The choice for whether to use a regular block or an instance evaled block is
|
|
82
|
+
up to you. The same things can be accomplished with both.
|
|
83
|
+
Instance evaled block tend to produce shorter code, but by modifying the scope
|
|
84
|
+
can be more difficult to understand.
|
|
85
|
+
|
|
86
|
+
If you are not sure which to use, use instance evaled blocks unless you need to
|
|
87
|
+
call methods or access instance variables of the surrounding scope inside the block.
|
|
85
88
|
|
|
86
89
|
== Local Variables vs Method Calls
|
|
87
90
|
|
|
88
91
|
If you have a method that accepts 0 arguments and has the same name as a local
|
|
89
92
|
variable, you can call it with () to differentiate the method call from the
|
|
90
|
-
local variable access. This is mostly useful in
|
|
93
|
+
local variable access. This is mostly useful in instance evaled blocks:
|
|
91
94
|
|
|
92
95
|
b = 32
|
|
93
96
|
ds.where{b() > b}
|
|
94
97
|
# WHERE b > 32
|
|
95
98
|
|
|
99
|
+
It's also possible to use an explicit self receiver in instance evaled blocks:
|
|
100
|
+
|
|
101
|
+
b = 32
|
|
102
|
+
ds.where{self.b > b}
|
|
103
|
+
# WHERE b > 32
|
|
104
|
+
|
|
105
|
+
|
|
96
106
|
== VirtualRow Methods
|
|
97
107
|
|
|
98
|
-
VirtualRow is a class that returns SQL::Identifiers
|
|
99
|
-
|
|
108
|
+
VirtualRow is a class that returns SQL::Identifiers or SQL::Functions depending
|
|
109
|
+
on how it is called.
|
|
100
110
|
|
|
101
111
|
== SQL::Identifiers - Regular columns
|
|
102
112
|
|
|
103
113
|
SQL::Identifiers can be thought of as regular column references in SQL,
|
|
104
114
|
not qualified by any table. You get an SQL::Identifier if the method is called
|
|
105
|
-
without
|
|
106
|
-
name:
|
|
115
|
+
without arguments:
|
|
107
116
|
|
|
108
117
|
ds.where{|o| o.column > 1}
|
|
109
118
|
ds.where{column > 1}
|
|
110
|
-
# WHERE column > 1
|
|
119
|
+
# WHERE (column > 1)
|
|
111
120
|
|
|
112
121
|
== SQL::QualifiedIdentifiers - Qualified columns
|
|
113
122
|
|
|
114
|
-
|
|
115
|
-
are qualified to a specific table. You get an SQL::QualifiedIdentifier if
|
|
116
|
-
the method is called without a block or arguments, and has a double underscore
|
|
117
|
-
in the method name:
|
|
123
|
+
You can qualified identifiers by calling #[] on an identifier:
|
|
118
124
|
|
|
119
|
-
ds.where{|o| o.
|
|
120
|
-
ds.where{
|
|
125
|
+
ds.where{|o| o.table[:column] > 1}
|
|
126
|
+
ds.where{table[:column] > 1}
|
|
121
127
|
# WHERE table.column > 1
|
|
122
128
|
|
|
123
|
-
Using the double underscore for SQL::QualifiedIdentifiers was done to make
|
|
124
|
-
usage very similar to using symbols, which also translate the double underscore
|
|
125
|
-
into a qualified column.
|
|
126
|
-
|
|
127
129
|
== SQL::Functions - SQL function calls
|
|
128
130
|
|
|
129
131
|
SQL::Functions can be thought of as function calls in SQL. You get a simple
|
|
130
|
-
function call if you call a method with arguments
|
|
132
|
+
function call if you call a method with arguments:
|
|
131
133
|
|
|
132
134
|
ds.where{|o| o.function(1) > 1}
|
|
133
135
|
ds.where{function(1) > 1}
|
|
@@ -167,8 +169,7 @@ distinct method on the returned Function:
|
|
|
167
169
|
|
|
168
170
|
== SQL::Functions with windows - SQL window function calls
|
|
169
171
|
|
|
170
|
-
|
|
171
|
-
queries. To use them, you should just call the over method on the Function
|
|
172
|
+
To create a window function call, just call the over method on the Function
|
|
172
173
|
object returned, with the options for the window:
|
|
173
174
|
|
|
174
175
|
ds.select{|o| o.rank.function.over}
|
|
@@ -179,19 +180,18 @@ object returned, with the options for the window:
|
|
|
179
180
|
ds.select{count.function.*.over}
|
|
180
181
|
# SELECT count(*) OVER ()
|
|
181
182
|
|
|
182
|
-
ds.select{|o| o.sum(o.col1).over(:
|
|
183
|
-
ds.select{sum(col1).over(:
|
|
183
|
+
ds.select{|o| o.sum(o.col1).over(partition: o.col2, order: o.col3)}
|
|
184
|
+
ds.select{sum(col1).over(partition: col2, order: col3)}
|
|
184
185
|
# SELECT sum(col1) OVER (PARTITION BY col2 ORDER BY col3)
|
|
185
186
|
|
|
186
187
|
== Operators
|
|
187
188
|
|
|
188
189
|
VirtualRows use method_missing to handle almost all method calls. Since the
|
|
189
|
-
objects given by method_missing are SQL::Identifiers
|
|
190
|
-
or SQL::Functions, you can use all operators that they provide (see
|
|
190
|
+
objects given by method_missing are SQL::Identifiers or SQL::Functions, you can use all operators that they provide (see
|
|
191
191
|
DatasetFiltering[http://sequel.jeremyevans.net/rdoc/files/doc/dataset_filtering_rdoc.html#label-Filtering+using+expressions]):
|
|
192
192
|
|
|
193
193
|
ds.select{|o| o.price - 100}
|
|
194
|
-
ds.select{
|
|
194
|
+
ds.select{price - 100}
|
|
195
195
|
# SELECT (price - 100)
|
|
196
196
|
|
|
197
197
|
ds.where{|o| (o.price < 200) & (o.tax * 100 >= 23)}
|
|
@@ -213,14 +213,14 @@ The standard +, -, *, and / mathematical operators are defined:
|
|
|
213
213
|
|
|
214
214
|
The & and | methods are defined to use AND and OR:
|
|
215
215
|
|
|
216
|
-
ds.where{|o| o.&({:
|
|
217
|
-
ds.where{self.&({:
|
|
216
|
+
ds.where{|o| o.&({a: :b}, :c)}
|
|
217
|
+
ds.where{self.&({a: :b}, :c)}
|
|
218
218
|
# WHERE ((a = b) AND c)
|
|
219
219
|
|
|
220
220
|
The ~ method is defined to do inversion:
|
|
221
221
|
|
|
222
|
-
ds.where{|o| o.~({:
|
|
223
|
-
ds.where{self.~({:
|
|
222
|
+
ds.where{|o| o.~({a: 1, b: 2})}
|
|
223
|
+
ds.where{self.~({a: 1, b: 2})}
|
|
224
224
|
# WHERE ((a != 1) OR (b != 2))
|
|
225
225
|
|
|
226
226
|
=== Inequality Operators
|
|
@@ -231,19 +231,6 @@ The standard >, <, >=, and <= inequality operators are defined:
|
|
|
231
231
|
ds.where{self.>(1, :c)}
|
|
232
232
|
# WHERE (1 > c)
|
|
233
233
|
|
|
234
|
-
== Literal Strings
|
|
235
|
-
|
|
236
|
-
The backtick operator can be used inside an instance-evaled
|
|
237
|
-
virtual row block to create a literal string:
|
|
238
|
-
|
|
239
|
-
ds.where{a > `some SQL`}
|
|
240
|
-
# WHERE (a > some SQL)
|
|
241
|
-
|
|
242
|
-
You can use this on a regular virtual row block too, but it
|
|
243
|
-
doesn't look as nice:
|
|
244
|
-
|
|
245
|
-
ds.where{|o| o.>(:a, o.`('some SQL'))}
|
|
246
|
-
|
|
247
234
|
== Returning multiple values
|
|
248
235
|
|
|
249
236
|
It's common when using select and order virtual row blocks to want to
|
|
@@ -259,26 +246,20 @@ Note that if you forget the array brackets, you'll end up with a syntax error:
|
|
|
259
246
|
# Invalid ruby syntax
|
|
260
247
|
ds.select{|o| o.column1, o.sum(o.column2).as(o.sum)}
|
|
261
248
|
ds.select{column1, sum(column2).as(sum)}
|
|
262
|
-
|
|
263
|
-
==
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
name of the method used and the arguments given.
|
|
280
|
-
* If there are no arguments and the method contains a double
|
|
281
|
-
underscore, split on the double underscore and return an
|
|
282
|
-
SQL::QualifiedIdentifier with the table and column.
|
|
283
|
-
* Otherwise, create an SQL::Identifier with the name of the
|
|
284
|
-
method.
|
|
249
|
+
|
|
250
|
+
== Split symbols
|
|
251
|
+
|
|
252
|
+
Note that if you turn on symbol splitting for backwards compatibility,
|
|
253
|
+
Sequel will split virtual row methods with double underscores and
|
|
254
|
+
return them as qualified identifiers:
|
|
255
|
+
|
|
256
|
+
Sequel.split_symbols = true
|
|
257
|
+
ds.where{|o| o.table__column}
|
|
258
|
+
ds.where{table__column}
|
|
259
|
+
WHERE table.column
|
|
260
|
+
|
|
261
|
+
It's not recommended that you rely on this, it's better to convert the calls
|
|
262
|
+
to the recommended form:
|
|
263
|
+
|
|
264
|
+
ds.where{|o| o.table[:column]}
|
|
265
|
+
ds.where{table[:column]}
|
data/lib/sequel.rb
CHANGED
data/lib/sequel/adapters/ado.rb
CHANGED
|
@@ -1,20 +1,101 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
1
3
|
require 'win32ole'
|
|
2
4
|
|
|
3
5
|
module Sequel
|
|
4
6
|
# The ADO adapter provides connectivity to ADO databases in Windows.
|
|
5
7
|
module ADO
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
# ADO constants (DataTypeEnum)
|
|
9
|
+
# Source: https://msdn.microsoft.com/en-us/library/ms675318(v=vs.85).aspx
|
|
10
|
+
AdBigInt = 20
|
|
11
|
+
AdBinary = 128
|
|
12
|
+
#AdBoolean = 11
|
|
13
|
+
#AdBSTR = 8
|
|
14
|
+
#AdChapter = 136
|
|
15
|
+
#AdChar = 129
|
|
16
|
+
#AdCurrency = 6
|
|
17
|
+
#AdDate = 7
|
|
18
|
+
AdDBDate = 133
|
|
19
|
+
#AdDBTime = 134
|
|
20
|
+
AdDBTimeStamp = 135
|
|
21
|
+
#AdDecimal = 14
|
|
22
|
+
#AdDouble = 5
|
|
23
|
+
#AdEmpty = 0
|
|
24
|
+
#AdError = 10
|
|
25
|
+
#AdFileTime = 64
|
|
26
|
+
#AdGUID = 72
|
|
27
|
+
#AdIDispatch = 9
|
|
28
|
+
#AdInteger = 3
|
|
29
|
+
#AdIUnknown = 13
|
|
30
|
+
AdLongVarBinary = 205
|
|
31
|
+
#AdLongVarChar = 201
|
|
32
|
+
#AdLongVarWChar = 203
|
|
33
|
+
AdNumeric = 131
|
|
34
|
+
#AdPropVariant = 138
|
|
35
|
+
#AdSingle = 4
|
|
36
|
+
#AdSmallInt = 2
|
|
37
|
+
#AdTinyInt = 16
|
|
38
|
+
#AdUnsignedBigInt = 21
|
|
39
|
+
#AdUnsignedInt = 19
|
|
40
|
+
#AdUnsignedSmallInt = 18
|
|
41
|
+
#AdUnsignedTinyInt = 17
|
|
42
|
+
#AdUserDefined = 132
|
|
43
|
+
AdVarBinary = 204
|
|
44
|
+
#AdVarChar = 200
|
|
45
|
+
#AdVariant = 12
|
|
46
|
+
AdVarNumeric = 139
|
|
47
|
+
#AdVarWChar = 202
|
|
48
|
+
#AdWChar = 130
|
|
49
|
+
|
|
50
|
+
bigint = Object.new
|
|
51
|
+
def bigint.call(v)
|
|
52
|
+
v.to_i
|
|
53
|
+
end
|
|
8
54
|
|
|
55
|
+
numeric = Object.new
|
|
56
|
+
def numeric.call(v)
|
|
57
|
+
if v.include?(',')
|
|
58
|
+
BigDecimal(v.tr(',', '.'))
|
|
59
|
+
else
|
|
60
|
+
BigDecimal(v)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
binary = Object.new
|
|
65
|
+
def binary.call(v)
|
|
66
|
+
Sequel.blob(v.pack('c*'))
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
date = Object.new
|
|
70
|
+
def date.call(v)
|
|
71
|
+
Date.new(v.year, v.month, v.day)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
CONVERSION_PROCS = {}
|
|
75
|
+
[
|
|
76
|
+
[bigint, AdBigInt],
|
|
77
|
+
[numeric, AdNumeric, AdVarNumeric],
|
|
78
|
+
[date, AdDBDate],
|
|
79
|
+
[binary, AdBinary, AdVarBinary, AdLongVarBinary]
|
|
80
|
+
].each do |callable, *types|
|
|
81
|
+
callable.freeze
|
|
82
|
+
types.each do |i|
|
|
83
|
+
CONVERSION_PROCS[i] = callable
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
CONVERSION_PROCS.freeze
|
|
87
|
+
|
|
88
|
+
class Database < Sequel::Database
|
|
9
89
|
set_adapter_scheme :ado
|
|
10
90
|
|
|
91
|
+
attr_reader :conversion_procs
|
|
92
|
+
|
|
11
93
|
# In addition to the usual database options,
|
|
12
94
|
# the following options have an effect:
|
|
13
95
|
#
|
|
14
96
|
# :command_timeout :: Sets the time in seconds to wait while attempting
|
|
15
97
|
# to execute a command before cancelling the attempt and generating
|
|
16
98
|
# an error. Specifically, it sets the ADO CommandTimeout property.
|
|
17
|
-
# If this property is not set, the default of 30 seconds is used.
|
|
18
99
|
# :driver :: The driver to use in the ADO connection string. If not provided, a default
|
|
19
100
|
# of "SQL Server" is used.
|
|
20
101
|
# :conn_string :: The full ADO connection string. If this is provided,
|
|
@@ -26,8 +107,8 @@ module Sequel
|
|
|
26
107
|
#
|
|
27
108
|
# Pay special attention to the :provider option, as without specifying a provider,
|
|
28
109
|
# many things will be broken. The SQLNCLI10 provider appears to work well if you
|
|
29
|
-
# are connecting to Microsoft SQL Server, but it is not the default as that
|
|
30
|
-
# break backwards compatability.
|
|
110
|
+
# are connecting to Microsoft SQL Server, but it is not the default as that is not
|
|
111
|
+
# always available and would break backwards compatability.
|
|
31
112
|
def connect(server)
|
|
32
113
|
opts = server_opts(server)
|
|
33
114
|
s = opts[:conn_string] || "driver=#{opts[:driver]};server=#{opts[:host]};database=#{opts[:database]}#{";uid=#{opts[:user]};pwd=#{opts[:password]}" if opts[:user]}"
|
|
@@ -44,6 +125,11 @@ module Sequel
|
|
|
44
125
|
nil
|
|
45
126
|
end
|
|
46
127
|
|
|
128
|
+
def freeze
|
|
129
|
+
@conversion_procs.freeze
|
|
130
|
+
super
|
|
131
|
+
end
|
|
132
|
+
|
|
47
133
|
# Just execute so it doesn't attempt to return the number of rows modified.
|
|
48
134
|
def execute_ddl(sql, opts=OPTS)
|
|
49
135
|
execute(sql, opts)
|
|
@@ -62,7 +148,7 @@ module Sequel
|
|
|
62
148
|
return super if opts[:provider]
|
|
63
149
|
synchronize(opts[:server]) do |conn|
|
|
64
150
|
begin
|
|
65
|
-
|
|
151
|
+
log_connection_yield(sql, conn){conn.Execute(sql, 1)}
|
|
66
152
|
WIN32OLE::ARGV[1]
|
|
67
153
|
rescue ::WIN32OLERuntimeError => e
|
|
68
154
|
raise_error(e)
|
|
@@ -73,8 +159,15 @@ module Sequel
|
|
|
73
159
|
def execute(sql, opts=OPTS)
|
|
74
160
|
synchronize(opts[:server]) do |conn|
|
|
75
161
|
begin
|
|
76
|
-
r =
|
|
77
|
-
|
|
162
|
+
r = log_connection_yield(sql, conn){conn.Execute(sql)}
|
|
163
|
+
begin
|
|
164
|
+
yield r if block_given?
|
|
165
|
+
ensure
|
|
166
|
+
begin
|
|
167
|
+
r.close
|
|
168
|
+
rescue ::WIN32OLERuntimeError
|
|
169
|
+
end
|
|
170
|
+
end
|
|
78
171
|
rescue ::WIN32OLERuntimeError => e
|
|
79
172
|
raise_error(e)
|
|
80
173
|
end
|
|
@@ -87,22 +180,29 @@ module Sequel
|
|
|
87
180
|
def adapter_initialize
|
|
88
181
|
case @opts[:conn_string]
|
|
89
182
|
when /Microsoft\.(Jet|ACE)\.OLEDB/io
|
|
90
|
-
|
|
183
|
+
require_relative 'ado/access'
|
|
91
184
|
extend Sequel::ADO::Access::DatabaseMethods
|
|
92
185
|
self.dataset_class = ADO::Access::Dataset
|
|
93
186
|
else
|
|
94
187
|
@opts[:driver] ||= 'SQL Server'
|
|
95
188
|
case @opts[:driver]
|
|
96
189
|
when 'SQL Server'
|
|
97
|
-
|
|
190
|
+
require_relative 'ado/mssql'
|
|
98
191
|
extend Sequel::ADO::MSSQL::DatabaseMethods
|
|
99
192
|
self.dataset_class = ADO::MSSQL::Dataset
|
|
100
193
|
set_mssql_unicode_strings
|
|
101
194
|
end
|
|
102
195
|
end
|
|
196
|
+
|
|
197
|
+
@conversion_procs = CONVERSION_PROCS.dup
|
|
198
|
+
|
|
103
199
|
super
|
|
104
200
|
end
|
|
105
201
|
|
|
202
|
+
def dataset_class_default
|
|
203
|
+
Dataset
|
|
204
|
+
end
|
|
205
|
+
|
|
106
206
|
# The ADO adapter's default provider doesn't support transactions, since it
|
|
107
207
|
# creates a new native connection for each query. So Sequel only attempts
|
|
108
208
|
# to use transactions if an explicit :provider is given.
|
|
@@ -119,7 +219,7 @@ module Sequel
|
|
|
119
219
|
end
|
|
120
220
|
|
|
121
221
|
def disconnect_error?(e, opts)
|
|
122
|
-
super || (e.is_a?(::WIN32OLERuntimeError) && e.message =~
|
|
222
|
+
super || (e.is_a?(::WIN32OLERuntimeError) && e.message =~ /Communication link failure/)
|
|
123
223
|
end
|
|
124
224
|
|
|
125
225
|
def rollback_transaction(conn, opts=OPTS)
|
|
@@ -128,21 +228,53 @@ module Sequel
|
|
|
128
228
|
end
|
|
129
229
|
|
|
130
230
|
class Dataset < Sequel::Dataset
|
|
131
|
-
Database::DatasetClass = self
|
|
132
|
-
|
|
133
231
|
def fetch_rows(sql)
|
|
134
|
-
execute(sql) do |
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
232
|
+
execute(sql) do |recordset|
|
|
233
|
+
cols = []
|
|
234
|
+
conversion_procs = db.conversion_procs
|
|
235
|
+
|
|
236
|
+
ts_cp = nil
|
|
237
|
+
recordset.Fields.each do |field|
|
|
238
|
+
type = field.Type
|
|
239
|
+
cp = if type == AdDBTimeStamp
|
|
240
|
+
ts_cp ||= begin
|
|
241
|
+
nsec_div = 1000000000.0/(10**(timestamp_precision))
|
|
242
|
+
nsec_mul = 10**(timestamp_precision+3)
|
|
243
|
+
meth = db.method(:to_application_timestamp)
|
|
244
|
+
lambda do |v|
|
|
245
|
+
# Fractional second handling is not correct on ruby <2.2
|
|
246
|
+
meth.call([v.year, v.month, v.day, v.hour, v.min, v.sec, (v.nsec/nsec_div).round * nsec_mul])
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
else
|
|
250
|
+
conversion_procs[type]
|
|
251
|
+
end
|
|
252
|
+
cols << [output_identifier(field.Name), cp]
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
self.columns = cols.map(&:first)
|
|
256
|
+
return if recordset.EOF
|
|
257
|
+
max = cols.length
|
|
258
|
+
|
|
259
|
+
recordset.GetRows.transpose.each do |field_values|
|
|
260
|
+
h = {}
|
|
261
|
+
|
|
262
|
+
i = -1
|
|
263
|
+
while (i += 1) < max
|
|
264
|
+
name, cp = cols[i]
|
|
265
|
+
h[name] = if (v = field_values[i]) && cp
|
|
266
|
+
cp.call(v)
|
|
267
|
+
else
|
|
268
|
+
v
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
yield h
|
|
273
|
+
end
|
|
142
274
|
end
|
|
143
275
|
end
|
|
144
276
|
|
|
145
|
-
# ADO
|
|
277
|
+
# ADO can return for for delete and update statements, depending on the provider.
|
|
146
278
|
def provides_accurate_rows_matched?
|
|
147
279
|
false
|
|
148
280
|
end
|