sequel 2.10.0 → 2.11.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.
Files changed (78) hide show
  1. data/CHANGELOG +51 -1
  2. data/README.rdoc +2 -2
  3. data/Rakefile +2 -2
  4. data/doc/advanced_associations.rdoc +6 -18
  5. data/doc/release_notes/1.0.txt +38 -0
  6. data/doc/release_notes/1.1.txt +143 -0
  7. data/doc/release_notes/1.3.txt +101 -0
  8. data/doc/release_notes/1.4.0.txt +53 -0
  9. data/doc/release_notes/1.5.0.txt +155 -0
  10. data/doc/release_notes/2.0.0.txt +298 -0
  11. data/doc/release_notes/2.1.0.txt +271 -0
  12. data/doc/release_notes/2.10.0.txt +328 -0
  13. data/doc/release_notes/2.11.0.txt +215 -0
  14. data/doc/release_notes/2.2.0.txt +253 -0
  15. data/doc/release_notes/2.3.0.txt +88 -0
  16. data/doc/release_notes/2.4.0.txt +106 -0
  17. data/doc/release_notes/2.5.0.txt +137 -0
  18. data/doc/release_notes/2.6.0.txt +157 -0
  19. data/doc/release_notes/2.7.0.txt +166 -0
  20. data/doc/release_notes/2.8.0.txt +171 -0
  21. data/doc/release_notes/2.9.0.txt +97 -0
  22. data/lib/sequel_core/adapters/ado.rb +3 -0
  23. data/lib/sequel_core/adapters/db2.rb +0 -11
  24. data/lib/sequel_core/adapters/dbi.rb +0 -11
  25. data/lib/sequel_core/adapters/do.rb +0 -12
  26. data/lib/sequel_core/adapters/firebird.rb +21 -16
  27. data/lib/sequel_core/adapters/informix.rb +1 -11
  28. data/lib/sequel_core/adapters/jdbc.rb +1 -13
  29. data/lib/sequel_core/adapters/jdbc/h2.rb +3 -11
  30. data/lib/sequel_core/adapters/jdbc/mysql.rb +0 -17
  31. data/lib/sequel_core/adapters/jdbc/postgresql.rb +3 -15
  32. data/lib/sequel_core/adapters/mysql.rb +31 -27
  33. data/lib/sequel_core/adapters/odbc.rb +34 -28
  34. data/lib/sequel_core/adapters/openbase.rb +0 -11
  35. data/lib/sequel_core/adapters/oracle.rb +11 -9
  36. data/lib/sequel_core/adapters/postgres.rb +14 -17
  37. data/lib/sequel_core/adapters/shared/mssql.rb +6 -15
  38. data/lib/sequel_core/adapters/shared/mysql.rb +29 -14
  39. data/lib/sequel_core/adapters/shared/oracle.rb +4 -0
  40. data/lib/sequel_core/adapters/shared/postgres.rb +30 -35
  41. data/lib/sequel_core/adapters/shared/progress.rb +4 -0
  42. data/lib/sequel_core/adapters/shared/sqlite.rb +73 -13
  43. data/lib/sequel_core/adapters/sqlite.rb +8 -18
  44. data/lib/sequel_core/adapters/utils/date_format.rb +21 -0
  45. data/lib/sequel_core/{dataset → adapters/utils}/stored_procedures.rb +0 -0
  46. data/lib/sequel_core/{dataset → adapters/utils}/unsupported.rb +0 -0
  47. data/lib/sequel_core/core_ext.rb +1 -1
  48. data/lib/sequel_core/core_sql.rb +9 -4
  49. data/lib/sequel_core/database.rb +63 -62
  50. data/lib/sequel_core/dataset.rb +9 -4
  51. data/lib/sequel_core/dataset/convenience.rb +10 -9
  52. data/lib/sequel_core/dataset/prepared_statements.rb +1 -1
  53. data/lib/sequel_core/dataset/sql.rb +130 -36
  54. data/lib/sequel_core/schema/sql.rb +2 -2
  55. data/lib/sequel_core/sql.rb +44 -51
  56. data/lib/sequel_core/version.rb +1 -1
  57. data/lib/sequel_model/associations.rb +25 -17
  58. data/lib/sequel_model/base.rb +35 -7
  59. data/lib/sequel_model/caching.rb +1 -6
  60. data/lib/sequel_model/record.rb +23 -5
  61. data/lib/sequel_model/validations.rb +20 -5
  62. data/spec/adapters/firebird_spec.rb +6 -1
  63. data/spec/adapters/mysql_spec.rb +12 -0
  64. data/spec/adapters/postgres_spec.rb +2 -2
  65. data/spec/adapters/sqlite_spec.rb +81 -2
  66. data/spec/integration/dataset_test.rb +2 -2
  67. data/spec/integration/type_test.rb +12 -2
  68. data/spec/sequel_core/core_sql_spec.rb +46 -12
  69. data/spec/sequel_core/database_spec.rb +24 -12
  70. data/spec/sequel_core/dataset_spec.rb +82 -32
  71. data/spec/sequel_core/schema_spec.rb +16 -0
  72. data/spec/sequel_model/associations_spec.rb +89 -0
  73. data/spec/sequel_model/base_spec.rb +66 -0
  74. data/spec/sequel_model/eager_loading_spec.rb +32 -0
  75. data/spec/sequel_model/record_spec.rb +9 -9
  76. data/spec/sequel_model/spec_helper.rb +3 -0
  77. data/spec/sequel_model/validations_spec.rb +63 -3
  78. metadata +41 -4
