sequel 4.11.0 → 4.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +32 -0
- data/Rakefile +1 -5
- data/doc/opening_databases.rdoc +5 -1
- data/doc/release_notes/4.12.0.txt +105 -0
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/oracle.rb +1 -0
- data/lib/sequel/adapters/postgres.rb +17 -8
- data/lib/sequel/adapters/shared/cubrid.rb +2 -1
- data/lib/sequel/adapters/shared/db2.rb +1 -0
- data/lib/sequel/adapters/shared/mssql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +23 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -0
- data/lib/sequel/adapters/sqlite.rb +11 -5
- data/lib/sequel/database/query.rb +14 -1
- data/lib/sequel/dataset/prepared_statements.rb +2 -1
- data/lib/sequel/dataset/query.rb +48 -37
- data/lib/sequel/dataset/sql.rb +0 -39
- data/lib/sequel/extensions/pg_interval.rb +1 -1
- data/lib/sequel/extensions/pg_static_cache_updater.rb +11 -5
- data/lib/sequel/model/associations.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +16 -4
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +72 -59
- data/lib/sequel/plugins/prepared_statements.rb +16 -5
- data/lib/sequel/plugins/prepared_statements_associations.rb +14 -0
- data/lib/sequel/sql.rb +2 -43
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +49 -20
- data/spec/bin_spec.rb +2 -2
- data/spec/core/dataset_spec.rb +18 -6
- data/spec/core/schema_spec.rb +2 -1
- data/spec/extensions/auto_validations_spec.rb +23 -2
- data/spec/extensions/nested_attributes_spec.rb +32 -1
- data/spec/extensions/pg_static_cache_updater_spec.rb +12 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +17 -17
- data/spec/extensions/prepared_statements_spec.rb +11 -8
- data/spec/integration/plugin_test.rb +43 -0
- data/spec/integration/schema_test.rb +7 -0
- data/spec/model/eager_loading_spec.rb +9 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b15d571f0ccc175749541cfee443b953dcd145fd
|
4
|
+
data.tar.gz: 9dec9dd2f6816432f511c0153737646e44da31a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec94d8b6fcd34fecdb4d4c3cc4f2b4fb0277c8d7289baebde098b8b84cc99ab0bfd0ab28effa316df0a0fbba1a7bf2cc3bc0fbbfc682e68f6d50326652719306
|
7
|
+
data.tar.gz: 919e8651ded7808d66e95788af7993c4b13136487bed14b6e12db2150bca22ab166eef6e0eeb5350b2e2aebdb6f72c36f47ef7dfaef4e3eea2170c396f15f02c
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
=== 4.12.0 (2014-07-01)
|
2
|
+
|
3
|
+
* Support :readonly Database option in sqlite adapter (ippeiukai, jeremyevans) (#832)
|
4
|
+
|
5
|
+
* Automatically setup max_length validations for string columns in the auto_validations plugin (jeremyevans)
|
6
|
+
|
7
|
+
* Add :max_length entry to column schema hashes for string types (jeremyevans)
|
8
|
+
|
9
|
+
* Add :before_thread_exit option to Database#listen_for_static_cache_updates in pg_static_cache_updater extension (jeremyevans)
|
10
|
+
|
11
|
+
* Add Database#values on PostgreSQL to create a dataset that uses VALUES instead of SELECT (jeremyevans)
|
12
|
+
|
13
|
+
* Add Model#set_nested_attributes to nested_attributes, allowing setting nested attributes options per-call (jeremyevans)
|
14
|
+
|
15
|
+
* Use explicit columns when using automatically prepared SELECT statements in the prepared statement plugins (jeremyevans)
|
16
|
+
|
17
|
+
* Make Dataset#insert_select on PostgreSQL respect existing RETURNING clause (jeremyevans)
|
18
|
+
|
19
|
+
* Fix eager loading limited associations via a UNION when an association block is used (jeremyevans)
|
20
|
+
|
21
|
+
* Associate reciprocal object before saving associated object when creating new objects in nested_attributes (chanks, jeremyevans) (#831)
|
22
|
+
|
23
|
+
* Handle intervals containing more than 100 hours in the pg_interval extension's parser (will) (#827)
|
24
|
+
|
25
|
+
* Remove methods/class deprecated in 4.11.0 (jeremyevans)
|
26
|
+
|
27
|
+
* Allow Dataset#natural_join/cross_join and related methods to take a options hash passed to join_table (jeremyevans)
|
28
|
+
|
29
|
+
* Add :reset_implicit_qualifier option to Dataset#join_table, to set false to not reset the implicit qualifier (jeremyevans)
|
30
|
+
|
31
|
+
* Support :notice_receiver Database option when postgres adapter is used with pg driver (jeltz, jeremyevans) (#825)
|
32
|
+
|
1
33
|
=== 4.11.0 (2014-06-03)
|
2
34
|
|
3
35
|
* Add :model_map option to class_table_inheritance plugin so class names don't need to be stored in the database (jeremyevans)
|
data/Rakefile
CHANGED
@@ -33,10 +33,6 @@ RDOC_DEFAULT_OPTS = ["--line-numbers", "--inline-source", '--title', 'Sequel: Th
|
|
33
33
|
|
34
34
|
begin
|
35
35
|
# Sequel uses hanna-nouveau for the website RDoc.
|
36
|
-
# Due to bugs in older versions of RDoc, and the
|
37
|
-
# fact that hanna-nouveau does not support RDoc 4,
|
38
|
-
# a specific version of rdoc is required.
|
39
|
-
gem 'rdoc', '= 3.12.2'
|
40
36
|
gem 'hanna-nouveau'
|
41
37
|
RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
|
42
38
|
rescue Gem::LoadError
|
@@ -68,7 +64,7 @@ if rdoc_task_class
|
|
68
64
|
rdoc_task_class.new(:website_rdoc_main) do |rdoc|
|
69
65
|
rdoc.rdoc_dir = "www/public/rdoc"
|
70
66
|
rdoc.options += RDOC_OPTS + %w'--no-ignore-invalid'
|
71
|
-
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/*.rb lib/sequel/*.rb lib/sequel/{connection_pool,dataset,database,model}/*.rb doc/*.rdoc doc/release_notes/*.txt lib/sequel/extensions/migration.rb
|
67
|
+
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/*.rb lib/sequel/*.rb lib/sequel/{connection_pool,dataset,database,model}/*.rb doc/*.rdoc doc/release_notes/*.txt lib/sequel/extensions/migration.rb"
|
72
68
|
end
|
73
69
|
|
74
70
|
rdoc_task_class.new(:website_rdoc_adapters) do |rdoc|
|
data/doc/opening_databases.rdoc
CHANGED
@@ -373,9 +373,12 @@ The following additional options are supported:
|
|
373
373
|
conversion is done, so an error is raised if you attempt to retrieve an infinite
|
374
374
|
timestamp/date. You can set this to :nil to convert to nil, :string to leave
|
375
375
|
as a string, or :float to convert to an infinite float.
|
376
|
-
:encoding :: Set the client_encoding to the given string
|
377
376
|
:connect_timeout :: Set the number of seconds to wait for a connection (default 20, only respected
|
378
377
|
if using the pg library).
|
378
|
+
:encoding :: Set the client_encoding to the given string
|
379
|
+
:notice_receiver :: A proc that be called with the PGresult objects that have notice or warning messages.
|
380
|
+
The default notice receiver just prints the messages to stderr, but this can be used
|
381
|
+
to handle notice/warning messages differently. Only respected if using the pg library).
|
379
382
|
:sslmode :: Set to 'disable', 'allow', 'prefer', 'require' to choose how to treat SSL (only
|
380
383
|
respected if using the pg library)
|
381
384
|
:use_iso_date_format :: This can be set to false to not force the ISO date format. Sequel forces
|
@@ -417,6 +420,7 @@ Examples:
|
|
417
420
|
|
418
421
|
The following additional options are supported:
|
419
422
|
|
423
|
+
:readonly :: open database in read-only mode
|
420
424
|
:timeout :: the busy timeout to use in milliseconds (default: 5000).
|
421
425
|
|
422
426
|
=== swift
|
@@ -0,0 +1,105 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Database#schema now includes :max_length entries for string
|
4
|
+
columns, specifying the size of the string field. The
|
5
|
+
auto_validations plugin now uses this information to
|
6
|
+
automatically set up max_length validations on those fields.
|
7
|
+
|
8
|
+
* The Dataset join methods now support a :reset_implicit_qualifier
|
9
|
+
option. If set to false, this makes the join not reset the
|
10
|
+
implicit qualifier, so that the next join will not consider this
|
11
|
+
table as the last table joined. Example:
|
12
|
+
|
13
|
+
DB[:a].join(:b, :c=>:d).
|
14
|
+
join(:e, :f=>:g)
|
15
|
+
# SELECT * FROM a
|
16
|
+
# INNER JOIN b ON (b.c = a.d)
|
17
|
+
# INNER JOIN e ON (e.f = b.g)
|
18
|
+
|
19
|
+
DB[:a].join(:b, {:c=>:d}, :reset_implicit_qualifier=>false).
|
20
|
+
join(:e, :f=>:g)
|
21
|
+
# SELECT * FROM a
|
22
|
+
# INNER JOIN b ON (b.c = a.d)
|
23
|
+
# INNER JOIN e ON (e.f = a.g)
|
24
|
+
|
25
|
+
* The Dataset cross and natural join methods now accept an options
|
26
|
+
hash. Example:
|
27
|
+
|
28
|
+
DB[:a].cross_join(:b, :table_alias=>:c)
|
29
|
+
# SELECT * FROM a CROSS JOIN b AS c
|
30
|
+
|
31
|
+
* Model#set_nested_attributes has been added to the nested_attributes
|
32
|
+
plugin, which allows you to to set the nested_attributes options to
|
33
|
+
use per-call. This is very helpful if you have multiple forms that
|
34
|
+
handle associated objects, but with different input fields used
|
35
|
+
for the associated objects depending on the form. Example:
|
36
|
+
|
37
|
+
album.set_nested_attributes(:tracks,
|
38
|
+
params[:track_attributes],
|
39
|
+
:fields=>[:a, :b, :c])
|
40
|
+
|
41
|
+
* Database#values has been added on PostgreSQL, which creates a
|
42
|
+
dataset that uses VALUES instead of SELECT. Just as PostgreSQL
|
43
|
+
allows, you can also use orders, limits, and offsets with this
|
44
|
+
dataset.
|
45
|
+
|
46
|
+
* A :notice_receiver option is now supported in the postgres adapter
|
47
|
+
if the pg driver is used. This should be a proc, which will be
|
48
|
+
passed to the pg connection's set_notice_receiver method.
|
49
|
+
|
50
|
+
* A Database :readonly option is now supported in the sqlite adapter,
|
51
|
+
which opens the database in a read-only mode, causing an error
|
52
|
+
if a query is issued that would modify the database.
|
53
|
+
|
54
|
+
* A :before_thread_exit option has been added to
|
55
|
+
Database#listen_for_static_cache_updates in the
|
56
|
+
pg_static_cache_updater extension, allowing you to run code before
|
57
|
+
the created thread exits.
|
58
|
+
|
59
|
+
= Other Improvements
|
60
|
+
|
61
|
+
* Eager loading limited associations using a UNION now works
|
62
|
+
correctly when an association block is used. This fixes a
|
63
|
+
regression that first occurred in 4.10.0, when the union
|
64
|
+
eager loader became the default eager loader.
|
65
|
+
|
66
|
+
* When creating a new associated object in the nested_attributes
|
67
|
+
plugin, where the reciprocal association is a many_to_one
|
68
|
+
association, set the cached reciprocal object in the new
|
69
|
+
associated object before saving it.
|
70
|
+
|
71
|
+
This fixes issues when validations in the associated object
|
72
|
+
require access to the current object, which may not yet be
|
73
|
+
saved in the database.
|
74
|
+
|
75
|
+
* The prepared_statements and prepared_statements_associations
|
76
|
+
plugins now automatically use explicit column references when
|
77
|
+
preparing statements. This fixes issues on PostgreSQL when a
|
78
|
+
column is added to a table while a prepared statement exists
|
79
|
+
that selects * from the table. Previously, all further attempts
|
80
|
+
to use the prepared statement will fail.
|
81
|
+
|
82
|
+
This allows you to run migrations that add columns to tables
|
83
|
+
while concurrently running an application that uses the
|
84
|
+
prepared statements plugins. Note that many other schema
|
85
|
+
modifications can cause issues when running migrations
|
86
|
+
while concurrently running an application, but most of those
|
87
|
+
are not specific to usage of prepared statements.
|
88
|
+
|
89
|
+
* Dataset#insert_select on PostgreSQL now respects an existing
|
90
|
+
RETURNING clause, and won't override it to use RETURNING *.
|
91
|
+
|
92
|
+
A similar fix was applied to the generalized prepared statements
|
93
|
+
support as well.
|
94
|
+
|
95
|
+
* The interval parser in the pg_interval extension now supports
|
96
|
+
intervals with 2-10 digits for hours. Previously, it only
|
97
|
+
supported using 2 digits for hours.
|
98
|
+
|
99
|
+
= Backwards Compatibility
|
100
|
+
|
101
|
+
* The methods and classes deprecated in 4.11.0 have been removed.
|
102
|
+
|
103
|
+
* The nested_attributes internal API has changed significantly. If
|
104
|
+
you were calling any private nested_attributes methods, you'll
|
105
|
+
probably need to update your code.
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
@@ -729,6 +729,7 @@ module Sequel
|
|
729
729
|
metadata(:getColumns, nil, schema, table, nil) do |h|
|
730
730
|
next if schema_parse_table_skip?(h, schema)
|
731
731
|
s = {:type=>schema_column_type(h[:type_name]), :db_type=>h[:type_name], :default=>(h[:column_def] == '' ? nil : h[:column_def]), :allow_null=>(h[:nullable] != 0), :primary_key=>pks.include?(h[:column_name]), :column_size=>h[:column_size], :scale=>h[:decimal_digits]}
|
732
|
+
s[:max_length] = s[:column_size] if s[:type] == :string
|
732
733
|
if s[:db_type] =~ DECIMAL_TYPE_RE && s[:scale] == 0
|
733
734
|
s[:type] = :integer
|
734
735
|
end
|
@@ -198,12 +198,13 @@ module Sequel
|
|
198
198
|
# Connects to the database. In addition to the standard database
|
199
199
|
# options, using the :encoding or :charset option changes the
|
200
200
|
# client encoding for the connection, :connect_timeout is a
|
201
|
-
# connection timeout in seconds,
|
202
|
-
# sslmode
|
203
|
-
#
|
201
|
+
# connection timeout in seconds, :sslmode sets whether postgres's
|
202
|
+
# sslmode, and :notice_receiver handles server notices in a proc.
|
203
|
+
# :connect_timeout, :ssl_mode, and :notice_receiver are only supported
|
204
|
+
# if the pg driver is used.
|
204
205
|
def connect(server)
|
205
206
|
opts = server_opts(server)
|
206
|
-
|
207
|
+
if SEQUEL_POSTGRES_USES_PG
|
207
208
|
connection_params = {
|
208
209
|
:host => opts[:host],
|
209
210
|
:port => opts[:port] || 5432,
|
@@ -213,9 +214,15 @@ module Sequel
|
|
213
214
|
:connect_timeout => opts[:connect_timeout] || 20,
|
214
215
|
:sslmode => opts[:sslmode]
|
215
216
|
}.delete_if { |key, value| blank_object?(value) }
|
216
|
-
Adapter.connect(connection_params)
|
217
|
+
conn = Adapter.connect(connection_params)
|
218
|
+
|
219
|
+
conn.instance_variable_set(:@prepared_statements, {})
|
220
|
+
|
221
|
+
if receiver = opts[:notice_receiver]
|
222
|
+
conn.set_notice_receiver(&receiver)
|
223
|
+
end
|
217
224
|
else
|
218
|
-
Adapter.connect(
|
225
|
+
conn = Adapter.connect(
|
219
226
|
(opts[:host] unless blank_object?(opts[:host])),
|
220
227
|
opts[:port] || 5432,
|
221
228
|
nil, '',
|
@@ -224,6 +231,9 @@ module Sequel
|
|
224
231
|
opts[:password]
|
225
232
|
)
|
226
233
|
end
|
234
|
+
|
235
|
+
conn.instance_variable_set(:@db, self)
|
236
|
+
|
227
237
|
if encoding = opts[:encoding] || opts[:charset]
|
228
238
|
if conn.respond_to?(:set_client_encoding)
|
229
239
|
conn.set_client_encoding(encoding)
|
@@ -231,8 +241,7 @@ module Sequel
|
|
231
241
|
conn.async_exec("set client_encoding to '#{encoding}'")
|
232
242
|
end
|
233
243
|
end
|
234
|
-
|
235
|
-
conn.instance_variable_set(:@prepared_statements, {}) if SEQUEL_POSTGRES_USES_PG
|
244
|
+
|
236
245
|
connection_configuration_sqls.each{|sql| conn.execute(sql)}
|
237
246
|
conn
|
238
247
|
end
|
@@ -51,12 +51,13 @@ module Sequel
|
|
51
51
|
from(:db_attribute).
|
52
52
|
where(:class_name=>m2.call(table_name)).
|
53
53
|
order(:def_order).
|
54
|
-
select(:attr_name, :data_type___db_type, :default_value___default, :is_nullable___allow_null).
|
54
|
+
select(:attr_name, :data_type___db_type, :default_value___default, :is_nullable___allow_null, :prec).
|
55
55
|
map do |row|
|
56
56
|
name = m.call(row.delete(:attr_name))
|
57
57
|
row[:allow_null] = row[:allow_null] == 'YES'
|
58
58
|
row[:primary_key] = pks.include?(name)
|
59
59
|
row[:type] = schema_column_type(row[:db_type])
|
60
|
+
row[:max_length] = row[:prec] if row[:type] == :string
|
60
61
|
[name, row]
|
61
62
|
end
|
62
63
|
end
|
@@ -42,6 +42,7 @@ module Sequel
|
|
42
42
|
column[:allow_null] = column.delete(:nulls) == 'Y'
|
43
43
|
column[:primary_key] = column.delete(:identity) == 'Y' || !column[:keyseq].nil?
|
44
44
|
column[:type] = schema_column_type(column[:db_type])
|
45
|
+
column[:max_length] = column[:longlength] if column[:type] == :string
|
45
46
|
[ m.call(column.delete(:name)), column]
|
46
47
|
end
|
47
48
|
end
|
@@ -524,6 +524,17 @@ module Sequel
|
|
524
524
|
@supported_types.fetch(type){@supported_types[type] = (from(:pg_type).filter(:typtype=>'b', :typname=>type.to_s).count > 0)}
|
525
525
|
end
|
526
526
|
|
527
|
+
# Creates a dataset that uses the VALUES clause:
|
528
|
+
#
|
529
|
+
# DB.values([[1, 2], [3, 4]])
|
530
|
+
# VALUES ((1, 2), (3, 4))
|
531
|
+
#
|
532
|
+
# DB.values([[1, 2], [3, 4]]).order(:column2).limit(1, 1)
|
533
|
+
# VALUES ((1, 2), (3, 4)) ORDER BY column2 LIMIT 1 OFFSET 1
|
534
|
+
def values(v)
|
535
|
+
@default_dataset.clone(:values=>v)
|
536
|
+
end
|
537
|
+
|
527
538
|
# Array of symbols specifying view names in the current database.
|
528
539
|
#
|
529
540
|
# Options:
|
@@ -1147,12 +1158,13 @@ module Sequel
|
|
1147
1158
|
CRLF = "\r\n".freeze
|
1148
1159
|
BLOB_RE = /[\000-\037\047\134\177-\377]/n.freeze
|
1149
1160
|
WINDOW = " WINDOW ".freeze
|
1161
|
+
SELECT_VALUES = "VALUES ".freeze
|
1150
1162
|
EMPTY_STRING = ''.freeze
|
1151
1163
|
LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each{|s| s.freeze}
|
1152
1164
|
|
1153
1165
|
Dataset.def_sql_method(self, :delete, [['if server_version >= 90100', %w'with delete from using where returning'], ['else', %w'delete from using where returning']])
|
1154
1166
|
Dataset.def_sql_method(self, :insert, [['if server_version >= 90100', %w'with insert into columns values returning'], ['else', %w'insert into columns values returning']])
|
1155
|
-
Dataset.def_sql_method(self, :select, [['if server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
|
1167
|
+
Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'values order limit'], ['elsif server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
|
1156
1168
|
Dataset.def_sql_method(self, :update, [['if server_version >= 90100', %w'with update table set from where returning'], ['else', %w'update table set from where returning']])
|
1157
1169
|
|
1158
1170
|
# Shared methods for prepared statements when used with PostgreSQL databases.
|
@@ -1285,7 +1297,10 @@ module Sequel
|
|
1285
1297
|
# Insert a record returning the record inserted. Always returns nil without
|
1286
1298
|
# inserting a query if disable_insert_returning is used.
|
1287
1299
|
def insert_select(*values)
|
1288
|
-
|
1300
|
+
unless @opts[:disable_insert_returning]
|
1301
|
+
ds = opts[:returning] ? self : returning
|
1302
|
+
ds.insert(*values){|r| return r}
|
1303
|
+
end
|
1289
1304
|
end
|
1290
1305
|
|
1291
1306
|
# Locks all tables in the dataset's FROM clause (but not in JOINs) with
|
@@ -1510,6 +1525,12 @@ module Sequel
|
|
1510
1525
|
@opts[:lock] == :share ? (sql << FOR_SHARE) : super
|
1511
1526
|
end
|
1512
1527
|
|
1528
|
+
# Support VALUES clause instead of the SELECT clause to return rows.
|
1529
|
+
def select_values_sql(sql)
|
1530
|
+
sql << SELECT_VALUES
|
1531
|
+
expression_list_append(sql, opts[:values])
|
1532
|
+
end
|
1533
|
+
|
1513
1534
|
# SQL fragment for named window specifications
|
1514
1535
|
def select_window_sql(sql)
|
1515
1536
|
if ws = @opts[:window]
|
@@ -91,14 +91,20 @@ module Sequel
|
|
91
91
|
# The conversion procs to use for this database
|
92
92
|
attr_reader :conversion_procs
|
93
93
|
|
94
|
-
# Connect to the database.
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
94
|
+
# Connect to the database. Since SQLite is a file based database,
|
95
|
+
# available options are limited:
|
96
|
+
#
|
97
|
+
# :database :: database name (filename or ':memory:' or file: URI)
|
98
|
+
# :readonly :: open database in read-only mode; useful for reading
|
99
|
+
# static data that you do not want to modify
|
100
|
+
# :timeout :: how long to wait for the database to be available if it
|
101
|
+
# is locked, given in milliseconds (default is 5000)
|
98
102
|
def connect(server)
|
99
103
|
opts = server_opts(server)
|
100
104
|
opts[:database] = ':memory:' if blank_object?(opts[:database])
|
101
|
-
|
105
|
+
sqlite3_opts = {}
|
106
|
+
sqlite3_opts[:readonly] = typecast_value_boolean(opts[:readonly]) if opts.has_key?(:readonly)
|
107
|
+
db = ::SQLite3::Database.new(opts[:database].to_s, sqlite3_opts)
|
102
108
|
db.busy_timeout(opts.fetch(:timeout, 5000))
|
103
109
|
|
104
110
|
connection_pragmas.each{|s| log_yield(s){db.execute_batch(s)}}
|
@@ -157,7 +157,12 @@ module Sequel
|
|
157
157
|
|
158
158
|
cols = schema_parse_table(table_name, opts)
|
159
159
|
raise(Error, 'schema parsing returned no columns, table probably doesn\'t exist') if cols.nil? || cols.empty?
|
160
|
-
cols.each
|
160
|
+
cols.each do |_,c|
|
161
|
+
c[:ruby_default] = column_schema_to_ruby_default(c[:default], c[:type])
|
162
|
+
if !c[:max_length] && c[:type] == :string && (max_length = column_schema_max_length(c[:db_type]))
|
163
|
+
c[:max_length] = max_length
|
164
|
+
end
|
165
|
+
end
|
161
166
|
Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
|
162
167
|
cols
|
163
168
|
end
|
@@ -251,6 +256,14 @@ module Sequel
|
|
251
256
|
column_schema_default_to_ruby_value(default, type) rescue nil
|
252
257
|
end
|
253
258
|
|
259
|
+
# Look at the db_type and guess the maximum length of the column.
|
260
|
+
# This assumes types such as varchar(255).
|
261
|
+
def column_schema_max_length(db_type)
|
262
|
+
if db_type =~ /\((\d+)\)/
|
263
|
+
$1.to_i
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
254
267
|
# Return a Method object for the dataset's output_identifier_method.
|
255
268
|
# Used in metadata parsing to make sure the returned information is in the
|
256
269
|
# correct format.
|
@@ -86,7 +86,8 @@ module Sequel
|
|
86
86
|
when :first
|
87
87
|
clone(:limit=>1).select_sql
|
88
88
|
when :insert_select
|
89
|
-
returning
|
89
|
+
ds = opts[:returning] ? self : returning
|
90
|
+
ds.insert_sql(*@prepared_modify_values)
|
90
91
|
when :insert
|
91
92
|
insert_sql(*@prepared_modify_values)
|
92
93
|
when :update
|
data/lib/sequel/dataset/query.rb
CHANGED
@@ -23,10 +23,9 @@ module Sequel
|
|
23
23
|
# block from the method call.
|
24
24
|
CONDITIONED_JOIN_TYPES = [:inner, :full_outer, :right_outer, :left_outer, :full, :right, :left]
|
25
25
|
|
26
|
-
# These symbols have _join methods created (e.g. natural_join)
|
27
|
-
#
|
28
|
-
#
|
29
|
-
# if called with a block.
|
26
|
+
# These symbols have _join methods created (e.g. natural_join).
|
27
|
+
# They accept a table argument and options hash which is passed to join_table,
|
28
|
+
# and they raise an error if called with a block.
|
30
29
|
UNCONDITIONED_JOIN_TYPES = [:natural, :natural_left, :natural_right, :natural_full, :cross]
|
31
30
|
|
32
31
|
# All methods that return modified datasets with a joined table added.
|
@@ -387,37 +386,42 @@ module Sequel
|
|
387
386
|
#
|
388
387
|
# Takes the following arguments:
|
389
388
|
#
|
390
|
-
#
|
391
|
-
#
|
392
|
-
#
|
393
|
-
#
|
394
|
-
#
|
395
|
-
#
|
396
|
-
#
|
397
|
-
#
|
398
|
-
#
|
399
|
-
#
|
400
|
-
#
|
401
|
-
#
|
402
|
-
#
|
403
|
-
#
|
404
|
-
#
|
405
|
-
#
|
406
|
-
#
|
407
|
-
#
|
408
|
-
#
|
409
|
-
#
|
410
|
-
#
|
411
|
-
#
|
412
|
-
#
|
413
|
-
#
|
414
|
-
#
|
415
|
-
#
|
416
|
-
#
|
417
|
-
#
|
418
|
-
#
|
419
|
-
#
|
420
|
-
#
|
389
|
+
# type :: The type of join to do (e.g. :inner)
|
390
|
+
# table :: table to join into the current dataset. Generally one of the following types:
|
391
|
+
# String, Symbol :: identifier used as table or view name
|
392
|
+
# Dataset :: a subselect is performed with an alias of tN for some value of N
|
393
|
+
# SQL::Function :: set returning function
|
394
|
+
# SQL::AliasedExpression :: already aliased expression. Uses given alias unless
|
395
|
+
# overridden by the :table_alias option.
|
396
|
+
# expr :: conditions used when joining, depends on type:
|
397
|
+
# Hash, Array of pairs :: Assumes key (1st arg) is column of joined table (unless already
|
398
|
+
# qualified), and value (2nd arg) is column of the last joined or
|
399
|
+
# primary table (or the :implicit_qualifier option).
|
400
|
+
# To specify multiple conditions on a single joined table column,
|
401
|
+
# you must use an array. Uses a JOIN with an ON clause.
|
402
|
+
# Array :: If all members of the array are symbols, considers them as columns and
|
403
|
+
# uses a JOIN with a USING clause. Most databases will remove duplicate columns from
|
404
|
+
# the result set if this is used.
|
405
|
+
# nil :: If a block is not given, doesn't use ON or USING, so the JOIN should be a NATURAL
|
406
|
+
# or CROSS join. If a block is given, uses an ON clause based on the block, see below.
|
407
|
+
# otherwise :: Treats the argument as a filter expression, so strings are considered literal, symbols
|
408
|
+
# specify boolean columns, and Sequel expressions can be used. Uses a JOIN with an ON clause.
|
409
|
+
# options :: a hash of options, with the following keys supported:
|
410
|
+
# :table_alias :: Override the table alias used when joining. In general you shouldn't use this
|
411
|
+
# option, you should provide the appropriate SQL::AliasedExpression as the table
|
412
|
+
# argument.
|
413
|
+
# :implicit_qualifier :: The name to use for qualifying implicit conditions. By default,
|
414
|
+
# the last joined or primary table is used.
|
415
|
+
# :reset_implicit_qualifier :: Can set to false to ignore this join when future joins determine qualifier
|
416
|
+
# for implicit conditions.
|
417
|
+
# :qualify :: Can be set to false to not do any implicit qualification. Can be set
|
418
|
+
# to :deep to use the Qualifier AST Transformer, which will attempt to qualify
|
419
|
+
# subexpressions of the expression tree. Can be set to :symbol to only qualify
|
420
|
+
# symbols. Defaults to the value of default_join_table_qualification.
|
421
|
+
# block :: The block argument should only be given if a JOIN with an ON clause is used,
|
422
|
+
# in which case it yields the table alias/name for the table currently being joined,
|
423
|
+
# the table alias/name for the last joined (or first table), and an array of previous
|
424
|
+
# SQL::JoinClause. Unlike +where+, this block is not treated as a virtual row block.
|
421
425
|
#
|
422
426
|
# Examples:
|
423
427
|
#
|
@@ -505,7 +509,8 @@ module Sequel
|
|
505
509
|
SQL::JoinOnClause.new(expr, type, table_expr)
|
506
510
|
end
|
507
511
|
|
508
|
-
opts = {:join => (@opts[:join] || []) + [join]
|
512
|
+
opts = {:join => (@opts[:join] || []) + [join]}
|
513
|
+
opts[:last_joined_table] = table_name unless options[:reset_implicit_qualifier] == false
|
509
514
|
opts[:num_dataset_sources] = table_alias_num if table_alias_num
|
510
515
|
clone(opts)
|
511
516
|
end
|
@@ -514,7 +519,13 @@ module Sequel
|
|
514
519
|
class_eval("def #{jtype}_join(*args, &block); join_table(:#{jtype}, *args, &block) end", __FILE__, __LINE__)
|
515
520
|
end
|
516
521
|
UNCONDITIONED_JOIN_TYPES.each do |jtype|
|
517
|
-
class_eval(
|
522
|
+
class_eval(<<-END, __FILE__, __LINE__+1)
|
523
|
+
def #{jtype}_join(table, opts=Sequel::OPTS)
|
524
|
+
raise(Sequel::Error, '#{jtype}_join does not accept join table blocks') if block_given?
|
525
|
+
raise(Sequel::Error, '#{jtype}_join 2nd argument should be an options hash, not conditions') unless opts.is_a?(Hash)
|
526
|
+
join_table(:#{jtype}, table, nil, opts)
|
527
|
+
end
|
528
|
+
END
|
518
529
|
end
|
519
530
|
|
520
531
|
# Marks this dataset as a lateral dataset. If used in another dataset's FROM
|