sequel 5.85.0 → 5.86.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sequel/adapters/jdbc/db2.rb +2 -2
- data/lib/sequel/adapters/jdbc/derby.rb +2 -2
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -2
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -5
- data/lib/sequel/adapters/jdbc/postgresql.rb +5 -5
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +6 -6
- data/lib/sequel/adapters/jdbc/sqlite.rb +2 -2
- data/lib/sequel/adapters/jdbc/sqlserver.rb +2 -2
- data/lib/sequel/adapters/jdbc.rb +6 -6
- data/lib/sequel/adapters/shared/postgres.rb +3 -0
- data/lib/sequel/adapters/sqlite.rb +4 -0
- data/lib/sequel/database/misc.rb +6 -1
- data/lib/sequel/extensions/schema_dumper.rb +15 -3
- data/lib/sequel/plugins/subset_conditions.rb +84 -5
- data/lib/sequel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2945ab081dad1d3dc6d910e2902247b18750215023e0cfbb5b8f8159811b0d25
|
4
|
+
data.tar.gz: 6b2933b4ac2023a71526a76f40b949e873460e2a7f8aed1524bef47b71f91e79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 988bfe69b6b4953a7792431e3dd26bcb7ad13f01b8b1dc822fd9d79917608cc2f60bdb7e9a75cfa975bcd297ada83f00a2d80343424f9e4096c029437a9250ad
|
7
|
+
data.tar.gz: 51c2591400946af23395f0a3f49dfc87d4ce6f536e9cbc045ae7c86915007938c72b90f899dd347d749918218b86edc8dbaa63e8f9430d7075872a431d91b777
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::ComIbmDb2Jcc::DB2Driver')
|
4
4
|
require_relative '../shared/db2'
|
5
5
|
require_relative 'transactions'
|
6
6
|
|
@@ -25,7 +25,7 @@ module Sequel
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
db.extend_datasets Sequel::DB2::DatasetMethods
|
28
|
-
|
28
|
+
Java::ComIbmDb2Jcc::DB2Driver
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::OrgApacheDerbyJdbc::EmbeddedDriver', :Derby)
|
4
4
|
require_relative 'transactions'
|
5
5
|
require_relative '../utils/columns_limit_1'
|
6
6
|
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
DATABASE_SETUP[:derby] = proc do |db|
|
11
11
|
db.extend(Sequel::JDBC::Derby::DatabaseMethods)
|
12
12
|
db.dataset_class = Sequel::JDBC::Derby::Dataset
|
13
|
-
|
13
|
+
Java::OrgApacheDerbyJdbc::EmbeddedDriver
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::OrgH2::Driver', :H2)
|
4
4
|
require_relative '../../extensions/auto_cast_date_and_time'
|
5
5
|
|
6
6
|
module Sequel
|
@@ -9,7 +9,7 @@ module Sequel
|
|
9
9
|
DATABASE_SETUP[:h2] = proc do |db|
|
10
10
|
db.extend(Sequel::JDBC::H2::DatabaseMethods)
|
11
11
|
db.dataset_class = Sequel::JDBC::H2::Dataset
|
12
|
-
|
12
|
+
Java::OrgH2::Driver
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::OrgHsqldb::jdbcDriver', :HSQLDB)
|
4
4
|
require_relative 'transactions'
|
5
5
|
require_relative '../../extensions/auto_cast_date_and_time'
|
6
6
|
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
DATABASE_SETUP[:hsqldb] = proc do |db|
|
11
11
|
db.extend(Sequel::JDBC::HSQLDB::DatabaseMethods)
|
12
12
|
db.dataset_class = Sequel::JDBC::HSQLDB::Dataset
|
13
|
-
|
13
|
+
Java::OrgHsqldb::jdbcDriver
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('Java::
|
3
|
+
Sequel::JDBC.load_driver('Java::NetSourceforgeJtdsJdbc::Driver', :JTDS)
|
4
4
|
require_relative 'mssql'
|
5
5
|
|
6
6
|
module Sequel
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
db.extend(Sequel::JDBC::JTDS::DatabaseMethods)
|
11
11
|
db.extend_datasets Sequel::MSSQL::DatasetMethods
|
12
12
|
db.send(:set_mssql_unicode_strings)
|
13
|
-
Java::
|
13
|
+
Java::NetSourceforgeJtdsJdbc::Driver
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Sequel
|
4
4
|
module JDBC
|
5
|
-
driver = Sequel::JDBC.load_driver(%w'
|
5
|
+
driver = Sequel::JDBC.load_driver(%w'Java::ComMysqlCjJdbc::Driver Java::ComMysqlJdbc::Driver', :MySQL)
|
6
6
|
require_relative '../shared/mysql'
|
7
7
|
|
8
8
|
Sequel.synchronize do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('Java::
|
3
|
+
Sequel::JDBC.load_driver('Java::OracleJdbcDriver::OracleDriver')
|
4
4
|
require_relative '../shared/oracle'
|
5
5
|
require_relative 'transactions'
|
6
6
|
|
@@ -10,12 +10,12 @@ module Sequel
|
|
10
10
|
DATABASE_SETUP[:oracle] = proc do |db|
|
11
11
|
db.extend(Sequel::JDBC::Oracle::DatabaseMethods)
|
12
12
|
db.dataset_class = Sequel::JDBC::Oracle::Dataset
|
13
|
-
Java::
|
13
|
+
Java::OracleJdbcDriver::OracleDriver
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
module Oracle
|
18
|
-
JAVA_BIG_DECIMAL_CONSTRUCTOR =
|
18
|
+
JAVA_BIG_DECIMAL_CONSTRUCTOR = Java::JavaMath::BigDecimal.java_class.constructor(Java::long).method(:new_instance)
|
19
19
|
ORACLE_DECIMAL = Object.new
|
20
20
|
def ORACLE_DECIMAL.call(r, i)
|
21
21
|
if v = r.getBigDecimal(i)
|
@@ -76,7 +76,7 @@ module Sequel
|
|
76
76
|
rs = log_connection_yield(sql, conn){stmt.executeQuery(sql)}
|
77
77
|
rs.next
|
78
78
|
rs.getLong(1)
|
79
|
-
rescue
|
79
|
+
rescue Java::JavaSql::SQLException
|
80
80
|
nil
|
81
81
|
end
|
82
82
|
end
|
@@ -122,7 +122,7 @@ module Sequel
|
|
122
122
|
NUMERIC_TYPE = Java::JavaSQL::Types::NUMERIC
|
123
123
|
TIMESTAMP_TYPE = Java::JavaSQL::Types::TIMESTAMP
|
124
124
|
CLOB_TYPE = Java::JavaSQL::Types::CLOB
|
125
|
-
TIMESTAMPTZ_TYPES = [Java::
|
125
|
+
TIMESTAMPTZ_TYPES = [Java::OracleJdbc::OracleTypes::TIMESTAMPTZ, Java::OracleJdbc::OracleTypes::TIMESTAMPLTZ].freeze
|
126
126
|
|
127
127
|
def type_convertor(map, meta, type, i)
|
128
128
|
case type
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::OrgPostgresql::Driver', :Postgres)
|
4
4
|
require_relative '../shared/postgres'
|
5
5
|
|
6
6
|
module Sequel
|
@@ -9,7 +9,7 @@ module Sequel
|
|
9
9
|
DATABASE_SETUP[:postgresql] = proc do |db|
|
10
10
|
db.dataset_class = Sequel::JDBC::Postgres::Dataset
|
11
11
|
db.extend(Sequel::JDBC::Postgres::DatabaseMethods)
|
12
|
-
|
12
|
+
Java::OrgPostgresql::Driver
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -43,7 +43,7 @@ module Sequel
|
|
43
43
|
|
44
44
|
synchronize(opts[:server]) do |conn|
|
45
45
|
begin
|
46
|
-
copy_manager =
|
46
|
+
copy_manager = Java::OrgPostgresqlCopy::CopyManager.new(conn)
|
47
47
|
copier = copy_manager.copy_in(copy_into_sql(table, opts))
|
48
48
|
if defined?(yield)
|
49
49
|
while buf = yield
|
@@ -74,7 +74,7 @@ module Sequel
|
|
74
74
|
# See Sequel::Postgres::Adapter#copy_table
|
75
75
|
def copy_table(table, opts=OPTS)
|
76
76
|
synchronize(opts[:server]) do |conn|
|
77
|
-
copy_manager =
|
77
|
+
copy_manager = Java::OrgPostgresqlCopy::CopyManager.new(conn)
|
78
78
|
copier = copy_manager.copy_out(copy_table_sql(table, opts))
|
79
79
|
begin
|
80
80
|
if defined?(yield)
|
@@ -148,7 +148,7 @@ module Sequel
|
|
148
148
|
# and set that as the prepared statement argument.
|
149
149
|
def set_ps_arg(cps, arg, i)
|
150
150
|
if v = bound_variable_arg(arg, nil)
|
151
|
-
obj =
|
151
|
+
obj = Java::OrgPostgresqlUtil::PGobject.new
|
152
152
|
obj.setType("unknown")
|
153
153
|
obj.setValue(v)
|
154
154
|
cps.setObject(i, obj)
|
@@ -6,12 +6,12 @@ require_relative 'transactions'
|
|
6
6
|
module Sequel
|
7
7
|
module JDBC
|
8
8
|
drv = [
|
9
|
-
lambda{Java::
|
10
|
-
lambda{Java::
|
11
|
-
lambda{Java::
|
12
|
-
lambda{Java::
|
13
|
-
lambda{Java::
|
14
|
-
lambda{Java::
|
9
|
+
lambda{Java::SybaseJdbc4Sqlanywhere::IDriver},
|
10
|
+
lambda{Java::IanywhereMlJdbcodbcJdbc4::IDriver},
|
11
|
+
lambda{Java::SybaseJdbcSqlanywhere::IDriver},
|
12
|
+
lambda{Java::IanywhereMlJdbcodbcJdbc::IDriver},
|
13
|
+
lambda{Java::ComSybaseJdbc4Jdbc::Sybdriver},
|
14
|
+
lambda{Java::ComSybaseJdbc3Jdbc::Sybdriver}
|
15
15
|
].each do |class_proc|
|
16
16
|
begin
|
17
17
|
break class_proc.call
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::OrgSqlite::JDBC', :SQLite3)
|
4
4
|
require_relative '../shared/sqlite'
|
5
5
|
|
6
6
|
module Sequel
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
|
11
11
|
db.extend_datasets Sequel::SQLite::DatasetMethods
|
12
12
|
db.set_integer_booleans
|
13
|
-
|
13
|
+
Java::OrgSqlite::JDBC
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::JDBC.load_driver('
|
3
|
+
Sequel::JDBC.load_driver('Java::ComMicrosoftSqlserverJdbc::SQLServerDriver')
|
4
4
|
require_relative 'mssql'
|
5
5
|
|
6
6
|
module Sequel
|
@@ -10,7 +10,7 @@ module Sequel
|
|
10
10
|
db.extend(Sequel::JDBC::SQLServer::DatabaseMethods)
|
11
11
|
db.extend_datasets Sequel::MSSQL::DatasetMethods
|
12
12
|
db.send(:set_mssql_unicode_strings)
|
13
|
-
|
13
|
+
Java::ComMicrosoftSqlserverJdbc::SQLServerDriver
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
@@ -20,7 +20,7 @@ module Sequel
|
|
20
20
|
|
21
21
|
# Create custom NativeException alias for nicer access, and also so that
|
22
22
|
# JRuby 9.2+ so it doesn't use the deprecated ::NativeException
|
23
|
-
NativeException =
|
23
|
+
NativeException = Java::JavaLang::Exception
|
24
24
|
|
25
25
|
# Default database error classes
|
26
26
|
DATABASE_ERROR_CLASSES = [NativeException]
|
@@ -227,7 +227,7 @@ module Sequel
|
|
227
227
|
raise e unless driver
|
228
228
|
# If the DriverManager can't get the connection - use the connect
|
229
229
|
# method of the driver. (This happens under Tomcat for instance)
|
230
|
-
props =
|
230
|
+
props = Java::JavaUtil::Properties.new
|
231
231
|
if opts && opts[:user] && opts[:password]
|
232
232
|
props.setProperty("user", opts[:user])
|
233
233
|
props.setProperty("password", opts[:password])
|
@@ -506,7 +506,7 @@ module Sequel
|
|
506
506
|
# Gets the connection from JNDI.
|
507
507
|
def get_connection_from_jndi
|
508
508
|
jndi_name = JNDI_URI_REGEXP.match(uri)[1]
|
509
|
-
|
509
|
+
Java::JavaxNaming::InitialContext.new.lookup(jndi_name).connection
|
510
510
|
end
|
511
511
|
|
512
512
|
# Gets the JDBC connection uri from the JNDI resource.
|
@@ -530,19 +530,19 @@ module Sequel
|
|
530
530
|
|
531
531
|
# Support Date objects used in bound variables
|
532
532
|
def java_sql_date(date)
|
533
|
-
|
533
|
+
Java::JavaSql::Date.new(Time.local(date.year, date.month, date.day).to_i * 1000)
|
534
534
|
end
|
535
535
|
|
536
536
|
# Support DateTime objects used in bound variables
|
537
537
|
def java_sql_datetime(datetime)
|
538
|
-
ts =
|
538
|
+
ts = Java::JavaSql::Timestamp.new(Time.local(datetime.year, datetime.month, datetime.day, datetime.hour, datetime.min, datetime.sec).to_i * 1000)
|
539
539
|
ts.setNanos((datetime.sec_fraction * 1000000000).to_i)
|
540
540
|
ts
|
541
541
|
end
|
542
542
|
|
543
543
|
# Support fractional seconds for Time objects used in bound variables
|
544
544
|
def java_sql_timestamp(time)
|
545
|
-
ts =
|
545
|
+
ts = Java::JavaSql::Timestamp.new(time.to_i * 1000)
|
546
546
|
ts.setNanos(time.nsec)
|
547
547
|
ts
|
548
548
|
end
|
@@ -2430,6 +2430,9 @@ module Sequel
|
|
2430
2430
|
# Return the primary key to use for RETURNING in an INSERT statement
|
2431
2431
|
def insert_pk
|
2432
2432
|
(f = opts[:from]) && !f.empty? && (t = f.first)
|
2433
|
+
|
2434
|
+
t = t.call(self) if t.is_a? Sequel::SQL::DelayedEvaluation
|
2435
|
+
|
2433
2436
|
case t
|
2434
2437
|
when Symbol, String, SQL::Identifier, SQL::QualifiedIdentifier
|
2435
2438
|
if pk = db.primary_key(t)
|
@@ -109,6 +109,8 @@ module Sequel
|
|
109
109
|
# :database :: database name (filename or ':memory:' or file: URI)
|
110
110
|
# :readonly :: open database in read-only mode; useful for reading
|
111
111
|
# static data that you do not want to modify
|
112
|
+
# :disable_dqs :: disable double quoted strings in DDL and DML statements
|
113
|
+
# (requires SQLite 3.29.0+ and sqlite3 gem version 1.4.3+).
|
112
114
|
# :timeout :: how long to wait for the database to be available if it
|
113
115
|
# is locked, given in milliseconds (default is 5000)
|
114
116
|
# :setup_regexp_function :: enable use of Regexp objects with SQL
|
@@ -128,6 +130,8 @@ module Sequel
|
|
128
130
|
opts[:database] = ':memory:' if blank_object?(opts[:database])
|
129
131
|
sqlite3_opts = {}
|
130
132
|
sqlite3_opts[:readonly] = typecast_value_boolean(opts[:readonly]) if opts.has_key?(:readonly)
|
133
|
+
# SEQUEL6: Make strict: true the default behavior
|
134
|
+
sqlite3_opts[:strict] = typecast_value_boolean(opts[:disable_dqs]) if opts.has_key?(:disable_dqs)
|
131
135
|
db = ::SQLite3::Database.new(opts[:database].to_s, sqlite3_opts)
|
132
136
|
db.busy_timeout(typecast_value_integer(opts.fetch(:timeout, 5000)))
|
133
137
|
|
data/lib/sequel/database/misc.rb
CHANGED
@@ -26,6 +26,11 @@ module Sequel
|
|
26
26
|
:time=>Sequel::SQLTime, :boolean=>[TrueClass, FalseClass].freeze, :float=>Float, :decimal=>BigDecimal,
|
27
27
|
:blob=>Sequel::SQL::Blob}.freeze
|
28
28
|
|
29
|
+
# :nocov:
|
30
|
+
URI_PARSER = defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER
|
31
|
+
# :nocov:
|
32
|
+
private_constant :URI_PARSER
|
33
|
+
|
29
34
|
# Nested hook Proc; each new hook Proc just wraps the previous one.
|
30
35
|
@initialize_hook = proc{|db| }
|
31
36
|
|
@@ -85,7 +90,7 @@ module Sequel
|
|
85
90
|
def self.options_from_uri(uri)
|
86
91
|
uri_options = uri_to_options(uri)
|
87
92
|
uri.query.split('&').map{|s| s.split('=')}.each{|k,v| uri_options[k.to_sym] = v if k && !k.empty?} unless uri.query.to_s.strip.empty?
|
88
|
-
uri_options.to_a.each{|k,v| uri_options[k] =
|
93
|
+
uri_options.to_a.each{|k,v| uri_options[k] = URI_PARSER.unescape(v) if v.is_a?(String)}
|
89
94
|
uri_options
|
90
95
|
end
|
91
96
|
private_class_method :options_from_uri
|
@@ -27,6 +27,11 @@ Sequel.extension :eval_inspect
|
|
27
27
|
|
28
28
|
module Sequel
|
29
29
|
module SchemaDumper
|
30
|
+
# :nocov:
|
31
|
+
IGNORE_INDEX_ERRORS_KEY = RUBY_VERSION >= '3.4' ? 'ignore_index_errors: ' : ':ignore_index_errors=>'
|
32
|
+
# :nocov:
|
33
|
+
private_constant :IGNORE_INDEX_ERRORS_KEY
|
34
|
+
|
30
35
|
# Convert the column schema information to a hash of column options, one of which must
|
31
36
|
# be :type. The other options added should modify that type (e.g. :size). If a
|
32
37
|
# database type is not recognized, return it as a String type.
|
@@ -161,7 +166,7 @@ END_MIG
|
|
161
166
|
def dump_table_schema(table, options=OPTS)
|
162
167
|
gen = dump_table_generator(table, options)
|
163
168
|
commands = [gen.dump_columns, gen.dump_constraints, gen.dump_indexes].reject{|x| x == ''}.join("\n\n")
|
164
|
-
"create_table(#{table.inspect}#{
|
169
|
+
"create_table(#{table.inspect}#{", #{IGNORE_INDEX_ERRORS_KEY}true" if !options[:same_db] && options[:indexes] != false && !gen.indexes.empty?}) do\n#{commands.gsub(/^/, ' ')}\nend"
|
165
170
|
end
|
166
171
|
|
167
172
|
private
|
@@ -425,6 +430,13 @@ END_MIG
|
|
425
430
|
|
426
431
|
module Schema
|
427
432
|
class CreateTableGenerator
|
433
|
+
# :nocov:
|
434
|
+
DEFAULT_KEY = RUBY_VERSION >= '3.4' ? 'default: ' : ':default=>'
|
435
|
+
IGNORE_ERRORS_KEY = RUBY_VERSION >= '3.4' ? 'ignore_errors: ' : ':ignore_errors=>'
|
436
|
+
# :nocov:
|
437
|
+
private_constant :DEFAULT_KEY
|
438
|
+
private_constant :IGNORE_ERRORS_KEY
|
439
|
+
|
428
440
|
# Dump this generator's columns to a string that could be evaled inside
|
429
441
|
# another instance to represent the same columns
|
430
442
|
def dump_columns
|
@@ -508,7 +520,7 @@ END_MIG
|
|
508
520
|
c = c.dup
|
509
521
|
cols = c.delete(:columns)
|
510
522
|
if table = options[:add_index] || options[:drop_index]
|
511
|
-
"#{options[:drop_index] ? 'drop' : 'add'}_index #{table.inspect}, #{cols.inspect}#{
|
523
|
+
"#{options[:drop_index] ? 'drop' : 'add'}_index #{table.inspect}, #{cols.inspect}#{", #{IGNORE_ERRORS_KEY}true" if options[:ignore_errors]}#{opts_inspect(c)}"
|
512
524
|
else
|
513
525
|
"index #{cols.inspect}#{opts_inspect(c)}"
|
514
526
|
end
|
@@ -526,7 +538,7 @@ END_MIG
|
|
526
538
|
if opts[:default]
|
527
539
|
opts = opts.dup
|
528
540
|
de = Sequel.eval_inspect(opts.delete(:default))
|
529
|
-
",
|
541
|
+
", #{DEFAULT_KEY}#{de}#{", #{opts.inspect[1...-1]}" if opts.length > 0}"
|
530
542
|
else
|
531
543
|
", #{opts.inspect[1...-1]}" if opts.length > 0
|
532
544
|
end
|
@@ -3,18 +3,31 @@
|
|
3
3
|
module Sequel
|
4
4
|
module Plugins
|
5
5
|
# The subset_conditions plugin creates an additional *_conditions method
|
6
|
-
# for every subset
|
7
|
-
#
|
8
|
-
# filter or combine them with OR.
|
6
|
+
# for every `subset`, `where`, and `exclude` method call in a dataset_module
|
7
|
+
# block. This method returns the filter conditions, which can be useful if
|
8
|
+
# you want to use the conditions for a separate filter or combine them with OR.
|
9
|
+
# It also supports where_all and where_any dataset_module methods for
|
10
|
+
# combining multiple dataset method filters with AND or OR.
|
9
11
|
#
|
10
12
|
# Usage:
|
11
13
|
#
|
12
14
|
# # Add subset_conditions in the Album class
|
13
15
|
# Album.plugin :subset_conditions
|
14
16
|
#
|
15
|
-
# # This will now create a published_conditions method
|
16
17
|
# Album.dataset_module do
|
17
|
-
#
|
18
|
+
# # This will now create a published_conditions method
|
19
|
+
# where :published, published: true
|
20
|
+
#
|
21
|
+
# # This will now create a not_bad_conditions method
|
22
|
+
# exclude :not_bad, :bad
|
23
|
+
#
|
24
|
+
# # This will create good_and_available and
|
25
|
+
# # good_and_available_conditions methods
|
26
|
+
# where_all :good_and_available, :published, :not_bad
|
27
|
+
#
|
28
|
+
# # This will create good_or_available and
|
29
|
+
# # good_or_available_conditions methods
|
30
|
+
# where_any :good_or_available, :published, :not_bad
|
18
31
|
# end
|
19
32
|
#
|
20
33
|
# Album.where(Album.published_conditions).sql
|
@@ -25,6 +38,12 @@ module Sequel
|
|
25
38
|
#
|
26
39
|
# Album.where(Album.published_conditions | {ready: true}).sql
|
27
40
|
# # SELECT * FROM albums WHERE ((published IS TRUE) OR (ready IS TRUE))
|
41
|
+
#
|
42
|
+
# Album.good_and_available.sql
|
43
|
+
# SELECT * FROM albums WHERE ((published IS TRUE) AND NOT bad)
|
44
|
+
#
|
45
|
+
# Album.good_or_available.sql
|
46
|
+
# SELECT * FROM albums WHERE ((published IS TRUE) OR NOT bad)
|
28
47
|
module SubsetConditions
|
29
48
|
def self.apply(model, &block)
|
30
49
|
model.instance_exec do
|
@@ -42,6 +61,66 @@ module Sequel
|
|
42
61
|
cond = cond.first if cond.size == 1
|
43
62
|
define_method(:"#{name}_conditions"){filter_expr(cond, &block)}
|
44
63
|
end
|
64
|
+
|
65
|
+
# Also create a method that returns the conditions the filter uses.
|
66
|
+
def exclude(name, *args, &block)
|
67
|
+
super
|
68
|
+
cond = args
|
69
|
+
cond = cond.first if cond.size == 1
|
70
|
+
define_method(:"#{name}_conditions"){Sequel.~(filter_expr(cond, &block))}
|
71
|
+
end
|
72
|
+
|
73
|
+
# Create a method that combines filters from already registered
|
74
|
+
# dataset methods, and filters for rows where all of the conditions
|
75
|
+
# are satisfied.
|
76
|
+
#
|
77
|
+
# Employee.dataset_module do
|
78
|
+
# where :active, active: true
|
79
|
+
# where :started, Sequel::CURRENT_DATE <= :start_date
|
80
|
+
# where_all(:active_and_started, :active, :started)
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# Employee.active_and_started.sql
|
84
|
+
# # SELECT * FROM employees WHERE ((active IS TRUE) AND (CURRENT_DATE <= start_date))
|
85
|
+
def where_all(name, *args)
|
86
|
+
_where_any_all(:&, name, args)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Create a method that combines filters from already registered
|
90
|
+
# dataset methods, and filters for rows where any of the conditions
|
91
|
+
# are satisfied.
|
92
|
+
#
|
93
|
+
# Employee.dataset_module do
|
94
|
+
# where :active, active: true
|
95
|
+
# where :started, Sequel::CURRENT_DATE <= :start_date
|
96
|
+
# where_any(:active_or_started, :active, :started)
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# Employee.active_or_started.sql
|
100
|
+
# # SELECT * FROM employees WHERE ((active IS TRUE) OR (CURRENT_DATE <= start_date))
|
101
|
+
def where_any(name, *args)
|
102
|
+
_where_any_all(:|, name, args)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
if RUBY_VERSION >= '2'
|
108
|
+
# Backbone of #where_any and #where_all
|
109
|
+
def _where_any_all(meth, name, args)
|
110
|
+
ds = model.dataset
|
111
|
+
# #bind used here because the dataset module may not yet be included in the model's dataset
|
112
|
+
where(name, Sequel.send(meth, *args.map{|a| self.instance_method(:"#{a}_conditions").bind(ds).call}))
|
113
|
+
end
|
114
|
+
else
|
115
|
+
# Cannot bind module method to arbitrary objects in Ruby 1.9.
|
116
|
+
# :nocov:
|
117
|
+
def _where_any_all(meth, name, args)
|
118
|
+
ds = model.dataset.clone
|
119
|
+
ds.extend(self)
|
120
|
+
where(name, Sequel.send(meth, *args.map{|a| ds.send(:"#{a}_conditions")}))
|
121
|
+
end
|
122
|
+
# :nocov:
|
123
|
+
end
|
45
124
|
end
|
46
125
|
end
|
47
126
|
end
|
data/lib/sequel/version.rb
CHANGED
@@ -6,7 +6,7 @@ module Sequel
|
|
6
6
|
|
7
7
|
# The minor version of Sequel. Bumped for every non-patch level
|
8
8
|
# release, generally around once a month.
|
9
|
-
MINOR =
|
9
|
+
MINOR = 86
|
10
10
|
|
11
11
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
12
12
|
# releases that fix regressions from previous versions.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.86.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bigdecimal
|