@@ -0,0 +1,271 @@
1
+ Model Improvements
2
+ ------------------
3
+
4
+ * one_to_many/many_to_many associations now support a :limit option,
5
+ adding a limit/offset to the records returned. This was possible
6
+ before using a block, so it is just added for convenience.
7
+
8
+ * Associations now support a :read_only option, which doesn't create
9
+ methods that modify the database.
10
+
11
+ * Associations now support a :graph_select option, which allows
12
+ specifying the columns of associated models to include when using
13
+ eager_graph.
14
+
15
+ * one_to_many associations now have a :one_to_one option. When used
16
+ it creates a getter and setter method similar to many_to_one. This
17
+ fills the same role as ActiveRecord's has_one, but it is
18
+ implemented as a couple of convenience methods over one_to_many, so
19
+ it still requires that you specify the association name as a
20
+ plural.
21
+
22
+ * Model datasets now have to_hash augmented so that it can be called
23
+ without any arguments, in which case it yields an identity map (a
24
+ hash with keys being primary key values and values being model
25
+ instances).
26
+
27
+ * The Model.set_sti_key method was added, for easily setting up
28
+ single table inheritance. It should be called only in the parent
29
+ class.
30
+
31
+ * Calls to def_dataset_method with a block are now cached and
32
+ reapplied to the new dataset if set_dataset is called afterward,
33
+ or in a subclass.
34
+
35
+ * All validation methods can now be made conditional via an :if
36
+ option, which takes either a symbol (which specifies an instance
37
+ method) or a proc (which is instance_evaled).
38
+
39
+ * Model#set and Model#update have been added back, they are now
40
+ aliases of #set_with_params and #update_with_params.
41
+
42
+ * Models now have set_only/set_except/update_only/update_except
43
+ instance methods that take a hash (like you would provide to
44
+ set or update) and additional arguments specifying which columns
45
+ to allow or disallow.
46
+
47
+ * Models now have a set_allowed_columns and set_restricted_columns
48
+ methods, which operate similarly to ActiveRecord's attr_accessible
49
+ and attr_protected. It is recommend that you use the set_only or
50
+ update_only instead of these methods, though. You can ignore the
51
+ allowed or restricted columns by using #set_all or #update_all.
52
+
53
+ * The primary key column(s) is restricted by default. To allow it to
54
+ be set via new/set/update, use:
55
+
56
+ Sequel::Model.unrestrict_primary_key # Global
57
+ Artist.unrestrict_primary_key # Per Class
58
+
59
+ * It is now easy to override the one_to_many/many_to_many association
60
+ methods that modify the database (add_/remove_/remove_all_), as
61
+ they have been broken into two methods, one that handles the
62
+ caching features and a private one (prepended with an _) that
63
+ handles the database changes (and which you can easily override
64
+ without worrying about the caching).
65
+
66
+ Table Joining
67
+ -------------
68
+
69
+ Dataset#join_table got a nice overhaul. You can now use any join
70
+ type your database allows:
71
+
72
+ DB[:artist].join_table(:natural, :albums)
73
+ DB[:numbers].join_table(:cross, :numbers)
74
+
75
+ You can now specify the conditions as
76
+
77
+ * String: "a.b = c.d" # ON a.b = c.d
78
+ * Expression :x < :y # ON x < y
79
+ * Array of Symbols: [:x, :y, :z] # USING (x, y, z)
80
+ * nil # no conditions, used for NATURAL or CROSS joins
81
+
82
+ Dataset#join_table also takes a block that yields three arguments:
83
+
84
+ * join_table_alias - The alias/name of the table currently being
85
+ joined
86
+ * last_join_table_alias - The alias name of the last table joined
87
+ (if there was one) or the first FROM table (if not).
88
+ * joins - An array of JoinClause objects for all previous joins in
89
+ the query.
90
+
91
+ Using the block you can specify conditions for complex joins without
92
+ needing to know in advance what table aliases will be used.
93
+
94
+ Expanded SQL Syntax Support
95
+ ---------------------------
96
+
97
+ SQL Case statements are now supported directly using hashes or
98
+ arrays:
99
+
100
+ {:x > 1 => 1}.case(0)
101
+ # CASE WHEN x > 1 THEN 1 ELSE 0 END
102
+ [[{:x=>1}, 0], [:x < 1, 1], [:x > 1, 2]].case(-1)
103
+ # CASE WHEN x = 1 THEN 0 WHEN x < 1 THEN 1 WHEN x > 1 THEN 2
104
+ ELSE -1 END
105
+
106
+ You should use an array instead of a hash for multiple conditions
107
+ unless all conditions are orthogonal.
108
+
109
+ The SQL extract function has special syntax:
110
+
111
+ EXTRACT(day FROM date)
112
+
113
+ This syntax is now supported via the following ruby code:
114
+
115
+ :date.extract(:day)
116
+
117
+ Other Notable Changes
118
+ ---------------------
119
+
120
+ * The sequel command line tool can now run migrations. The -m
121
+ option specifies the directory holding the migration files,
122
+ and the -M options specifies the version to which to migrate.
123
+
124
+ * The PostgreSQL adapter supports nested transactions/savepoints.
125
+
126
+ * The schema parser now understands decimal fields, and will
127
+ typecast to BigDecimal.
128
+
129
+ * PostgreSQL's numeric type is now recognized and returned as
130
+ BigDecimal.
131
+
132
+ * HAVING now comes before ORDER BY, which most databases seem to
133
+ prefer. If your database wants HAVING after ORDER BY, please
134
+ let us know.
135
+
136
+ * Symbol#qualify now exists, to specify the table name for a given
137
+ symbol, similar to the use of #as to specify an alias. This is
138
+ mainly helpful in conjuction with the #join_table block, as that
139
+ provides the table aliases to use to qualify the columns inside
140
+ the block.
141
+
142
+ * BitwiseMethods (&, |, ^, ~, <<, >>) have been added to the
143
+ NumericExpression class, so you can do the following:
144
+
145
+ (x + 1) ^ 10 # SQL: (x + 1) ^ 10
146
+ ~(x + 1) # SQL: ~(x + 1)
147
+
148
+ Usually, &, |, and ~ operate in a logical manner, but for
149
+ NumericExpressions, they take on their usual bitwise meaning,
150
+ since logical operations only make sense for booleans.
151
+
152
+ * #cast_numeric and #cast_string exist for Symbols, Strings, and
153
+ other Sequel Expressions, which return the results casted and
154
+ wrapped in either NumericExpression or StringExpression, so you
155
+ can use the BitwiseMethods (&, |, ^, ~, <<, >>) or
156
+ StringConcatenationMethods (+) directly.
157
+
158
+ # Dataset#to_hash can take only one argument, in which case it uses
159
+ that argument to specify the key, and uses the entire hash for the
160
+ value.
161
+
162
+ # Dataset#graph can now take an array of columns to select from the
163
+ joined table via the :select option.
164
+
165
+ # Dataset#filter and similar methods now combine the block and
166
+ regular argument conditions if both are given, instead of ignoring
167
+ the regular argument conditions.
168
+
169
+ # Dataset#filter(false) can now be used to make sure that no records
170
+ are returned. Dataset#filter(true) also works, but it's a no-op.
171
+ Before, these raised errors.
172
+
173
+ # Dataset#count does a subquery for a dataset using DISTINCT, since
174
+ the otherwise it would yield a count for the query without
175
+ DISTINCT.
176
+
177
+ ParseTree Support Officially Deprecated
178
+ ---------------------------------------
179
+
180
+ The support for ParseTree-based block filters has officially been
181
+ deprecated and will be removed in Sequel 2.2. To use the
182
+ expression filters (which don't require ParseTree) inside blocks,
183
+ use:
184
+
185
+ SEQUEL_NO_PARSE_TREE = true
186
+ require 'sequel'
187
+ # OR
188
+ require 'sequel'
189
+ Sequel.use_parse_tree = false
190
+
191
+ This is the default if ParseTree cannot be loaded. If ParseTree
192
+ can be loaded, it remains the default, in order not to immediately
193
+ break existing code.
194
+
195
+ With this set, you can use the expression filters inside of blocks:
196
+
197
+ dataset.filter{((:x + 1) & 10 < :y) & :z}
198
+
199
+ That doesn't gain you all that much, but there are some methods
200
+ that feed block arguments into filter, such as the following:
201
+
202
+ dataset.first(5){((:x + 1) & 10 < :y) & :z}
203
+
204
+ Which will get you the first 5 records matching the condition.
205
+
206
+ Backwards Incompatible Changes
207
+ ------------------------------
208
+
209
+ * To change the datetime classe used from Time to DateTime, you
210
+ now use:
211
+
212
+ Sequel.datetime_class = DateTime # instead of Sequel.time_class
213
+
214
+ * Models now raise errors if you try to access a missing or
215
+ restricted method via new/set/update, instead of just silently
216
+ skipping that parameter. To get the old behavior:
217
+
218
+ Sequel::Model.strict_param_setting = false
219
+
220
+ * The association_dataset method now takes into account the :eager
221
+ option and the block argument, where it didn't before. It also
222
+ takes into account the new :limit option.
223
+
224
+ * Association methods now raise errors in most cases if the model
225
+ doesn't have a valid primary key.
226
+
227
+ * Dataset#join_table used to allow a symbol as a conditions argument
228
+ as a shortcut for a hash:
229
+
230
+ DB[:artist].join(:albums, :artist_id)
231
+ # ON albums.artist_id = artists.id
232
+
233
+ With the changes to #join_table, this no longer works. It would
234
+ now be interpreted as a boolean column:
235
+
236
+ DB[:artist].join(:albums, :artist_id)
237
+ # ON artists.id
238
+
239
+ Use the following slightly longer version for the old behavior:
240
+
241
+ DB[:artist].join(:albums, :artist_id=>:id)
242
+ # ON albums.artist_id = artists.id
243
+
244
+ * MySQL users need to be careful when upgrading, the following code
245
+ will once again cause an error:
246
+
247
+ DB[:artists].each{|artist| DB[:albums].each{|album| ...}}
248
+
249
+ To fix it, change the code to:
250
+
251
+ DB[:artists].all{|artist| DB[:albums].each{|album| ...}}
252
+
253
+ The issue is the MySQL adapter doesn't release the database
254
+ connection while running each, and the second call to each gets the
255
+ same database connection (while the other query is still running),
256
+ because it is in the same thread. Using #all for the outside query
257
+ ensures that the database connection is released before the block is
258
+ called.
259
+
260
+ The reason for this change was that the workaround provided for
261
+ MySQL could potentially cause issues with transactions for all
262
+ adapters.
263
+
264
+ * String#asc and String#desc are no longer defined, as ordering on a
265
+ plain string column should be a no-op. They are still defined
266
+ on LiteralStrings.
267
+
268
+ * You can no longer abuse the SQL::Function syntax to use a table
269
+ alias with specified columns (e.g. :table[:col1, :col2, :col3])
270
+ or to cast to types (e.g. :x.cast_as(:varchar[20])). Use a
271
+ LiteralString in both cases.
@@ -0,0 +1,328 @@
1
+ New Supported Adapters and Databases
2
+ ------------------------------------
3
+
4
+ * A DataObjects adapter was added that supports PostgreSQL,
5
+ MySQL, and SQLite. DataObjects is the underlying database
6
+ library used by DataMapper, and has potential performance
7
+ advantages by doing all typecasting in C.
8
+
9
+ * A Firebird Adapter was added, it requires the modified Ruby
10
+ Fb adapter found at http://github.com/wishdev/fb.
11
+
12
+ * An H2 JDBC subadapter was added, based on the code used in JotBot.
13
+ H2 is an embeddable Java database, and may be preferable to using
14
+ SQLite on JDBC because SQLite requires native code.
15
+
16
+ New Core Features
17
+ -----------------
18
+
19
+ * Sequel now has database independent migrations. Before, column
20
+ types in migrations were not translated per database, so it was
21
+ difficult to set up a migration that worked on multiple databases.
22
+ Sequel now accepts ruby classes as database types, in addition to
23
+ symbols and strings. If a ruby class is used, it is translated
24
+ to the most appropriate database type. Here is an example using
25
+ all supported classes (with Sequel's default database type):
26
+
27
+ DB.create_table(:cats) do
28
+ primary_key :id, :type=>Integer # integer
29
+ String :a # varchar(255)
30
+ column :b, File # blob
31
+ Fixnum :c # integer
32
+ foreign_key :d, :other_table, :type=>Bignum # bigint
33
+ Float :e # double precision
34
+ BigDecimal :f # numeric
35
+ Date :g # date
36
+ DateTime :h # timestamp
37
+ Time :i # timestamp
38
+ Numeric :j # numeric
39
+ TrueClass :k # boolean
40
+ FalseClass :l # boolean
41
+ end
42
+
43
+ Type translations were tested on the PostgreSQL, MySQL, SQLite,
44
+ and H2 databases. The default translations should work OK for
45
+ most databases, but there will probably be a type or two that
46
+ doesn't work. Please send in a patch if Sequel uses a column type
47
+ that doesn't work on your database.
48
+
49
+ Note that existing migrations still work fine, in most cases. If
50
+ you were using strings or symbols for types before, they should
51
+ still work. See the Backwards Compatibility section below for
52
+ details.
53
+
54
+ Also note that this doesn't relate solely to migrations, as any
55
+ database schema modification method that accepts types will
56
+ accept one of the above classes.
57
+
58
+ * A ton of internal work was done to better support databases that
59
+ fold unqouted identifiers to uppercase (which is the SQL standard).
60
+ Sequel now allows you to set a method to call on identifiers going
61
+ both into and out of the database. The default is to downcase
62
+ identifiers coming out, and upcase identifiers going in, though
63
+ this is overridden by the PostgreSQL, MySQL, and SQLite adapters
64
+ to not do anything (since they fold to lowercase by default).
65
+
66
+ The settings are called identifier_input_method and
67
+ identifier_output_method, and like most Sequel settings, they can
68
+ be set globally, per database, or per dataset:
69
+
70
+ # Global (use uppercase in ruby and lowercase in the database)
71
+ Sequel.identifier_input_method = :downcase
72
+ Sequel.identifier_output_method = :upcase
73
+ # Per Database (use camelized names in the database, and
74
+ # underscored names in ruby)
75
+ DB.identifier_input_method = :camelize
76
+ DB.identifier_output_method = :underscore
77
+ # Per Dataset (obfuscate your database columns!)
78
+ class String; def rot_13; tr('A-Za-z', 'N-ZA-Mn-za-m') end end
79
+ ds = DB[:table]
80
+ ds.identifier_input_method = :rot_13
81
+ ds.identifier_output_method = :rot_13
82
+
83
+ * Schema parsing support was added to the JDBC adapter, using the
84
+ JDBC metadata methods. This means that models that use the
85
+ JDBC adapter will typecast data in their column setters and
86
+ automatically select the correct primary key column(s). This is
87
+ currently the only adapter that supports schema parsing when using
88
+ an MSSQL or Oracle database.
89
+
90
+ * Database#create_table now takes options, which you can use to
91
+ specify a MySQL engine, charset, and/or collation. You can also
92
+ set a default engine, charset, and collation for MySQL to use:
93
+
94
+ Sequel::MySQL.default_engine = 'InnoDB'
95
+ Sequel::MySQL.default_charset = 'utf8'
96
+ Sequel::MySQL.default_collate = 'utf8'
97
+
98
+ The defaults will be used if the options are not provided. If a
99
+ default engine is set, you can specify :engine=>nil to not use it
100
+ (same goes for charset and collate).
101
+
102
+ * The Sequel::DatabaseConnectionError exception class was added. It
103
+ is raised by the connection pool if there is an error attempting
104
+ to instantiate a database connection. Also, if the adapter returns
105
+ nil instead of raising an error for faulty connection parameters,
106
+ DatabaseConnectionError will be raised immediately, instead of the
107
+ connection pool busy waiting until if gives up with a
108
+ PoolTimeoutError.
109
+
110
+ * Database#tables is now supported on the JDBC adapter, returning
111
+ an Array of table name symbols.
112
+
113
+ * Sequel now converts the following Java types returned by the JDBC
114
+ adapter into ruby types: Java::JavaSQL::Timestamp,
115
+ Java::JavaSQL::Time, Java::JavaSQL::Date,
116
+ Java::JavaMath::BigDecimal, and Java::JavaIo::BufferedReader.
117
+
118
+ * When using the PostgreSQL adapter with the postgres-pr driver,
119
+ Sequel will use a custom string escaping routine unless
120
+ force_standard_strings = false. This means that using Sequel's
121
+ defaults, postgres-pr will correctly escape strings now.
122
+
123
+ * The SQLite adapter now returns float, real, and double precision
124
+ columns as Floats.
125
+
126
+ * The SQLite adapter logs beginning, committing, and rolling back
127
+ transactions.
128
+
129
+ * Sequel now has an internal version (before, the only way to tell
130
+ the version was to look at the gem being used). It is accessible
131
+ at Sequel.version.
132
+
133
+ New Model Features
134
+ ------------------
135
+
136
+ * A new validates_not_string validation was added for Sequel Models.
137
+ It is intended to be used with the raise_on_typecast_failure =
138
+ false setting. In this case, for a non-string database column,
139
+ if there is a string value when the record is going to be
140
+ saved, it is due to the fact that Sequel was not able to typecast
141
+ the given data correctly (so it is almost certainly not valid).
142
+ This should make Sequel easier to use with web applications.
143
+
144
+ * An :allow_missing validation option was added to all standard
145
+ validations. This option skips the validation if the attribute
146
+ is not in the object's values. It is different from :allow_nil,
147
+ which will skip the value if it is present but nil in the values.
148
+ The intended use case for this option is when the database provides
149
+ a good default. If the attribute is not present in values, the
150
+ database will use its default. If the attribute is present in
151
+ the values but equals nil, Sequel will attempt to insert it into
152
+ the database as a NULL value, instead of using the database's
153
+ default. If you don't want Sequel to insert a NULL value in the
154
+ database, but you want the database to provide the default, this
155
+ is the option to use.
156
+
157
+ * validates_each now accepts :allow_nil and :allow_blank options,
158
+ so it is easier to create custom validations with the same options
159
+ as the standard validations.
160
+
161
+ * Before_* hooks now run in the reverse order that they were added.
162
+ The purpose of hooks is to wrap existing functionality, and making
163
+ later before_* hooks run before previous before_* hooks is the
164
+ correct behavior.
165
+
166
+ * You can now add you own hook types, via Model.add_hook_type. This
167
+ is intended for plugin use. All of the standard hooks are now
168
+ implemented using this method.
169
+
170
+ * The value of new? in a after_save hook now reflects the
171
+ previous state of the model (so true for a create and false for an
172
+ update), instead of always being false. This makes it easier
173
+ to have a complex after_save hook that still needs to
174
+ differentiate between a newly created record and an updated record,
175
+ without having to add separate after_create and after_update
176
+ hooks.
177
+
178
+ * The value of changed_columns in an after_update hook now reflects
179
+ the value before the update occurred, instead of usually being
180
+ empty. Previously, to have this functionality, you generally had
181
+ to save the value to an instance variable in a before_update hook
182
+ so you could reference it in the after_update hook.
183
+
184
+ Other Improvements
185
+ ------------------
186
+
187
+ * Sequel now longer overwrites the following Symbol instance methods
188
+ when running on ruby 1.9: [], <, <=, >, and >=. One of Sequel's
189
+ principals is that it does not override methods defined by ruby,
190
+ and now that ruby 1.9 defines the above methods on Symbol, Sequel
191
+ shouldn't be overwriting them.
192
+
193
+ Sequel already provides a way to work around this issue when
194
+ another library adds the same methods to Symbol that Sequel does.
195
+ For example, you need to change the following:
196
+
197
+ dataset.filter(:number > 1)
198
+ dataset.filter(:number >= 2)
199
+ dataset.filter(:name < 'M')
200
+ dataset.filter(:name <= 'I')
201
+ dataset.filter(:is_bool[:x])
202
+
203
+ To:
204
+
205
+ dataset.filter{|o| o.number > 1}
206
+ dataset.filter{|o| o.number >= 2}
207
+ dataset.filter{|o| o.name < 'M'}
208
+ dataset.filter{|o| o.name <= 'I'}
209
+ dataset.filter{|o| o.is_bool(:x)}
210
+
211
+ The argument provided to the block is a Sequel::SQL::VirtualRow.
212
+ This class uses method_missing so that any methods called on it
213
+ return Sequel::SQL::Identifiers (if no arguments are provided)
214
+ or Sequel::SQL::Function (if arguments are provided).
215
+
216
+ If you were using one of the above symbol methods outside of a
217
+ filter, you can to call sql_string, sql_number, or sql_function
218
+ on the symbol. So the following would also work:
219
+
220
+ dataset.filter(:number.sql_number > 1)
221
+ dataset.filter(:number.sql_number >= 2)
222
+ dataset.filter(:name.sql_string < 'M')
223
+ dataset.filter(:name.sql_number <= 'I')
224
+ dataset.filter(:is_bool.sql_function(:x))
225
+
226
+ Using the block argument makes for a nicer API, though, so I
227
+ recommend using it when possible.
228
+
229
+ Note that if you are running ruby 1.8 or jruby without the --1.9
230
+ flag, you don't need to worry. If you are running ruby 1.9 or
231
+ jruby --1.9, or you plan to at some point in the future, you
232
+ should inspect your code for existing uses of these methods.
233
+ Here are a couple command lines that should find most uses:
234
+
235
+ # Find :symbol[]
236
+ egrep -nr ':['\''"]?[a-zA-Z_0-9]*['\''"]?\[' *
237
+ # Find :symbol (<|>|<=|>=)
238
+ egrep -nr '[^:]:['\''"]?[a-zA-Z_0-9]*['\''"]? *[<>]=?' *
239
+
240
+ * Database#quote_identifiers now affects future schema modifications
241
+ when using the database. Previous, it only affected future
242
+ schema modifications if a schema modification method had not yet
243
+ been called.
244
+
245
+ * Literalization of Times and DateTimes is now correct when using the
246
+ MySQL JDBC subadapter.
247
+
248
+ * Literalization of Blobs is now correct when using the PostgreSQL
249
+ JDBC subadapter.
250
+
251
+ * Index and table names are quoted when creating indices in the
252
+ PostgreSQL adapter.
253
+
254
+ * Dataset#delete was changed in the SQLite adapter to add a
255
+ where clause that is always true, instead of doing an explicit
256
+ count first and the deleting. This is simpler, though it
257
+ could potentially have performance implications.
258
+
259
+ * The sequel command line tool now supports symbol keys and unnested
260
+ hashes in YAML files, so it should work with Merb's database.yml.
261
+ It also includes the error class in the case of an error.
262
+
263
+ * The integration type tests were greatly expanded. Generally,
264
+ running the integration tests is a good way to determine how well
265
+ your database is supported.
266
+
267
+ * Dataset#quote_identifier now returns LiteralStrings as-is, instead
268
+ of treating them as regular strings.
269
+
270
+ * Sequel no longer modifies the MySQL::Result class when using the
271
+ MySQL adapter.
272
+
273
+ Backwards Compatibilty
274
+ ----------------------
275
+
276
+ * If you were previously using a database that returned uppercase
277
+ identifiers, it will probably return lowercase identifiers by
278
+ default now. To get back the old behavior:
279
+
280
+ DB.identifier_output_method = nil
281
+
282
+ * The module hierarchy under Sequel::SQL has changed. Now,
283
+ modules do not include other modules, and the following modules
284
+ were removed since they would have been empty after removing
285
+ the modules they included: Sequel::SQL::SpecificExpressionMethods
286
+ and Sequel::SQL::GenericExpressionMethods.
287
+
288
+ * Sequel no longer assumes the public schema by default when
289
+ connecting to PostgreSQL. You can still set the default
290
+ schema to use (even to public).
291
+
292
+ * The ability to load schema information for all tables at once
293
+ was removed from the PostgreSQL adapter. While it worked, it had
294
+ some issues, and it was difficult to keep it working when some
295
+ new features were used. This ability wasn't exposed to the user,
296
+ and was purely an optimization. If you have any code like:
297
+
298
+ DB.schema
299
+
300
+ by itself after the Database object was instantiated, you should
301
+ remove it.
302
+
303
+ * The Database#primary_key API changed in the PostgreSQL shared
304
+ adapter, it now accepts an options hash with :server and :conn keys
305
+ instead of a server symbol. Also, quite a few private Database
306
+ instance methods changed, as well as some constants in the
307
+ AdapterMethods.
308
+
309
+ * It is possible that some migrations will break, though it is
310
+ unlikely. If you were using any of the classes mentioned above
311
+ as a method inside a migration, it might be broken. However,
312
+ since String, Float, and Integer wouldn't have worked as methods
313
+ before, it is unlikely that anyone used this.
314
+
315
+ * The meaning of #String, #Integer, and #Float inside
316
+ Sequel::SQL::Generator (i.e. inside a Database#create_table
317
+ block) has changed. Before, these used to call private Kernel
318
+ methods, now, they set up columns with the appropriate database
319
+ type.
320
+
321
+ * The Database#lowercase method in the DBI adapter was removed,
322
+ as its use case is now met by the identifier_output_method support.
323
+
324
+ * Database#uri is now aliased explicitly via a real method, to
325
+ allow for easier subclassing.
326
+
327
+ * You can no longer pass nil as the second argument to
328
+ Database#create_table.