sequel 3.21.0 → 3.29.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 +413 -3
- data/README.rdoc +20 -6
- data/Rakefile +23 -16
- data/bin/sequel +1 -5
- data/doc/association_basics.rdoc +210 -43
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/mass_assignment.rdoc +54 -0
- data/doc/migration.rdoc +15 -538
- data/doc/model_hooks.rdoc +72 -27
- data/doc/opening_databases.rdoc +86 -50
- data/doc/prepared_statements.rdoc +40 -13
- data/doc/reflection.rdoc +8 -2
- 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/schema_modification.rdoc +547 -0
- data/doc/sharding.rdoc +7 -1
- data/doc/testing.rdoc +115 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +15 -7
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- data/lib/sequel/adapters/do/mysql.rb +0 -5
- data/lib/sequel/adapters/do/postgres.rb +0 -5
- data/lib/sequel/adapters/do/sqlite.rb +0 -5
- data/lib/sequel/adapters/do.rb +17 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +448 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +5 -31
- data/lib/sequel/adapters/jdbc/db2.rb +44 -0
- data/lib/sequel/adapters/jdbc/derby.rb +217 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +29 -0
- data/lib/sequel/adapters/jdbc/h2.rb +26 -17
- data/lib/sequel/adapters/jdbc/hsqldb.rb +166 -0
- data/lib/sequel/adapters/jdbc/informix.rb +26 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -32
- data/lib/sequel/adapters/jdbc/mysql.rb +9 -10
- data/lib/sequel/adapters/jdbc/oracle.rb +67 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +6 -11
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
- data/lib/sequel/adapters/jdbc/sqlserver.rb +41 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +107 -38
- data/lib/sequel/adapters/mock.rb +315 -0
- data/lib/sequel/adapters/mysql.rb +78 -182
- data/lib/sequel/adapters/mysql2.rb +24 -23
- data/lib/sequel/adapters/odbc/db2.rb +17 -0
- data/lib/sequel/adapters/odbc/mssql.rb +0 -5
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +2 -4
- data/lib/sequel/adapters/oracle.rb +349 -51
- data/lib/sequel/adapters/postgres.rb +169 -21
- data/lib/sequel/adapters/shared/access.rb +21 -6
- data/lib/sequel/adapters/shared/db2.rb +288 -0
- data/lib/sequel/adapters/shared/firebird.rb +214 -0
- data/lib/sequel/adapters/shared/informix.rb +45 -0
- data/lib/sequel/adapters/shared/mssql.rb +108 -65
- data/lib/sequel/adapters/shared/mysql.rb +56 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +149 -0
- data/lib/sequel/adapters/shared/oracle.rb +185 -34
- data/lib/sequel/adapters/shared/postgres.rb +107 -58
- data/lib/sequel/adapters/shared/progress.rb +0 -6
- data/lib/sequel/adapters/shared/sqlite.rb +168 -41
- data/lib/sequel/adapters/sqlite.rb +27 -18
- data/lib/sequel/adapters/swift/mysql.rb +9 -5
- data/lib/sequel/adapters/swift/postgres.rb +0 -5
- data/lib/sequel/adapters/swift/sqlite.rb +6 -4
- data/lib/sequel/adapters/swift.rb +5 -5
- data/lib/sequel/adapters/tinytds.rb +152 -17
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +63 -0
- data/lib/sequel/ast_transformer.rb +190 -0
- data/lib/sequel/connection_pool/threaded.rb +3 -2
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +46 -5
- data/lib/sequel/database/connecting.rb +5 -6
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +59 -1
- data/lib/sequel/database/logging.rb +1 -1
- data/lib/sequel/database/misc.rb +100 -19
- data/lib/sequel/database/query.rb +153 -58
- data/lib/sequel/database/schema_generator.rb +8 -5
- data/lib/sequel/database/schema_methods.rb +59 -29
- data/lib/sequel/dataset/actions.rb +194 -57
- data/lib/sequel/dataset/features.rb +81 -8
- data/lib/sequel/dataset/graph.rb +8 -7
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +5 -6
- data/lib/sequel/dataset/prepared_statements.rb +32 -15
- data/lib/sequel/dataset/query.rb +223 -42
- data/lib/sequel/dataset/sql.rb +58 -61
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/extensions/migration.rb +6 -4
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +997 -331
- data/lib/sequel/model/base.rb +386 -129
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- data/lib/sequel/model.rb +15 -8
- data/lib/sequel/plugins/association_pks.rb +22 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/identity_map.rb +114 -7
- data/lib/sequel/plugins/many_through_many.rb +65 -7
- data/lib/sequel/plugins/prepared_statements.rb +151 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +84 -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 +29 -15
- data/lib/sequel/plugins/serialization.rb +6 -1
- data/lib/sequel/plugins/serialization_modification_detection.rb +51 -0
- data/lib/sequel/plugins/sharding.rb +12 -25
- data/lib/sequel/plugins/single_table_inheritance.rb +3 -1
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/xml_serializer.rb +3 -3
- data/lib/sequel/sql.rb +107 -51
- data/lib/sequel/timezones.rb +44 -35
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/mssql_spec.rb +65 -29
- data/spec/adapters/mysql_spec.rb +122 -123
- data/spec/adapters/oracle_spec.rb +48 -76
- data/spec/adapters/postgres_spec.rb +213 -61
- data/spec/adapters/spec_helper.rb +6 -5
- data/spec/adapters/sqlite_spec.rb +35 -21
- data/spec/core/connection_pool_spec.rb +71 -92
- data/spec/core/core_sql_spec.rb +20 -31
- data/spec/core/database_spec.rb +729 -508
- data/spec/core/dataset_spec.rb +980 -1044
- data/spec/core/expression_filters_spec.rb +159 -42
- data/spec/core/mock_adapter_spec.rb +378 -0
- data/spec/core/object_graph_spec.rb +48 -114
- data/spec/core/schema_generator_spec.rb +3 -3
- data/spec/core/schema_spec.rb +298 -38
- data/spec/core/spec_helper.rb +6 -48
- data/spec/extensions/association_pks_spec.rb +38 -0
- data/spec/extensions/class_table_inheritance_spec.rb +1 -1
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/identity_map_spec.rb +162 -0
- data/spec/extensions/instance_hooks_spec.rb +71 -0
- data/spec/extensions/many_through_many_spec.rb +195 -20
- data/spec/extensions/migration_spec.rb +17 -17
- data/spec/extensions/named_timezones_spec.rb +22 -2
- data/spec/extensions/nested_attributes_spec.rb +4 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +126 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +79 -0
- data/spec/extensions/prepared_statements_spec.rb +72 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +38 -0
- data/spec/extensions/schema_dumper_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +13 -21
- data/spec/extensions/serialization_modification_detection_spec.rb +37 -0
- data/spec/extensions/serialization_spec.rb +5 -8
- data/spec/extensions/single_table_inheritance_spec.rb +11 -0
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/to_dot_spec.rb +3 -5
- data/spec/extensions/typecast_on_load_spec.rb +1 -6
- data/spec/extensions/xml_serializer_spec.rb +16 -4
- data/spec/integration/associations_test.rb +522 -21
- data/spec/integration/database_test.rb +4 -2
- data/spec/integration/dataset_test.rb +375 -62
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/model_test.rb +80 -1
- data/spec/integration/plugin_test.rb +304 -116
- data/spec/integration/prepared_statement_test.rb +200 -120
- data/spec/integration/schema_test.rb +161 -30
- data/spec/integration/spec_helper.rb +39 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +172 -5
- data/spec/integration/type_test.rb +17 -3
- data/spec/model/association_reflection_spec.rb +174 -7
- data/spec/model/associations_spec.rb +849 -661
- data/spec/model/base_spec.rb +255 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +640 -676
- data/spec/model/hooks_spec.rb +309 -67
- data/spec/model/model_spec.rb +207 -167
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +321 -218
- data/spec/model/spec_helper.rb +13 -71
- data/spec/model/validations_spec.rb +11 -0
- metadata +95 -38
data/lib/sequel/dataset/misc.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Sequel
|
|
2
2
|
class Dataset
|
|
3
3
|
# ---------------------
|
|
4
|
-
# :section: Miscellaneous methods
|
|
4
|
+
# :section: 6 - Miscellaneous methods
|
|
5
5
|
# These methods don't fit cleanly into another section.
|
|
6
6
|
# ---------------------
|
|
7
7
|
|
|
@@ -23,17 +23,13 @@ module Sequel
|
|
|
23
23
|
# DB[:posts]
|
|
24
24
|
#
|
|
25
25
|
# Sequel::Dataset is an abstract class that is not useful by itself. Each
|
|
26
|
-
# database
|
|
26
|
+
# database adapter provides a subclass of Sequel::Dataset, and has
|
|
27
27
|
# the Database#dataset method return an instance of that subclass.
|
|
28
28
|
def initialize(db, opts = nil)
|
|
29
29
|
@db = db
|
|
30
|
-
@quote_identifiers = db.quote_identifiers? if db.respond_to?(:quote_identifiers?)
|
|
31
|
-
@identifier_input_method = db.identifier_input_method if db.respond_to?(:identifier_input_method)
|
|
32
|
-
@identifier_output_method = db.identifier_output_method if db.respond_to?(:identifier_output_method)
|
|
33
30
|
@opts = opts || {}
|
|
34
|
-
@row_proc = nil
|
|
35
31
|
end
|
|
36
|
-
|
|
32
|
+
|
|
37
33
|
# Define a hash value such that datasets with the same DB, opts, and SQL
|
|
38
34
|
# will be consider equal.
|
|
39
35
|
def ==(o)
|
|
@@ -45,15 +41,6 @@ module Sequel
|
|
|
45
41
|
self == o
|
|
46
42
|
end
|
|
47
43
|
|
|
48
|
-
# Return the dataset as an aliased expression with the given alias. You can
|
|
49
|
-
# use this as a FROM or JOIN dataset, or as a column if this dataset
|
|
50
|
-
# returns a single row and column.
|
|
51
|
-
#
|
|
52
|
-
# DB.from(DB[:table].as(:b)) # SELECT * FROM (SELECT * FROM table) AS b
|
|
53
|
-
def as(aliaz)
|
|
54
|
-
::Sequel::SQL::AliasedExpression.new(self, aliaz)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
44
|
# Yield a dataset for each server in the connection pool that is tied to that server.
|
|
58
45
|
# Intended for use in sharded environments where all servers need to be modified
|
|
59
46
|
# with the same data:
|
|
@@ -96,10 +83,10 @@ module Sequel
|
|
|
96
83
|
# have a table, raises an error. If the table is aliased, returns the original
|
|
97
84
|
# table, not the alias
|
|
98
85
|
#
|
|
99
|
-
# DB[:table].
|
|
86
|
+
# DB[:table].first_source_table
|
|
100
87
|
# # => :table
|
|
101
88
|
#
|
|
102
|
-
# DB[:table___t].
|
|
89
|
+
# DB[:table___t].first_source_table
|
|
103
90
|
# # => :table
|
|
104
91
|
def first_source_table
|
|
105
92
|
source = @opts[:from]
|
|
@@ -120,16 +107,48 @@ module Sequel
|
|
|
120
107
|
# Define a hash value such that datasets with the same DB, opts, and SQL
|
|
121
108
|
# will have the same hash value
|
|
122
109
|
def hash
|
|
123
|
-
[db, opts.sort_by{|k| k.to_s}, sql].hash
|
|
110
|
+
[db, opts.sort_by{|k, v| k.to_s}, sql].hash
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# The String instance method to call on identifiers before sending them to
|
|
114
|
+
# the database.
|
|
115
|
+
def identifier_input_method
|
|
116
|
+
if defined?(@identifier_input_method)
|
|
117
|
+
@identifier_input_method
|
|
118
|
+
elsif db.respond_to?(:identifier_input_method)
|
|
119
|
+
@identifier_input_method = db.identifier_input_method
|
|
120
|
+
else
|
|
121
|
+
@identifier_input_method = nil
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# The String instance method to call on identifiers before sending them to
|
|
126
|
+
# the database.
|
|
127
|
+
def identifier_output_method
|
|
128
|
+
if defined?(@identifier_output_method)
|
|
129
|
+
@identifier_output_method
|
|
130
|
+
elsif db.respond_to?(:identifier_output_method)
|
|
131
|
+
@identifier_output_method = db.identifier_output_method
|
|
132
|
+
else
|
|
133
|
+
@identifier_output_method = nil
|
|
134
|
+
end
|
|
124
135
|
end
|
|
125
136
|
|
|
126
137
|
# Returns a string representation of the dataset including the class name
|
|
127
138
|
# and the corresponding SQL select statement.
|
|
128
139
|
def inspect
|
|
129
|
-
|
|
140
|
+
c = self.class
|
|
141
|
+
c = c.superclass while c.name.nil? || c.name == ''
|
|
142
|
+
"#<#{c.name}: #{sql.inspect}>"
|
|
130
143
|
end
|
|
131
144
|
|
|
132
|
-
#
|
|
145
|
+
# The alias to use for the row_number column, used when emulating OFFSET
|
|
146
|
+
# support and for eager limit strategies
|
|
147
|
+
def row_number_column
|
|
148
|
+
:x_sequel_row_number_x
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Splits a possible implicit alias in +c+, handling both SQL::AliasedExpressions
|
|
133
152
|
# and Symbols. Returns an array of two elements, with the first being the
|
|
134
153
|
# main expression, and the second being the alias.
|
|
135
154
|
def split_alias(c)
|
|
@@ -139,6 +158,8 @@ module Sequel
|
|
|
139
158
|
[c_table ? SQL::QualifiedIdentifier.new(c_table, column.to_sym) : column.to_sym, aliaz]
|
|
140
159
|
when SQL::AliasedExpression
|
|
141
160
|
[c.expression, c.aliaz]
|
|
161
|
+
when SQL::JoinClause
|
|
162
|
+
[c.table, c.table_alias]
|
|
142
163
|
else
|
|
143
164
|
[c, nil]
|
|
144
165
|
end
|
|
@@ -151,6 +172,10 @@ module Sequel
|
|
|
151
172
|
# used, where N is an integer starting at 0 and increasing until an
|
|
152
173
|
# unused one is found.
|
|
153
174
|
#
|
|
175
|
+
# You can provide a second addition array argument containing symbols
|
|
176
|
+
# that should not be considered valid table aliases. The current aliases
|
|
177
|
+
# for the FROM and JOIN tables are automatically included in this array.
|
|
178
|
+
#
|
|
154
179
|
# DB[:table].unused_table_alias(:t)
|
|
155
180
|
# # => :t
|
|
156
181
|
#
|
|
@@ -159,9 +184,11 @@ module Sequel
|
|
|
159
184
|
#
|
|
160
185
|
# DB[:table, :table_0].unused_table_alias(:table)
|
|
161
186
|
# # => :table_1
|
|
162
|
-
|
|
187
|
+
#
|
|
188
|
+
# DB[:table, :table_0].unused_table_alias(:table, [:table_1, :table_2])
|
|
189
|
+
# # => :table_3
|
|
190
|
+
def unused_table_alias(table_alias, used_aliases = [])
|
|
163
191
|
table_alias = alias_symbol(table_alias)
|
|
164
|
-
used_aliases = []
|
|
165
192
|
used_aliases += opts[:from].map{|t| alias_symbol(t)} if opts[:from]
|
|
166
193
|
used_aliases += opts[:join].map{|j| j.table_alias ? alias_alias_symbol(j.table_alias) : alias_symbol(j.table)} if opts[:join]
|
|
167
194
|
if used_aliases.include?(table_alias)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Sequel
|
|
2
2
|
class Dataset
|
|
3
3
|
# ---------------------
|
|
4
|
-
# :section: Mutation methods
|
|
4
|
+
# :section: 7 - Mutation methods
|
|
5
5
|
# These methods modify the receiving dataset and should be used with care.
|
|
6
6
|
# ---------------------
|
|
7
7
|
|
|
@@ -21,17 +21,16 @@ module Sequel
|
|
|
21
21
|
def_mutation_method(*MUTATION_METHODS)
|
|
22
22
|
|
|
23
23
|
# Set the method to call on identifiers going into the database for this dataset
|
|
24
|
-
|
|
24
|
+
attr_writer :identifier_input_method
|
|
25
25
|
|
|
26
26
|
# Set the method to call on identifiers coming the database for this dataset
|
|
27
|
-
|
|
27
|
+
attr_writer :identifier_output_method
|
|
28
28
|
|
|
29
29
|
# Whether to quote identifiers for this dataset
|
|
30
30
|
attr_writer :quote_identifiers
|
|
31
31
|
|
|
32
|
-
# The row_proc for this database, should be
|
|
33
|
-
# a single hash argument and returns the object you want
|
|
34
|
-
# each to return.
|
|
32
|
+
# The row_proc for this database, should be any object that responds to +call+ with
|
|
33
|
+
# a single hash argument and returns the object you want #each to return.
|
|
35
34
|
attr_accessor :row_proc
|
|
36
35
|
|
|
37
36
|
# Add a mutation method to this dataset instance.
|
|
@@ -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
|
# ---------------------
|
|
@@ -35,7 +35,7 @@ module Sequel
|
|
|
35
35
|
return @prepared_sql if @prepared_sql
|
|
36
36
|
@prepared_args ||= []
|
|
37
37
|
@prepared_sql = super
|
|
38
|
-
|
|
38
|
+
@opts[:sql] = @prepared_sql
|
|
39
39
|
@prepared_sql
|
|
40
40
|
end
|
|
41
41
|
|
|
@@ -80,7 +80,9 @@ module Sequel
|
|
|
80
80
|
when :select, :all
|
|
81
81
|
select_sql
|
|
82
82
|
when :first
|
|
83
|
-
|
|
83
|
+
limit(1).select_sql
|
|
84
|
+
when :insert_select
|
|
85
|
+
returning.insert_sql(*@prepared_modify_values)
|
|
84
86
|
when :insert
|
|
85
87
|
insert_sql(*@prepared_modify_values)
|
|
86
88
|
when :update
|
|
@@ -95,8 +97,8 @@ module Sequel
|
|
|
95
97
|
# and they are substituted using prepared_arg.
|
|
96
98
|
def literal_symbol(v)
|
|
97
99
|
if @opts[:bind_vars] and match = PLACEHOLDER_RE.match(v.to_s)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
s = match[1].to_sym
|
|
101
|
+
prepared_arg?(s) ? literal(prepared_arg(s)) : v
|
|
100
102
|
else
|
|
101
103
|
super
|
|
102
104
|
end
|
|
@@ -118,6 +120,8 @@ module Sequel
|
|
|
118
120
|
case @prepared_type
|
|
119
121
|
when :select, :all
|
|
120
122
|
all(&block)
|
|
123
|
+
when :insert_select
|
|
124
|
+
with_sql(prepared_sql).first
|
|
121
125
|
when :first
|
|
122
126
|
first
|
|
123
127
|
when :insert
|
|
@@ -136,6 +140,11 @@ module Sequel
|
|
|
136
140
|
@opts[:bind_vars][k]
|
|
137
141
|
end
|
|
138
142
|
|
|
143
|
+
# Whether there is a bound value for the given key.
|
|
144
|
+
def prepared_arg?(k)
|
|
145
|
+
@opts[:bind_vars].has_key?(k)
|
|
146
|
+
end
|
|
147
|
+
|
|
139
148
|
# Use a clone of the dataset extended with prepared statement
|
|
140
149
|
# support and using the same argument hash so that you can use
|
|
141
150
|
# bind variables/prepared arguments in subselects.
|
|
@@ -171,6 +180,11 @@ module Sequel
|
|
|
171
180
|
prepared_args << k
|
|
172
181
|
prepared_arg_placeholder
|
|
173
182
|
end
|
|
183
|
+
|
|
184
|
+
# Always assume there is a prepared arg in the argument mapper.
|
|
185
|
+
def prepared_arg?(k)
|
|
186
|
+
true
|
|
187
|
+
end
|
|
174
188
|
end
|
|
175
189
|
|
|
176
190
|
# Set the bind variables to use for the call. If bind variables have
|
|
@@ -184,11 +198,9 @@ module Sequel
|
|
|
184
198
|
clone(:bind_vars=>@opts[:bind_vars] ? @opts[:bind_vars].merge(bind_vars) : bind_vars)
|
|
185
199
|
end
|
|
186
200
|
|
|
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.
|
|
201
|
+
# For the given type (:select, :first, :insert, :insert_select, :update, or :delete),
|
|
202
|
+
# run the sql with the bind variables specified in the hash. +values+ is a hash passed to
|
|
203
|
+
# insert or update (if one of those types is used), which may contain placeholders.
|
|
192
204
|
#
|
|
193
205
|
# DB[:table].filter(:id=>:$id).call(:first, :id=>1)
|
|
194
206
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
|
@@ -197,11 +209,16 @@ module Sequel
|
|
|
197
209
|
prepare(type, nil, *values).call(bind_variables, &block)
|
|
198
210
|
end
|
|
199
211
|
|
|
200
|
-
# Prepare an SQL statement for later execution.
|
|
201
|
-
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
#
|
|
212
|
+
# Prepare an SQL statement for later execution. Takes a type similar to #call,
|
|
213
|
+
# and the +name+ symbol of the prepared statement. While +name+ defaults to +nil+,
|
|
214
|
+
# it should always be provided as a symbol for the name of the prepared statement,
|
|
215
|
+
# as some databases require that prepared statements have names.
|
|
216
|
+
#
|
|
217
|
+
# This returns a clone of the dataset extended with PreparedStatementMethods,
|
|
218
|
+
# which you can +call+ with the hash of bind variables to use.
|
|
219
|
+
# The prepared statement is also stored in
|
|
220
|
+
# the associated database, where it can be called by name.
|
|
221
|
+
# The following usage is identical:
|
|
205
222
|
#
|
|
206
223
|
# ps = DB[:table].filter(:name=>:$name).prepare(:first, :select_by_name)
|
|
207
224
|
#
|