sequel 3.21.0 → 3.41.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.
- data/CHANGELOG +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +576 -0
- data/doc/opening_databases.rdoc +121 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +539 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +334 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +137 -16
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +77 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +168 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +227 -33
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +324 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +200 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +340 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +65 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +53 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Sequel
|
|
2
2
|
class Dataset
|
|
3
3
|
# ---------------------
|
|
4
|
-
# :section: Methods related to prepared statements or bound variables
|
|
4
|
+
# :section: 8 - Methods related to prepared statements or bound variables
|
|
5
5
|
# On some adapters, these use native prepared statements and bound variables, on others
|
|
6
6
|
# support is emulated. For details, see the {"Prepared Statements/Bound Variables" guide}[link:files/doc/prepared_statements_rdoc.html].
|
|
7
7
|
# ---------------------
|
|
@@ -12,15 +12,12 @@ module Sequel
|
|
|
12
12
|
# native database support for bind variables and prepared
|
|
13
13
|
# statements (as opposed to the emulated ones used by default).
|
|
14
14
|
module ArgumentMapper
|
|
15
|
-
SQL_QUERY_TYPE = Hash.new{|h,k| h[k] = k}
|
|
16
|
-
SQL_QUERY_TYPE[:first] = SQL_QUERY_TYPE[:all] = :select
|
|
17
|
-
|
|
18
15
|
# The name of the prepared statement, if any.
|
|
19
16
|
attr_accessor :prepared_statement_name
|
|
20
17
|
|
|
21
18
|
# The bind arguments to use for running this prepared statement
|
|
22
19
|
attr_accessor :bind_arguments
|
|
23
|
-
|
|
20
|
+
|
|
24
21
|
# Set the bind arguments based on the hash and call super.
|
|
25
22
|
def call(bind_vars={}, &block)
|
|
26
23
|
ds = bind(bind_vars)
|
|
@@ -35,16 +32,9 @@ module Sequel
|
|
|
35
32
|
return @prepared_sql if @prepared_sql
|
|
36
33
|
@prepared_args ||= []
|
|
37
34
|
@prepared_sql = super
|
|
38
|
-
|
|
35
|
+
@opts[:sql] = @prepared_sql
|
|
39
36
|
@prepared_sql
|
|
40
37
|
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
# The type of query (:select, :insert, :delete, :update).
|
|
45
|
-
def sql_query_type
|
|
46
|
-
SQL_QUERY_TYPE[@prepared_type]
|
|
47
|
-
end
|
|
48
38
|
end
|
|
49
39
|
|
|
50
40
|
# Backbone of the prepared statement support. Grafts bind variable
|
|
@@ -56,6 +46,10 @@ module Sequel
|
|
|
56
46
|
module PreparedStatementMethods
|
|
57
47
|
PLACEHOLDER_RE = /\A\$(.*)\z/
|
|
58
48
|
|
|
49
|
+
# Whether to log the full SQL query. By default, just the prepared statement
|
|
50
|
+
# name is generally logged on adapters that support native prepared statements.
|
|
51
|
+
attr_accessor :log_sql
|
|
52
|
+
|
|
59
53
|
# The type of prepared statement, should be one of :select, :first,
|
|
60
54
|
# :insert, :update, or :delete
|
|
61
55
|
attr_accessor :prepared_type
|
|
@@ -63,6 +57,9 @@ module Sequel
|
|
|
63
57
|
# The array/hash of bound variable placeholder names.
|
|
64
58
|
attr_accessor :prepared_args
|
|
65
59
|
|
|
60
|
+
# The dataset that created this prepared statement.
|
|
61
|
+
attr_accessor :orig_dataset
|
|
62
|
+
|
|
66
63
|
# The argument to supply to insert and update, which may use
|
|
67
64
|
# placeholders specified by prepared_args
|
|
68
65
|
attr_accessor :prepared_modify_values
|
|
@@ -72,31 +69,46 @@ module Sequel
|
|
|
72
69
|
def call(bind_vars={}, &block)
|
|
73
70
|
bind(bind_vars).run(&block)
|
|
74
71
|
end
|
|
72
|
+
|
|
73
|
+
# Send the columns to the original dataset, as calling it
|
|
74
|
+
# on the prepared statement can cause problems.
|
|
75
|
+
def columns
|
|
76
|
+
orig_dataset.columns
|
|
77
|
+
end
|
|
75
78
|
|
|
76
79
|
# Returns the SQL for the prepared statement, depending on
|
|
77
80
|
# the type of the statement and the prepared_modify_values.
|
|
78
81
|
def prepared_sql
|
|
79
82
|
case @prepared_type
|
|
80
|
-
when :select, :all
|
|
83
|
+
when :select, :all, :each
|
|
84
|
+
# Most common scenario, so listed first.
|
|
81
85
|
select_sql
|
|
82
86
|
when :first
|
|
83
87
|
clone(:limit=>1).select_sql
|
|
88
|
+
when :insert_select
|
|
89
|
+
returning.insert_sql(*@prepared_modify_values)
|
|
84
90
|
when :insert
|
|
85
91
|
insert_sql(*@prepared_modify_values)
|
|
86
92
|
when :update
|
|
87
93
|
update_sql(*@prepared_modify_values)
|
|
88
94
|
when :delete
|
|
89
95
|
delete_sql
|
|
96
|
+
else
|
|
97
|
+
select_sql
|
|
90
98
|
end
|
|
91
99
|
end
|
|
92
100
|
|
|
93
101
|
# Changes the values of symbols if they start with $ and
|
|
94
102
|
# prepared_args is present. If so, they are considered placeholders,
|
|
95
103
|
# and they are substituted using prepared_arg.
|
|
96
|
-
def
|
|
104
|
+
def literal_symbol_append(sql, v)
|
|
97
105
|
if @opts[:bind_vars] and match = PLACEHOLDER_RE.match(v.to_s)
|
|
98
|
-
|
|
99
|
-
|
|
106
|
+
s = match[1].to_sym
|
|
107
|
+
if prepared_arg?(s)
|
|
108
|
+
literal_append(sql, prepared_arg(s))
|
|
109
|
+
else
|
|
110
|
+
sql << v.to_s
|
|
111
|
+
end
|
|
100
112
|
else
|
|
101
113
|
super
|
|
102
114
|
end
|
|
@@ -117,7 +129,12 @@ module Sequel
|
|
|
117
129
|
def run(&block)
|
|
118
130
|
case @prepared_type
|
|
119
131
|
when :select, :all
|
|
132
|
+
# Most common scenario, so listed first
|
|
120
133
|
all(&block)
|
|
134
|
+
when :each
|
|
135
|
+
each(&block)
|
|
136
|
+
when :insert_select
|
|
137
|
+
with_sql(prepared_sql).first
|
|
121
138
|
when :first
|
|
122
139
|
first
|
|
123
140
|
when :insert
|
|
@@ -126,6 +143,13 @@ module Sequel
|
|
|
126
143
|
update(*@prepared_modify_values)
|
|
127
144
|
when :delete
|
|
128
145
|
delete
|
|
146
|
+
when Array
|
|
147
|
+
case @prepared_type.at(0)
|
|
148
|
+
when :map, :to_hash, :to_hash_groups
|
|
149
|
+
send(*@prepared_type, &block)
|
|
150
|
+
end
|
|
151
|
+
else
|
|
152
|
+
all(&block)
|
|
129
153
|
end
|
|
130
154
|
end
|
|
131
155
|
|
|
@@ -136,11 +160,16 @@ module Sequel
|
|
|
136
160
|
@opts[:bind_vars][k]
|
|
137
161
|
end
|
|
138
162
|
|
|
163
|
+
# Whether there is a bound value for the given key.
|
|
164
|
+
def prepared_arg?(k)
|
|
165
|
+
@opts[:bind_vars].has_key?(k)
|
|
166
|
+
end
|
|
167
|
+
|
|
139
168
|
# Use a clone of the dataset extended with prepared statement
|
|
140
169
|
# support and using the same argument hash so that you can use
|
|
141
170
|
# bind variables/prepared arguments in subselects.
|
|
142
|
-
def
|
|
143
|
-
ps = ds.prepare(:select)
|
|
171
|
+
def subselect_sql_append(sql, ds)
|
|
172
|
+
ps = ds.clone(:append_sql=>sql).prepare(:select)
|
|
144
173
|
ps = ps.bind(@opts[:bind_vars]) if @opts[:bind_vars]
|
|
145
174
|
ps.prepared_args = prepared_args
|
|
146
175
|
ps.prepared_sql
|
|
@@ -171,6 +200,11 @@ module Sequel
|
|
|
171
200
|
prepared_args << k
|
|
172
201
|
prepared_arg_placeholder
|
|
173
202
|
end
|
|
203
|
+
|
|
204
|
+
# Always assume there is a prepared arg in the argument mapper.
|
|
205
|
+
def prepared_arg?(k)
|
|
206
|
+
true
|
|
207
|
+
end
|
|
174
208
|
end
|
|
175
209
|
|
|
176
210
|
# Set the bind variables to use for the call. If bind variables have
|
|
@@ -184,11 +218,9 @@ module Sequel
|
|
|
184
218
|
clone(:bind_vars=>@opts[:bind_vars] ? @opts[:bind_vars].merge(bind_vars) : bind_vars)
|
|
185
219
|
end
|
|
186
220
|
|
|
187
|
-
# For the given type (:select, :insert, :update, or :delete),
|
|
188
|
-
# run the sql with the bind variables
|
|
189
|
-
#
|
|
190
|
-
# insert or update (if one of those types is used),
|
|
191
|
-
# which may contain placeholders.
|
|
221
|
+
# For the given type (:select, :first, :insert, :insert_select, :update, or :delete),
|
|
222
|
+
# run the sql with the bind variables specified in the hash. +values+ is a hash passed to
|
|
223
|
+
# insert or update (if one of those types is used), which may contain placeholders.
|
|
192
224
|
#
|
|
193
225
|
# DB[:table].filter(:id=>:$id).call(:first, :id=>1)
|
|
194
226
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
|
@@ -197,11 +229,16 @@ module Sequel
|
|
|
197
229
|
prepare(type, nil, *values).call(bind_variables, &block)
|
|
198
230
|
end
|
|
199
231
|
|
|
200
|
-
# Prepare an SQL statement for later execution.
|
|
201
|
-
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
#
|
|
232
|
+
# Prepare an SQL statement for later execution. Takes a type similar to #call,
|
|
233
|
+
# and the +name+ symbol of the prepared statement. While +name+ defaults to +nil+,
|
|
234
|
+
# it should always be provided as a symbol for the name of the prepared statement,
|
|
235
|
+
# as some databases require that prepared statements have names.
|
|
236
|
+
#
|
|
237
|
+
# This returns a clone of the dataset extended with PreparedStatementMethods,
|
|
238
|
+
# which you can +call+ with the hash of bind variables to use.
|
|
239
|
+
# The prepared statement is also stored in
|
|
240
|
+
# the associated database, where it can be called by name.
|
|
241
|
+
# The following usage is identical:
|
|
205
242
|
#
|
|
206
243
|
# ps = DB[:table].filter(:name=>:$name).prepare(:first, :select_by_name)
|
|
207
244
|
#
|
|
@@ -212,7 +249,7 @@ module Sequel
|
|
|
212
249
|
# DB.call(:select_by_name, :name=>'Blah') # Same thing
|
|
213
250
|
def prepare(type, name=nil, *values)
|
|
214
251
|
ps = to_prepared_statement(type, values)
|
|
215
|
-
db.
|
|
252
|
+
db.set_prepared_statement(name, ps) if name
|
|
216
253
|
ps
|
|
217
254
|
end
|
|
218
255
|
|
|
@@ -223,6 +260,7 @@ module Sequel
|
|
|
223
260
|
def to_prepared_statement(type, values=nil)
|
|
224
261
|
ps = bind
|
|
225
262
|
ps.extend(PreparedStatementMethods)
|
|
263
|
+
ps.orig_dataset = self
|
|
226
264
|
ps.prepared_type = type
|
|
227
265
|
ps.prepared_modify_values = values
|
|
228
266
|
ps
|