sequel 5.6.0 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +30 -5099
- data/Rakefile +1 -1
- data/doc/opening_databases.rdoc +0 -2
- data/doc/postgresql.rdoc +31 -0
- data/doc/querying.rdoc +2 -2
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/testing.rdoc +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +11 -0
- data/lib/sequel/adapters/postgres.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +117 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +7 -6
- data/lib/sequel/connection_pool/threaded.rb +6 -6
- data/lib/sequel/core.rb +20 -0
- data/lib/sequel/database/logging.rb +3 -2
- data/lib/sequel/database/schema_generator.rb +1 -2
- data/lib/sequel/dataset/actions.rb +15 -5
- data/lib/sequel/extensions/connection_expiration.rb +3 -3
- data/lib/sequel/extensions/connection_validator.rb +3 -3
- data/lib/sequel/extensions/integer64.rb +30 -0
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/plugins/pg_array_associations.rb +5 -3
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +6 -6
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/oracle_spec.rb +15 -1
- data/spec/adapters/postgres_spec.rb +78 -1
- data/spec/adapters/spec_helper.rb +3 -1
- data/spec/bin_spec.rb +1 -0
- data/spec/core/dataset_spec.rb +10 -0
- data/spec/extensions/integer64_spec.rb +22 -0
- data/spec/extensions/pg_array_associations_spec.rb +14 -2
- data/spec/extensions/spec_helper.rb +1 -0
- data/spec/integration/associations_test.rb +4 -4
- data/spec/integration/dataset_test.rb +2 -0
- data/spec/integration/spec_helper.rb +5 -11
- data/spec/model/spec_helper.rb +1 -0
- metadata +35 -165
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
= New Features
|
|
2
|
-
|
|
3
|
-
* A dirty plugin has been added, which saves the initial value of
|
|
4
|
-
the column when the column is changed, similar to
|
|
5
|
-
ActiveModel::Dirty:
|
|
6
|
-
|
|
7
|
-
artist.name # => 'Foo'
|
|
8
|
-
artist.name = 'Bar'
|
|
9
|
-
artist.initial_value(:name) # 'Foo'
|
|
10
|
-
artist.column_change(:name) # ['Foo', 'Bar']
|
|
11
|
-
artist.column_changes # {:name => ['Foo', 'Bar']}
|
|
12
|
-
artist.column_changed?(:name) # true
|
|
13
|
-
artist.reset_column(:name)
|
|
14
|
-
artist.name # => 'Foo'
|
|
15
|
-
artist.column_changed?(:name) # false
|
|
16
|
-
artist.update(:name=>'Bar')
|
|
17
|
-
artist.column_changes # => {}
|
|
18
|
-
artist.previous_changes # => {:name=>['Foo', 'Bar']}
|
|
19
|
-
|
|
20
|
-
* Database#create_table now respects an :as option to create a
|
|
21
|
-
database based on the results of a query. The :as option value
|
|
22
|
-
should either be an SQL string or a dataset.
|
|
23
|
-
|
|
24
|
-
DB.create_table(:new_foos, :as=>DB[:foos].where(:new=>true))
|
|
25
|
-
|
|
26
|
-
* The json_serializer and xml_serializer plugins can now serialize
|
|
27
|
-
arbitrary arrays of model objects by passing an :array option
|
|
28
|
-
to the to_json class method. This works around an issue in
|
|
29
|
-
ruby's JSON library where Array#to_json does not pass arguments
|
|
30
|
-
given to it to the members of the array.
|
|
31
|
-
|
|
32
|
-
Artist.to_json(:array=>[Artist[1]], :include=>:albums)
|
|
33
|
-
|
|
34
|
-
* You can now use the % (modulus) operator in the same way you
|
|
35
|
-
can use the bitwise operators in Sequel:
|
|
36
|
-
|
|
37
|
-
:column.sql_number % 1 # (column % 1)
|
|
38
|
-
|
|
39
|
-
* On PostgreSQL, you can now provide :only, :cascade, and :restart
|
|
40
|
-
options to Dataset#truncate to use ONLY, CASCADE, and
|
|
41
|
-
RESTART IDENTITY. Additionally, you can now truncate multiple
|
|
42
|
-
tables at the same time:
|
|
43
|
-
|
|
44
|
-
DB.from(:table1, :table2).truncate(:cascade=>true)
|
|
45
|
-
|
|
46
|
-
* The :index option when creating columns in the schema generator
|
|
47
|
-
can now take a hash of index options:
|
|
48
|
-
|
|
49
|
-
DB.create_table(:foo){Integer :bar, :index=>{:unique=>true}}
|
|
50
|
-
|
|
51
|
-
* A Database#cache_schema accessor has been added, it can be set
|
|
52
|
-
to false to have the Database never cache schema results. This
|
|
53
|
-
can be useful in Rails development mode, so that you don't need to
|
|
54
|
-
restart a running server to have models pick up the new schema.
|
|
55
|
-
|
|
56
|
-
* Database#log_exception has been added for easier instrumentation.
|
|
57
|
-
It is called with the exception and SQL query string for all
|
|
58
|
-
queries that raise an exception.
|
|
59
|
-
|
|
60
|
-
* The Sequel.migration DSL now has a transaction method that forces
|
|
61
|
-
transaction use for the given migration.
|
|
62
|
-
|
|
63
|
-
= Other Improvements
|
|
64
|
-
|
|
65
|
-
* Many theoretical thread-safety issues have been fixed for ruby
|
|
66
|
-
implementations that don't use a global interpreter lock.
|
|
67
|
-
Previously, Sequel relied on MRI's global interpreter lock for
|
|
68
|
-
part of its thread safety, now it does manually locking in more
|
|
69
|
-
places to avoid thread-safety issues on JRuby (and other ruby
|
|
70
|
-
implementations without a global interpreter lock).
|
|
71
|
-
|
|
72
|
-
No Sequel user ever reported a production error related to the
|
|
73
|
-
previous thread-safety issues, and most of the issues fixed
|
|
74
|
-
were so difficult to hit that even tests specifically designed
|
|
75
|
-
to raise errors were unable to do so.
|
|
76
|
-
|
|
77
|
-
* Sequel.single_threaded = true now disables the mutex
|
|
78
|
-
synchronization that enforces thread safety for additional
|
|
79
|
-
performance in single threaded mode.
|
|
80
|
-
|
|
81
|
-
* Sequel's migrators now only attempt to use transactions by
|
|
82
|
-
default if the underlying database supports transactional DDL.
|
|
83
|
-
SQLite does support transactional DDL, but Sequel will not
|
|
84
|
-
use transactions for SQLite migrations as it causes issues
|
|
85
|
-
when emulating alter_table operations for tables with foreign
|
|
86
|
-
keys.
|
|
87
|
-
|
|
88
|
-
* Errors that occur when rolling back database transactions are
|
|
89
|
-
now handled correctly. Previously, the underlying exception was
|
|
90
|
-
raised, it wasn't correctly wrapped in a Sequel::DatabaseError,
|
|
91
|
-
and if it was due to a database disconnection, the connection
|
|
92
|
-
wasn't removed from the pool.
|
|
93
|
-
|
|
94
|
-
* Sequel no longer sets ruby instance variables on java objects,
|
|
95
|
-
fixing warnings on JRuby 1.7 and attempting to be forward
|
|
96
|
-
compatible with JRuby 2.0.
|
|
97
|
-
|
|
98
|
-
* Sequel now uses date and timestamp formats that are multilanguage
|
|
99
|
-
and not DATEFORMAT dependent on Microsoft SQL Server.
|
|
100
|
-
|
|
101
|
-
* Sequel now correctly escapes blackslash-carriage return-line feed
|
|
102
|
-
on Microsoft SQL Server.
|
|
103
|
-
|
|
104
|
-
* Parsing the column default values in the oracle adapter no longer
|
|
105
|
-
requires database superuser privileges.
|
|
106
|
-
|
|
107
|
-
* Sequel now correctly handles parsing schema for tables in other
|
|
108
|
-
databases on MySQL. Previously, it would always look in the
|
|
109
|
-
current database.
|
|
110
|
-
|
|
111
|
-
* Sequel no longer doubles backslashes in strings by default. It
|
|
112
|
-
now only does so on MySQL, since that is the only database that
|
|
113
|
-
appears to use backslashes for escaping. This fixes issues with
|
|
114
|
-
backslashes being doubled on some of the less commonly used
|
|
115
|
-
adapters.
|
|
116
|
-
|
|
117
|
-
* The pg_auto_parameterize extension now works correctly when
|
|
118
|
-
using cursors.
|
|
119
|
-
|
|
120
|
-
* Dataset#truncate now raises an Error if you attempt to do so
|
|
121
|
-
on a dataset that uses HAVING. Previously, it only checked for
|
|
122
|
-
WHERE.
|
|
123
|
-
|
|
124
|
-
* The schema dumper now recognized the identity type.
|
|
125
|
-
|
|
126
|
-
= Backwards Compatibility
|
|
127
|
-
|
|
128
|
-
* Association reflections now store cached information in a
|
|
129
|
-
separate subhash due to the thread-safety changes. Any code
|
|
130
|
-
accessing an association reflection should always call the
|
|
131
|
-
related method to get the cached data instead of checking
|
|
132
|
-
for a specific location in the hash.
|
|
133
|
-
|
|
134
|
-
* Association reflection internals for many_through_many associations
|
|
135
|
-
changed significantly, any code that accesses the edge information
|
|
136
|
-
in the reflection will need to be changed to use the new methods
|
|
137
|
-
instead of accessing the old values directly.
|
|
138
|
-
|
|
139
|
-
* The features deprecated in 3.34.0 have now been removed:
|
|
140
|
-
* Ruby <1.8.7 support
|
|
141
|
-
* PostgreSQL <8.2 support
|
|
142
|
-
* Dataset#disable_insert_returning on PostgreSQL
|
|
143
|
-
* Array#all_two_pairs? and #sql_expr_if_all_two_pairs
|
|
144
|
-
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
= New Features
|
|
2
|
-
|
|
3
|
-
* An eager_each plugin has been added, which automatically makes
|
|
4
|
-
eagerly loaded datasets do eager loading if you call #each (or
|
|
5
|
-
another Enumerable method) instead of #all. By default, if you
|
|
6
|
-
call #each on an eager dataset, it will not do eager loading,
|
|
7
|
-
and if you call #each on an eager_graph dataset, you will
|
|
8
|
-
get plain hashes with columns from all joined tables instead of
|
|
9
|
-
model objects. With this plugin, #each on both eager and
|
|
10
|
-
eager_graph datasets will do eager loading.
|
|
11
|
-
|
|
12
|
-
* The nested attributes plugin now supports composite primary keys
|
|
13
|
-
in associated records. Additionally, it now deals better with
|
|
14
|
-
natural primary keys in associated records. There is a new
|
|
15
|
-
:unmatched_pk option that can be set to :create if you want to
|
|
16
|
-
create new associated records when the input hash contains
|
|
17
|
-
primary key information that doesn't match one of the existing
|
|
18
|
-
associated objects.
|
|
19
|
-
|
|
20
|
-
The nested attributes plugin now also supports a :transform option.
|
|
21
|
-
If given, this option is called with the parent object and the
|
|
22
|
-
input hash given for each associated record passed into the
|
|
23
|
-
nested atttributes setter. The callable should return the hash
|
|
24
|
-
of attributes to use.
|
|
25
|
-
|
|
26
|
-
* Model#from_json in the json_serializer plugin now takes an options
|
|
27
|
-
hash and recognizes the :fields option. If the :fields option is
|
|
28
|
-
given, it should be an array of field names, and set_fields is
|
|
29
|
-
called with the array instead of using set. This allows you to
|
|
30
|
-
easily filter which fields in the hash are set in the model
|
|
31
|
-
instance. The entire options hash is also passed to set_fields
|
|
32
|
-
if :fields is present, so you can additionally use the :missing =>
|
|
33
|
-
:raise or :missing => :skip options that set_fields supports.
|
|
34
|
-
|
|
35
|
-
* The Dataset#to_json method in the json_serializer plugin now
|
|
36
|
-
respects :root=>:collection and :root=>:instance options. If
|
|
37
|
-
:root=>:collection is given, only the collection is wrapped in a
|
|
38
|
-
hash, and if :root=>:instance is given, only the instances are
|
|
39
|
-
wrapped in a hash. For backwards compatibility, both the
|
|
40
|
-
instances and collection are wrapped in a hash:
|
|
41
|
-
|
|
42
|
-
Model.to_json(:root=>true)
|
|
43
|
-
# {"models":[{"model":{"id":1}}]}
|
|
44
|
-
|
|
45
|
-
Model.to_json(:root=>:collection)
|
|
46
|
-
# {"models":[{"id":1}]}
|
|
47
|
-
|
|
48
|
-
Model.to_json(:root=>:instance)
|
|
49
|
-
# [{"model":{"id":1}}]
|
|
50
|
-
|
|
51
|
-
Wrapping both the collection and instance in a root by default
|
|
52
|
-
is probably an undesired behavior, so the default for :root=>true
|
|
53
|
-
may change in the next major version of Sequel. Users who want
|
|
54
|
-
the current behavior should switch to using :root=>:both.
|
|
55
|
-
|
|
56
|
-
* The schema_dumper extension now respects an :index_names option
|
|
57
|
-
when dumping. This option can be set to false to never dump the
|
|
58
|
-
index names. It can also be set to :namespace, in which case if
|
|
59
|
-
the database does not have a global index namespace, it will
|
|
60
|
-
automatically prefix the name of the index with the name of the
|
|
61
|
-
table.
|
|
62
|
-
|
|
63
|
-
Database#global_index_namespace? was added to check if the
|
|
64
|
-
database uses a global index namespace. If false, index names are
|
|
65
|
-
probably namespaced per table (MySQL, MSSQL, Oracle).
|
|
66
|
-
|
|
67
|
-
* :each is now a valid prepared statement type. This prepared
|
|
68
|
-
statement type requires a block when you call the statement, and
|
|
69
|
-
iterates over the records of the statement a row at a time.
|
|
70
|
-
Previously, there wasn't a way to iterate over the records of a
|
|
71
|
-
prepared statement a row at a time, since the :select and :all
|
|
72
|
-
types collect all rows into an array before iterating over them.
|
|
73
|
-
|
|
74
|
-
* A :connection_handling=>:queue option is now respected for
|
|
75
|
-
database objects, and changes the threaded connection pools to use
|
|
76
|
-
a queue instead of a stack as the data structure for storing
|
|
77
|
-
available connections. A queue does not perform as well as a
|
|
78
|
-
stack, but reduces the likelihood of stale connections.
|
|
79
|
-
|
|
80
|
-
It is possible that Sequel will change in the future from using a
|
|
81
|
-
stack by default to using a queue by default, so any users who
|
|
82
|
-
specifically desire a stack to be used should specify the
|
|
83
|
-
:connection_handling=>:stack option.
|
|
84
|
-
|
|
85
|
-
* Sequel::Migrator now supports is_current? class method to check
|
|
86
|
-
if there are no outstanding migrations to apply. It also supports
|
|
87
|
-
a check_current class method, which raises an exception if there
|
|
88
|
-
are outstanding migrations to apply.
|
|
89
|
-
|
|
90
|
-
* A pg_json extension has been added, supporting PostgreSQL's 9.2
|
|
91
|
-
json type, similarly to the pg_array and pg_hstore extensions.
|
|
92
|
-
Note that with the current PostgreSQL json code, the root object
|
|
93
|
-
can be a string or number, but ruby's json library requires the
|
|
94
|
-
root json value to be an object or array. So you will probably
|
|
95
|
-
get an exception if you attempt to retrieve a PostgreSQL json
|
|
96
|
-
value that ruby's JSON library won't parse.
|
|
97
|
-
|
|
98
|
-
* A pg_inet extension has been added, which automatically typecasts
|
|
99
|
-
PostgreSQL inet and cidr types to ruby IPAddr objects on retrieval.
|
|
100
|
-
|
|
101
|
-
* Database#transaction on PostgreSQL now recognizes :read_only and
|
|
102
|
-
:deferrable options, and can use them to set the READ ONLY and
|
|
103
|
-
DEFERRABLE transaction flags. A :synchronous option is also
|
|
104
|
-
recognized, which can be set to true, false, :local, or
|
|
105
|
-
:remote_write, and sets the value of synchronous_commit just for
|
|
106
|
-
that transaction.
|
|
107
|
-
|
|
108
|
-
* When adding and dropping indexes on PostgreSQL, a :concurrently
|
|
109
|
-
option can be used to create or drop the index CONCURRENTLY, which
|
|
110
|
-
doesn't require a full write table lock.
|
|
111
|
-
|
|
112
|
-
* When dropping indexes on PostgreSQL, :if_exists and :cascade options
|
|
113
|
-
are now recognized.
|
|
114
|
-
|
|
115
|
-
* When using alter_table set_column_type on PostgreSQL, the :using
|
|
116
|
-
option is respected, and can be used to force a specific conversion
|
|
117
|
-
from the previous value to the new value with the USING syntax.
|
|
118
|
-
|
|
119
|
-
* On MySQL, you can now set an :sql_mode option when connecting. This
|
|
120
|
-
can be a string or symbol or an array of them, and each should match
|
|
121
|
-
one of MySQL's sql_modes. MySQL's default SQL mode is fairly loose,
|
|
122
|
-
and using one of the strict sql modes is recommended, but for
|
|
123
|
-
backwards compatibility, Sequel will not set a specific SQL mode by
|
|
124
|
-
default. However, that may change in the next major version of
|
|
125
|
-
Sequel, so to be forwards compatible you should set :sql_mode=>nil
|
|
126
|
-
if you do not desire a strict SQL mode to be set automatically.
|
|
127
|
-
|
|
128
|
-
* Partial indexes are now supported on Microsoft SQL Server 2008
|
|
129
|
-
(SQL Server refers to them as filtered indexes). Attempting to
|
|
130
|
-
use a partial index on an earlier version of SQL Server will
|
|
131
|
-
result in the database raising an exception.
|
|
132
|
-
|
|
133
|
-
* A jdbc/progress adapter has been added, supporting the Progress
|
|
134
|
-
database via the jdbc adapter.
|
|
135
|
-
|
|
136
|
-
= Other Improvements
|
|
137
|
-
|
|
138
|
-
* Dataset#get now works correctly if you pass it a nil or false
|
|
139
|
-
argument. Previously, it ignored the argument and used the block
|
|
140
|
-
instead. If you want to use the block argument, you should not
|
|
141
|
-
pass in a regular argument.
|
|
142
|
-
|
|
143
|
-
* Database#call now passes any blocks given to it to the underlying
|
|
144
|
-
prepared statement object. Before, a passed block was ignored.
|
|
145
|
-
|
|
146
|
-
* Sequel::Model.db is no longer set automatically when creating
|
|
147
|
-
an anonymous class with an associated database object. This fixes
|
|
148
|
-
cases where a library would create namespaced models, and the
|
|
149
|
-
database used by the library would be set as the default for the
|
|
150
|
-
user's application code.
|
|
151
|
-
|
|
152
|
-
* Model *_to_one association setters are now no-ops if you pass a
|
|
153
|
-
value that is the same as the cached value. This fixes issues with
|
|
154
|
-
reciprocal associations getting reordered, and is better
|
|
155
|
-
for performance.
|
|
156
|
-
|
|
157
|
-
For cases where the old behavior is desired, the
|
|
158
|
-
set_associated_object_if_same? method can be overridden to return
|
|
159
|
-
true for object. If you are manually setting objects in the
|
|
160
|
-
associations cache before calling the setter method, you may want
|
|
161
|
-
to set that.
|
|
162
|
-
|
|
163
|
-
* The dirty plugin no longer affects the return value of refresh
|
|
164
|
-
and lock!. Internal changes should now help ensure that plugins
|
|
165
|
-
don't affect the return values of these methods.
|
|
166
|
-
|
|
167
|
-
* Sequel now supports JRuby 1.7's new exception handling, fixing
|
|
168
|
-
exception handling when connecting in the jdbc adapter.
|
|
169
|
-
|
|
170
|
-
* When dumping unsigned integer types in the schema dumper, if the
|
|
171
|
-
unsigned values could overflow a 32-bit signed integer type,
|
|
172
|
-
the generic Bignum class is used as the type. This should fix
|
|
173
|
-
issues when copying a database containing an unsigned 32-bit
|
|
174
|
-
integer column with values between 2^31 and 2^32-1.
|
|
175
|
-
|
|
176
|
-
* In the optimistic_locking plugin, attempting to refresh and
|
|
177
|
-
save after a failed save now works correctly. Before, the second
|
|
178
|
-
save would never modify a row.
|
|
179
|
-
|
|
180
|
-
* Time types on jdbc/postgres are now typecasted accurately on
|
|
181
|
-
retrieval, before they could be off by up to a millisecond due to
|
|
182
|
-
floating point issues.
|
|
183
|
-
|
|
184
|
-
* Disconnect detection in the mysql2 adapter has been improved.
|
|
185
|
-
|
|
186
|
-
* The jdbc/mysql, do/mysql, and swift/mysql adapters all now support
|
|
187
|
-
the :timeout option to set the MySQL wait_timeout.
|
|
188
|
-
|
|
189
|
-
* Savepoints in prepared transactions are now supported on MySQL
|
|
190
|
-
5.5.23+, since the bug that caused them to be unsupported starting
|
|
191
|
-
in 5.5.13 has been fixed.
|
|
192
|
-
|
|
193
|
-
* Parsing foreign key metadata for tables with an explicit
|
|
194
|
-
schema now works correctly on PostgreSQL.
|
|
195
|
-
|
|
196
|
-
* bin/sequel -C now namespaces indexes automatically when copying
|
|
197
|
-
from a database without a global index namespace to a database
|
|
198
|
-
with a global index namespace.
|
|
199
|
-
|
|
200
|
-
* Indexes are now dropped in reverse order that they were added in
|
|
201
|
-
the schema_dumper.
|
|
202
|
-
|
|
203
|
-
* The Model typecasting code works around bugs in objects where
|
|
204
|
-
object.==('') would raise an exception instead of returning false.
|
|
205
|
-
|
|
206
|
-
* A better error message is used if an invalid JDBC URL is
|
|
207
|
-
provided and the JDBC driver's new.connect method returns NULL.
|
|
208
|
-
|
|
209
|
-
* A document describing Sequel's object model has been added,
|
|
210
|
-
describing the objects Sequel uses to represent SQL concepts.
|
|
211
|
-
|
|
212
|
-
* Most adapter specific options to Database methods are now mentioned
|
|
213
|
-
in the main Database method RDoc.
|
|
214
|
-
|
|
215
|
-
= Backwards Compatibility
|
|
216
|
-
|
|
217
|
-
* The nested_attributes plugin internals changed significantly. If
|
|
218
|
-
you were overriding one of the nested_attributes* private methods
|
|
219
|
-
and calling super to get the default behavior, you may have to
|
|
220
|
-
update your code.
|
|
221
|
-
|
|
222
|
-
* Database#case_sensitive_like has been removed on SQLite. This
|
|
223
|
-
method never worked correctly, it always returned false even if
|
|
224
|
-
the case_sensitive_like PRAGMA was set. That's because SQLite
|
|
225
|
-
doesn't offer a getter for this PRAGMA, only a setter. Note that
|
|
226
|
-
Database#case_sensitive_like= still exists and works correctly.
|
|
227
|
-
|
|
228
|
-
* Database#single_value has been removed from the native SQLite
|
|
229
|
-
adapter. This method was designed for internal use, and hasn't
|
|
230
|
-
been used for some time. Any current users of the method should
|
|
231
|
-
switch to Dataset#single_value.
|
|
232
|
-
|
|
233
|
-
* The private Database#defined_columns_for method in the SQLite
|
|
234
|
-
adapter no longer takes an options hash.
|
|
235
|
-
|
|
236
|
-
* A couple jdbc/postgres adapter methods are now private. Previously,
|
|
237
|
-
the jdbc/postgres adapter overrode some private superclass methods
|
|
238
|
-
but left the methods public.
|
|
239
|
-
|
|
240
|
-
* When using the optimistic_locking plugin, refreshing inside a
|
|
241
|
-
before_update method after calling super will now result in the
|
|
242
|
-
lock checking being skipped.
|
|
243
|
-
|
|
244
|
-
* The private Model#_refresh no longer returns self, so external
|
|
245
|
-
plugins should no longer rely on that behavior.
|
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
= New Features
|
|
2
|
-
|
|
3
|
-
* Database#extension and Dataset#extension have been added and
|
|
4
|
-
make it much easier to use extensions that just define modules,
|
|
5
|
-
where you previously had to manually extend a Database or
|
|
6
|
-
Dataset object with the module to get the extension's behavior.
|
|
7
|
-
These methods operate similarly to model plugins, where you just
|
|
8
|
-
specify the extension symbol, except that you can specify multiple
|
|
9
|
-
extensions at once:
|
|
10
|
-
|
|
11
|
-
DB.extension(:pg_array, :pg_hstore)
|
|
12
|
-
|
|
13
|
-
For databases, these modify the Database itself (and
|
|
14
|
-
potentially all of its datasets). Dataset#extension operates
|
|
15
|
-
like other dataset methods, returning a modified clone of
|
|
16
|
-
the dataset with the extension added:
|
|
17
|
-
|
|
18
|
-
dataset = dataset.extension(:columns_introspection)
|
|
19
|
-
|
|
20
|
-
Dataset#extension! has also been added for modifying the
|
|
21
|
-
receiver instead of returning a clone.
|
|
22
|
-
|
|
23
|
-
Not all extensions are usable by Database#extension or
|
|
24
|
-
Dataset#extension, the extension has to have specific support
|
|
25
|
-
for it. The following extensions support both
|
|
26
|
-
Database#extension and Dataset#extension:
|
|
27
|
-
|
|
28
|
-
* columns_introspection
|
|
29
|
-
* query_literals
|
|
30
|
-
* split_array_nil
|
|
31
|
-
|
|
32
|
-
The following extensions support just Database#extension:
|
|
33
|
-
|
|
34
|
-
* arbitrary_servers
|
|
35
|
-
* looser_typecasting
|
|
36
|
-
* pg_array
|
|
37
|
-
* pg_auto_parameterize
|
|
38
|
-
* pg_hstore
|
|
39
|
-
* pg_inet
|
|
40
|
-
* pg_interval
|
|
41
|
-
* pg_json
|
|
42
|
-
* pg_range
|
|
43
|
-
* pg_statement_cache
|
|
44
|
-
* server_block
|
|
45
|
-
|
|
46
|
-
Any user that was loading these extensions with Sequel.extension
|
|
47
|
-
and then manually extending objects with the extension's module
|
|
48
|
-
is encouraged to switch to Database#extension and/or
|
|
49
|
-
Dataset#extension.
|
|
50
|
-
|
|
51
|
-
* Dataset join methods now respect a :qualify=>:deep option
|
|
52
|
-
to do deep qualification of expressions, allowing qualification
|
|
53
|
-
of subexpressions in the expression tree. This can allow you
|
|
54
|
-
to do things like:
|
|
55
|
-
|
|
56
|
-
DB[:a].join(:b, {:c.cast(Integer)=>:d.cast(Integer)},
|
|
57
|
-
:qualify=>:deep)
|
|
58
|
-
# SELECT * FROM a INNER JOIN b
|
|
59
|
-
# ON (CAST(b.c AS INTEGER) = CAST(a.d AS INTEGER))
|
|
60
|
-
|
|
61
|
-
For backwards compatibility, by default Sequel will only do
|
|
62
|
-
automatic qualification if the arguments are simple symbols.
|
|
63
|
-
This may change in a future version, if automatic qualification
|
|
64
|
-
of only symbols is desired, switch to using :qualify=>:symbol.
|
|
65
|
-
|
|
66
|
-
You can also choose to do no automatic qualification using the
|
|
67
|
-
:qualify=>false option.
|
|
68
|
-
|
|
69
|
-
* All of Sequel's model associations now work with key expressions
|
|
70
|
-
that are not simple column references, without creating a fully
|
|
71
|
-
custom association. So you can create associations where the
|
|
72
|
-
primary/foreign key values are stored in PostgreSQL array or
|
|
73
|
-
hstore columns, for example.
|
|
74
|
-
|
|
75
|
-
* The pg_array extension has now been made more generic, so that it
|
|
76
|
-
is easy to support array types for any scalar type that is
|
|
77
|
-
currently supported. All scalar types that Sequel's postgres
|
|
78
|
-
adapter supports now have corresponding array types supported in
|
|
79
|
-
the pg_array extension. So if you load the pg_array extension and
|
|
80
|
-
return a date array column, the returned values will be arrays of
|
|
81
|
-
ruby Date objects.
|
|
82
|
-
|
|
83
|
-
Other pg_* extensions that add support for PostgreSQL-specific
|
|
84
|
-
scalar types now support array versions of those types if the
|
|
85
|
-
pg_array extension is loaded first.
|
|
86
|
-
|
|
87
|
-
* A pg_range extension has been added, making it easy to deal
|
|
88
|
-
with PostgreSQL 9.2+'s range types. As ruby's Range class does
|
|
89
|
-
not support all PostgreSQL range type values (such as empty ranges,
|
|
90
|
-
unbounded ranges, or ranges with an exlusive beginning), range
|
|
91
|
-
types are returned as instances of Sequel::Postgres::PGRange, which
|
|
92
|
-
has an API similar to Range. You can turn a PGRange into a Range
|
|
93
|
-
using PGRange#to_range, assuming that the range type value does not
|
|
94
|
-
use features that are incompatible with ruby's Range class.
|
|
95
|
-
|
|
96
|
-
The pg_range extension supports all range types supported by
|
|
97
|
-
default in PostgreSQL 9.2, and makes it easy to support custom
|
|
98
|
-
range types.
|
|
99
|
-
|
|
100
|
-
* A pg_range_ops extension has been added, which adds DSL support for
|
|
101
|
-
PostgreSQL range operators and functions, similar to the
|
|
102
|
-
pg_array_ops and pg_hstore_ops extensions.
|
|
103
|
-
|
|
104
|
-
* A pg_interval extension has been added, which makes Sequel return
|
|
105
|
-
PostgreSQL interval types as instances of ActiveSupport::Duration.
|
|
106
|
-
This is useful if you want to take the interval value and use it in
|
|
107
|
-
calculations in ruby (assuming you load the appropriate parts of
|
|
108
|
-
ActiveSupport).
|
|
109
|
-
|
|
110
|
-
* A split_array_nil extension has been added, which changes how Sequel
|
|
111
|
-
compiles IN/NOT IN expressions with arrays with nil values.
|
|
112
|
-
|
|
113
|
-
where(:col=>[1, nil])
|
|
114
|
-
# Default:
|
|
115
|
-
# WHERE (col IN (1, NULL))
|
|
116
|
-
# with split_array_nil extension:
|
|
117
|
-
# WHERE ((col IN (1)) OR (col IS NULL))
|
|
118
|
-
|
|
119
|
-
exclude(:col=>[1, nil])
|
|
120
|
-
# Default:
|
|
121
|
-
# WHERE (col NOT IN (1, NULL))
|
|
122
|
-
# with split_array_nil extension:
|
|
123
|
-
# WHERE ((col NOT IN (1)) AND (col IS NOT NULL))
|
|
124
|
-
|
|
125
|
-
* The nested_attributes plugin now allows the :fields option to
|
|
126
|
-
be a proc, which is called with the associated object and should
|
|
127
|
-
return an array of allowable fields.
|
|
128
|
-
|
|
129
|
-
* You can now specify the graph alias base when using eager_graph on
|
|
130
|
-
a per-call basis. Previously, it could only be set on a per
|
|
131
|
-
association basis. This is helpful if you have multiple
|
|
132
|
-
associations to the same class, and are cascading the eager graph to
|
|
133
|
-
dependent associations of that class for both of the associations.
|
|
134
|
-
Previously, there was no way to manually give descriptive names to
|
|
135
|
-
the tables in the cascaded associations, but you can now do so
|
|
136
|
-
by passing the association as an Sequel::SQL::AliasedExpression
|
|
137
|
-
instance instead of a plain Symbol. Here's a usage example:
|
|
138
|
-
|
|
139
|
-
ds = Game.eager_graph(:winner=>:players.as(:winning_players),
|
|
140
|
-
:loser=>:players.as(:losing_players)).
|
|
141
|
-
where(:winning_players__name=>'A',
|
|
142
|
-
:losing_players__name=>'B')
|
|
143
|
-
|
|
144
|
-
* many_through_many associations now differentiate between column
|
|
145
|
-
references and method references, by supporting the
|
|
146
|
-
:left_primary_key_column and :right_primary_key_method options that
|
|
147
|
-
many_to_many associations support.
|
|
148
|
-
|
|
149
|
-
* Custom :eager_loader procs that accept a single hash argument now
|
|
150
|
-
have an additional entry passed in the hash, :id_map, which is
|
|
151
|
-
easier to use than the :key_hash entry (which is still present for
|
|
152
|
-
backwards compatibility). Anyone with custom :eager_loader procs is
|
|
153
|
-
encouraged to switch from using :key_hash to :id_map.
|
|
154
|
-
|
|
155
|
-
* You can now override the create_table/alter_table schema generators
|
|
156
|
-
per database/adapter. This allows for database specific generator
|
|
157
|
-
subclasses, which have methods for unique features for that
|
|
158
|
-
database.
|
|
159
|
-
|
|
160
|
-
* You can now setup exclusion constraints on PostgreSQL using the
|
|
161
|
-
create_table and alter_table schema generators:
|
|
162
|
-
|
|
163
|
-
DB.create_table(:t) do
|
|
164
|
-
...
|
|
165
|
-
exclude([[:col1, '&&'], [:col2, '=']])
|
|
166
|
-
# EXCLUDE USING gist (col1 WITH &&, col2 WITH =)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
One common use for exclusion constraints is to make sure that no two
|
|
170
|
-
rows have overlapping values/ranges/circles.
|
|
171
|
-
|
|
172
|
-
* When adding foreign key constraints to an existing table on
|
|
173
|
-
PostgreSQL, you can use the :not_valid option to mark the constraint
|
|
174
|
-
as not yet valid. This will make it so that future changes to the
|
|
175
|
-
table need to respect the foreign key constraint, but existing rows
|
|
176
|
-
do not. After cleaning up the existing data, you can then use the
|
|
177
|
-
alter_table validate_constraint method to mark the constraint as
|
|
178
|
-
valid.
|
|
179
|
-
|
|
180
|
-
* An eval_inspect extension has been added that attempts to do
|
|
181
|
-
do the following for Sequel::SQL::Expression instances:
|
|
182
|
-
|
|
183
|
-
eval(obj.inspect) == obj # => true
|
|
184
|
-
|
|
185
|
-
There are a lot of cases that this extension does not handle, but
|
|
186
|
-
it does a decent job in most cases. This is currently only used
|
|
187
|
-
internally in a specific case in the schema_dumper extension.
|
|
188
|
-
|
|
189
|
-
= Other Improvements
|
|
190
|
-
|
|
191
|
-
* The filter by associations support now respects the method
|
|
192
|
-
reference vs column reference distinction that other parts of the
|
|
193
|
-
association code have respected since 3.32.0.
|
|
194
|
-
|
|
195
|
-
* In the nested_attributes plugin, new one_to_one associated
|
|
196
|
-
values are saved once instead of twice. Previously it attempted to
|
|
197
|
-
save them before they were associated to the current model object,
|
|
198
|
-
which can violate some validations/constraints.
|
|
199
|
-
|
|
200
|
-
* When saving an associated object in the one_to_one association
|
|
201
|
-
setter method, Sequel no longer adds an unnecessary filter
|
|
202
|
-
condition when nullifying the foreign key for existing rows
|
|
203
|
-
in the associated table.
|
|
204
|
-
|
|
205
|
-
* The list plugin's before_create method now calls super, which
|
|
206
|
-
fixes usage when other plugins that define before_create are loaded
|
|
207
|
-
before it.
|
|
208
|
-
|
|
209
|
-
* In the pg_array extension, when typecasting an Array to PGArray,
|
|
210
|
-
a recursive map is done on the input array to convert each value
|
|
211
|
-
in the input array to the expected type, using the typecasting
|
|
212
|
-
method that would be used for the scalar value. For example, for
|
|
213
|
-
model objects, where ids is an integer array column:
|
|
214
|
-
|
|
215
|
-
model.set(:ids=>['1', '2']).ids.to_a # => [1, 2]
|
|
216
|
-
|
|
217
|
-
* The pg_array extension now correctly handles bytea arrays used
|
|
218
|
-
in bound variables.
|
|
219
|
-
|
|
220
|
-
* The pg_array extension no longer uses the JSON-based parser for
|
|
221
|
-
floating point types, since it doesn't handle NaN and Infinity
|
|
222
|
-
values correctly.
|
|
223
|
-
|
|
224
|
-
* When typecasting in the pg_array extension, PGArray values are
|
|
225
|
-
only returned verbatim if they have a matching database type.
|
|
226
|
-
Otherwise, the underlying array is rewrapped in a new PGArray
|
|
227
|
-
value with the correct database type.
|
|
228
|
-
|
|
229
|
-
* H2 clob types are now recognized as strings instead of blobs.
|
|
230
|
-
Previously the code attempted to do this, but it didn't do so
|
|
231
|
-
correctly.
|
|
232
|
-
|
|
233
|
-
* The jdbc/postgres adapter now converts scalar values of
|
|
234
|
-
the array to the appropriate type. Previously, if you retrieved
|
|
235
|
-
a date array, you got back a ruby array of JavaSQL::SQL::Date
|
|
236
|
-
instances. Now, you get back a ruby array of ruby Date instances.
|
|
237
|
-
|
|
238
|
-
* The schema_dumper extension now dumps migrations as change
|
|
239
|
-
migrations, instead of separate up/down migrations, resulting in
|
|
240
|
-
simpler code.
|
|
241
|
-
|
|
242
|
-
* When dumping non-integer foreign keys in the schema dumper, an
|
|
243
|
-
explicit type is now used. Previously, the column would have been
|
|
244
|
-
dumped as an integer column.
|
|
245
|
-
|
|
246
|
-
* When dumping unsigned integer columns in the schema dumper, add a
|
|
247
|
-
column > 0 constraint in the dumped migration.
|
|
248
|
-
|
|
249
|
-
* On Microsoft SQL Server, when updating a dataset with a limit,
|
|
250
|
-
the limit is now respected.
|
|
251
|
-
|
|
252
|
-
* When emulating offset using the ROW_NUMBER window function,
|
|
253
|
-
do not require that the dataset be ordered. If an order is
|
|
254
|
-
not provided, default to ordering on all of the columns in
|
|
255
|
-
the dataset. If you want to override the default order used
|
|
256
|
-
in such a case, you need to override the default_offset_order
|
|
257
|
-
method for the dataset.
|
|
258
|
-
|
|
259
|
-
* On SQLite, casting to Date/Time/DateTime now calls an SQLite
|
|
260
|
-
date/datetime function instead of using a cast, as SQLite treats
|
|
261
|
-
such a cast as a cast to integer.
|
|
262
|
-
|
|
263
|
-
* When using JRuby 1.6 in ruby 1.9 mode and typecasting a time
|
|
264
|
-
column, workaround a bug where Time#nsec is 0 even though
|
|
265
|
-
Time#usec is not.
|
|
266
|
-
|
|
267
|
-
* The odbc/mssql adapter now correctly handles the case where
|
|
268
|
-
SCOPE_IDENTITY returns NULL after an insert.
|
|
269
|
-
|
|
270
|
-
* bin/sequel now accepts multiple -l options for logging to multiple
|
|
271
|
-
output files.
|
|
272
|
-
|
|
273
|
-
* In addition to Sequel's rigorous pre-push testing, Sequel now
|
|
274
|
-
also uses TravisCI for continuous integration testing across
|
|
275
|
-
a wider range of ruby implementations.
|
|
276
|
-
|
|
277
|
-
= Backwards Compatibility
|
|
278
|
-
|
|
279
|
-
* The keys in the :key_hash entry passed to the :eager_loader proc
|
|
280
|
-
are now method references instead of column references. For most
|
|
281
|
-
associations, they are the same thing, but for associations using
|
|
282
|
-
the :key_column/:primary_key_column/:left_primary_key_column
|
|
283
|
-
options, the values could be different. If you were using one
|
|
284
|
-
of those options and had a custom eager_loader, you should switch
|
|
285
|
-
from indexing into the :key_hash option to just using the :id_map
|
|
286
|
-
option.
|
|
287
|
-
|
|
288
|
-
* The :key_hash entry passed to the :eager_loader proc is now no
|
|
289
|
-
longer guaranteed to contain key maps for associations other than
|
|
290
|
-
the one currently being eagerly loaded. Previously, it contained
|
|
291
|
-
key maps for all associations that were being eagerly loaded. If
|
|
292
|
-
you have a custom :eager_loader proc that accessed a key map for
|
|
293
|
-
a separate association that was being loaded concurrently, you'll
|
|
294
|
-
now have to build the key map manually if it doesn't exist.
|
|
295
|
-
|
|
296
|
-
* If you previously explicitly specified an :eager_loader_key option
|
|
297
|
-
when defining an association, you may need to change it so that it
|
|
298
|
-
is a method reference instead of a column reference, or possibly
|
|
299
|
-
just omit the option.
|
|
300
|
-
|
|
301
|
-
* If you have a custom :eager_loader proc for an association where
|
|
302
|
-
the default :eager_loader_key option references a method that
|
|
303
|
-
the model does not respond to (or raises an exception), you may
|
|
304
|
-
need to specify the :eager_loader_key=>nil option.
|
|
305
|
-
|
|
306
|
-
* In the pg_auto_parameterize extension, String values are no longer
|
|
307
|
-
automatically casted to text. This is because the default type of
|
|
308
|
-
a string literal in PostgreSQL is unknown, not text. This makes it
|
|
309
|
-
much less likely to require manual casts, but has the potential to
|
|
310
|
-
break existing code relying on the automatic cast to text. As a
|
|
311
|
-
work around, any query that can no longer be automatically
|
|
312
|
-
parameterized after this query just needs to add manual casting
|
|
313
|
-
to text.
|
|
314
|
-
|
|
315
|
-
* Sequel now raises an exception if you attempt to clone associations
|
|
316
|
-
with different types, except if one type is one_to_many and the
|
|
317
|
-
other is one_to_one. Cloning from other types was usually a bug,
|
|
318
|
-
and raising an exception early will make it much easier to track
|
|
319
|
-
such bugs down.
|
|
320
|
-
|
|
321
|
-
* When running the plugin/extension and PostgreSQL adapter specs,
|
|
322
|
-
a json library is now required.
|
|
323
|
-
|
|
324
|
-
* The json/postgres adapter array typecasting internals have been
|
|
325
|
-
modified, if you were relying on the internals, you may need to
|
|
326
|
-
update your code.
|
|
327
|
-
|
|
328
|
-
* The pg_array extension internals changed significantly. PGArray
|
|
329
|
-
no longer has any subclasses by default, as parsing is now done
|
|
330
|
-
in separate objects. Anyone relying on the pg_array internals
|
|
331
|
-
will need to update their code.
|
|
332
|
-
|
|
333
|
-
* The postgres adapter no longer sets up type conversion of int2vector
|
|
334
|
-
and money types, since in both cases the conversion was incorrect in
|
|
335
|
-
most cases. These types will now be returned as strings. If you are
|
|
336
|
-
relying on the conversion, you'll need to add your own custom type
|
|
337
|
-
procs.
|
|
338
|
-
|