sequel 3.1.0 → 3.2.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 (65) hide show
  1. data/CHANGELOG +76 -0
  2. data/Rakefile +2 -2
  3. data/bin/sequel +9 -4
  4. data/doc/opening_databases.rdoc +279 -0
  5. data/doc/release_notes/3.2.0.txt +268 -0
  6. data/doc/virtual_rows.rdoc +42 -51
  7. data/lib/sequel/adapters/ado.rb +2 -5
  8. data/lib/sequel/adapters/db2.rb +5 -0
  9. data/lib/sequel/adapters/do.rb +3 -0
  10. data/lib/sequel/adapters/firebird.rb +6 -4
  11. data/lib/sequel/adapters/informix.rb +5 -3
  12. data/lib/sequel/adapters/jdbc.rb +10 -8
  13. data/lib/sequel/adapters/jdbc/h2.rb +17 -4
  14. data/lib/sequel/adapters/mysql.rb +6 -19
  15. data/lib/sequel/adapters/odbc.rb +14 -18
  16. data/lib/sequel/adapters/openbase.rb +8 -0
  17. data/lib/sequel/adapters/shared/mssql.rb +14 -8
  18. data/lib/sequel/adapters/shared/mysql.rb +53 -28
  19. data/lib/sequel/adapters/shared/oracle.rb +21 -12
  20. data/lib/sequel/adapters/shared/postgres.rb +46 -26
  21. data/lib/sequel/adapters/shared/progress.rb +10 -5
  22. data/lib/sequel/adapters/shared/sqlite.rb +28 -12
  23. data/lib/sequel/adapters/sqlite.rb +4 -3
  24. data/lib/sequel/adapters/utils/stored_procedures.rb +18 -9
  25. data/lib/sequel/connection_pool.rb +4 -3
  26. data/lib/sequel/database.rb +110 -10
  27. data/lib/sequel/database/schema_sql.rb +12 -3
  28. data/lib/sequel/dataset.rb +40 -3
  29. data/lib/sequel/dataset/convenience.rb +0 -11
  30. data/lib/sequel/dataset/graph.rb +25 -11
  31. data/lib/sequel/dataset/sql.rb +176 -68
  32. data/lib/sequel/extensions/migration.rb +37 -21
  33. data/lib/sequel/extensions/schema_dumper.rb +8 -61
  34. data/lib/sequel/model.rb +3 -3
  35. data/lib/sequel/model/associations.rb +9 -1
  36. data/lib/sequel/model/base.rb +8 -1
  37. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  38. data/lib/sequel/sql.rb +125 -18
  39. data/lib/sequel/version.rb +1 -1
  40. data/spec/adapters/ado_spec.rb +1 -0
  41. data/spec/adapters/firebird_spec.rb +1 -0
  42. data/spec/adapters/informix_spec.rb +1 -0
  43. data/spec/adapters/mysql_spec.rb +23 -8
  44. data/spec/adapters/oracle_spec.rb +1 -0
  45. data/spec/adapters/postgres_spec.rb +52 -4
  46. data/spec/adapters/spec_helper.rb +2 -2
  47. data/spec/adapters/sqlite_spec.rb +2 -1
  48. data/spec/core/connection_pool_spec.rb +16 -0
  49. data/spec/core/database_spec.rb +174 -0
  50. data/spec/core/dataset_spec.rb +121 -26
  51. data/spec/core/expression_filters_spec.rb +156 -0
  52. data/spec/core/object_graph_spec.rb +20 -1
  53. data/spec/core/schema_spec.rb +5 -5
  54. data/spec/extensions/migration_spec.rb +140 -74
  55. data/spec/extensions/schema_dumper_spec.rb +3 -69
  56. data/spec/extensions/single_table_inheritance_spec.rb +6 -0
  57. data/spec/integration/dataset_test.rb +84 -2
  58. data/spec/integration/schema_test.rb +24 -5
  59. data/spec/integration/spec_helper.rb +8 -6
  60. data/spec/model/eager_loading_spec.rb +9 -0
  61. data/spec/model/record_spec.rb +35 -8
  62. metadata +8 -7
  63. data/lib/sequel/adapters/utils/date_format.rb +0 -21
  64. data/lib/sequel/adapters/utils/savepoint_transactions.rb +0 -80
  65. data/lib/sequel/adapters/utils/unsupported.rb +0 -50
data/CHANGELOG CHANGED
@@ -1,3 +1,79 @@
1
+ === 3.2.0 (2009-07-02)
2
+
3
+ * In the STI plugin, don't overwrite the STI field if it is already set (jeremyevans)
4
+
5
+ * Add support for Common Table Expressions, which use the SQL WITH clause (jeremyevans)
6
+
7
+ * Add SQL::WindowFunction, expand virtual row blocks to support them and other constructions (jeremyevans)
8
+
9
+ * Add Model#autoincrementing_primary_key, for when the autoincrementing key isn't the same as the primary key (jeremyevans)
10
+
11
+ * Add Dataset#ungraphed, to remove the splitting of results into subhashes or associated records (jeremyevans)
12
+
13
+ * Support :opclass option for PostgreSQL indexes (tmi, jeremyevans)
14
+
15
+ * Make parsing of server's version more reliable for PostgreSQL (jeremyevans)
16
+
17
+ * Add Dataset#qualify, which is qualify_to with a first_source default (jeremyevans)
18
+
19
+ * Add :ruby_default to parsed schema information, which contains a ruby object representing the database default (jeremyevans)
20
+
21
+ * Fix changing a column's name, type, or null status on MySQL when column has a string default (jeremyevans)
22
+
23
+ * Remove Dataset#to_table_reference protected method, no longer used (jeremyevans)
24
+
25
+ * Fix thread-safety issue in stored procedure code (jeremyevans)
26
+
27
+ * Remove SavepointTransactions module, integrate into Database code (jeremyevans)
28
+
29
+ * Add supports_distinct_on? method (jeremyevans)
30
+
31
+ * Remove SQLStandardDateFormat, replace with requires_sql_standard_datetimes? method (jeremyevans)
32
+
33
+ * Remove UnsupportedIsTrue module, replace with supports_is_true? method (jeremyevans)
34
+
35
+ * Remove UnsupportedIntersectExcept(All)? modules, replace with methods (jeremyevans)
36
+
37
+ * Make Database#indexes work on PostgreSQL versions prior to 8.3 (tested on 7.4) (jeremyevans)
38
+
39
+ * Fix bin/sequel using a YAML file on 1.9 (jeremyevans)
40
+
41
+ * Allow connection pool options to be specified in connection string (jeremyevans)
42
+
43
+ * Handle :user and :password options in the JDBC adapter (jeremyevans)
44
+
45
+ * Fix warnings when using the ODBC adapter (jeremyevans)
46
+
47
+ * Add opening_databases.rdoc file for describing how to connect to a database (mwlang, jeremyevans)
48
+
49
+ * Significantly increase JDBC select performance (jeremyevans)
50
+
51
+ * Slightly increase SQLite select performance using the native adapter (jeremyevans)
52
+
53
+ * Majorly increase MySQL select performance using the native adapter (jeremyevans)
54
+
55
+ * Pass through unsigned/elements/size and other options when altering columns on MySQL (tmm1)
56
+
57
+ * Allow on_duplicate_key_update to affect Dataset#insert on MySQL (tmm1)
58
+
59
+ * Support using a given table and column to store schema versions, using new Migrator.run method (bougyman, jeremyevans)
60
+
61
+ * Fix foreign key table constraints on MySQL (jeremyevans)
62
+
63
+ * Remove Dataset#table_exists?, use Database#table_exists? instead (jeremyevans)
64
+
65
+ * Fix graphing of datasets with dataset sources (jeremyevans) (#271)
66
+
67
+ * Raise a Sequel::Error if Sequel.connect is called with something other than a Hash or String (jeremyevans) (#272)
68
+
69
+ * Add -N option to bin/sequel to not test the database connection (jeremyevans)
70
+
71
+ * Make Model.grep call Dataset#grep instead of Enumerable#grep (jeremyevans)
72
+
73
+ * Support the use of Regexp as first argument to StringExpression.like (jeremyevans)
74
+
75
+ * Fix Database#indexes on PostgreSQL when the schema used is a symbol (jeremyevans)
76
+
1
77
  === 3.1.0 (2009-06-04)
2
78
 
3
79
  * Require the classes match to consider an association a reciprocal (jeremyevans) (#270)
data/Rakefile CHANGED
@@ -164,14 +164,14 @@ begin
164
164
 
165
165
  desc "Run integration tests"
166
166
  Spec::Rake::SpecTask.new("integration") do |t|
167
- t.spec_files = FileList["spec/integration/*_test.rb"]
167
+ t.spec_files = Dir["spec/integration/*_test.rb"]
168
168
  t.spec_opts = spec_opts.call
169
169
  end
170
170
 
171
171
  %w'postgres sqlite mysql informix oracle ado'.each do |adapter|
172
172
  desc "Run #{adapter} specs without coverage"
173
173
  Spec::Rake::SpecTask.new("spec_#{adapter}") do |t|
174
- t.spec_files = ["spec/adapters/#{adapter}_spec.rb"]
174
+ t.spec_files = ["spec/adapters/#{adapter}_spec.rb"] + Dir["spec/integration/*_test.rb"]
175
175
  t.spec_opts = spec_opts.call
176
176
  end
177
177
  end
data/bin/sequel CHANGED
@@ -13,6 +13,7 @@ logfile = nil
13
13
  migrate_dir = nil
14
14
  migrate_ver = nil
15
15
  backtrace = nil
16
+ test_connection = true
16
17
  load_dirs = []
17
18
 
18
19
  opts = OptionParser.new do |opts|
@@ -69,6 +70,10 @@ opts = OptionParser.new do |opts|
69
70
  migrate_ver = Integer(v)
70
71
  end
71
72
 
73
+ opts.on("-N", "--no-test-connection", "do not test the connection") do
74
+ test_connection = false
75
+ end
76
+
72
77
  opts.on("-t", "--trace", "Output the full backtrace if an exception is raised") do
73
78
  backtrace = true
74
79
  end
@@ -100,21 +105,22 @@ if logfile || echo
100
105
  end
101
106
 
102
107
  connect_proc = lambda do |database|
103
- if File.exist?(database)
108
+ db = if File.exist?(database)
104
109
  require 'yaml'
105
110
  env ||= "development"
106
111
  db_config = YAML.load_file(database)
107
112
  db_config = db_config[env] || db_config[env.to_sym] || db_config
108
- db_config.each{|(k,v)| db_config[k.to_sym] = db_config.delete(k)}
113
+ db_config.keys.each{|k| db_config[k.to_sym] = db_config.delete(k)}
109
114
  Sequel.connect(db_config.merge!(db_opts))
110
115
  else
111
116
  Sequel.connect(database, db_opts)
112
117
  end
118
+ db.test_connection if test_connection
119
+ db
113
120
  end
114
121
 
115
122
  begin
116
123
  DB = connect_proc[db]
117
- DB.test_connection
118
124
  if migrate_dir
119
125
  Sequel.extension :migration
120
126
  Sequel::Migrator.apply(DB, migrate_dir, migrate_ver)
@@ -132,7 +138,6 @@ begin
132
138
  error_proc["Error: Must specify database connection string or path to yaml file as second argument for database you want to copy to"] if db2.nil? || db2.empty?
133
139
  start_time = Time.now
134
140
  TO_DB = connect_proc[db2]
135
- TO_DB.test_connection
136
141
  same_db = DB.database_type==TO_DB.database_type
137
142
 
138
143
  puts "Databases connections successful"
@@ -0,0 +1,279 @@
1
+ = Connecting to a database
2
+
3
+ All Sequel activity begins with connecting to a database, which creates a
4
+ Sequel::Database object. The Database object is used to create datasets and execute
5
+ queries. Sequel provides a powerful and flexible mechanism for connecting to
6
+ databases. There are two main ways to establish database connections:
7
+
8
+ 1. Using the Sequel.connect method
9
+ 2. Using the specialized adapter method (Sequel.sqlite, Sequel.postgres, etc.)
10
+
11
+ The connection options needed depend on the adapter being used, though most adapters
12
+ share the same basic connection options.
13
+
14
+ If you are only connecting to a single database, it is recommended that you store the
15
+ database object in a constant named DB. This should never be required, but it is the
16
+ convention that most Sequel code uses.
17
+
18
+ == Using the Sequel.connect method
19
+
20
+ The connect method usually takes a well-formed URI, which is parsed into connection options needed to open
21
+ the database connection. The scheme/protocol part of the URI is used to determine the adapter to use:
22
+
23
+ DB = Sequel.connect('postgres://user:password@localhost/blog') # Uses the postgres adapter
24
+
25
+ You can use URI query parameters to specify options:
26
+
27
+ DB = Sequel.connect('postgres://localhost/blog?user=user&password=password')
28
+
29
+ You can also pass an additional option hash with the connection string:
30
+
31
+ DB = Sequel.connect('postgres://localhost/blog' :user=>'user', :password=>'password')
32
+
33
+ You can also just use an options hash without a connection string. If you do this, you must
34
+ provide the adapter to use:
35
+
36
+ DB = Sequel.connect(:adapter=>'postgres', :host=>'localhost', :database=>'blog', :user=>'user', :password=>'password')
37
+
38
+ All of the above statements are equivalent.
39
+
40
+ == Using the specialized adapter method
41
+
42
+ The specialized adapter method is similar to Sequel.connect with an options hash, except that it
43
+ automatically populates the :adapter option and assumes the first argument is the :database option,
44
+ unless the first argument is a hash. So the following statements are equivalent to the previous statements.
45
+
46
+ DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
47
+ DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
48
+
49
+ == Passing a block to either method
50
+
51
+ Both the Sequel.connect method and the specialized adapter methods take a block. If you
52
+ provide a block to the method, Sequel will open the connection and pass it as an argument
53
+ to the block. When the block is exited, Sequel will disconnect the database connection.
54
+ For example:
55
+
56
+ Sequel.connect('sqlite://blog.db'){|db| puts db[:users].count}
57
+
58
+ == General connection options
59
+
60
+ These options are shared by all adapters unless otherwise noted.
61
+
62
+ * :adapter - The adapter to use
63
+ * :database - The name of the database to which to connect
64
+ * :default_schema - The database schema to use by default.
65
+ * :host - The hostname of the database server to which to connect
66
+ * :logger - An array of SQL loggers to log to
67
+ * :loggers - An array of SQL loggers to log to
68
+ * :password - The password for the user account
69
+ * :servers - A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
70
+ * :single_threaded - Whether to use the single-threaded (non-thread safe) connection pool
71
+ * :user - The user account name to use logging in
72
+
73
+ The following options can be specified and are passed to the the database's internal connection pool.
74
+
75
+ * :max_connections - The maximum size of the connection pool (default: 4 connections on most databases)
76
+ * :pool_sleep_time - The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
77
+ * :pool_timeout - The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
78
+
79
+ == Adapter specific connection options
80
+
81
+ The following sections explain the options and behavior specific to each adapter.
82
+ If the library the adapter requires is different from the name of the adapter
83
+ scheme, it is listed specifically, otherwise you can assume that is requires the
84
+ library with the same name.
85
+
86
+ === ado
87
+
88
+ Requires: win32ole
89
+
90
+ The ADO adapter provides connectivity to ADO databases in Windows. It relies
91
+ on WIN32OLE library, so it isn't usable on other operating systems (except
92
+ possibly through WINE, but that's fairly unlikely).
93
+
94
+ The following options are supported:
95
+ * :driver - The driver to use. The default if not specified is 'SQL Server'.
96
+ * :command_timeout - Sets the time in seconds to wait while attempting
97
+ to execute a command before cancelling the attempt and generating
98
+ an error. Specifically, it sets the ADO CommandTimeout property.
99
+ If this property is not set, the default of 30 seconds is used.
100
+ * :provider - Sets the Provider of this ADO connection (for example, "SQLOLEDB")
101
+
102
+ === amalgalite
103
+
104
+ Amalgalite is an ruby extension that provides self contained access to SQLite,
105
+ so you don't need to install SQLite separately. As amalgalite is a file backed
106
+ database, the :host, :user, and :password options are not used.
107
+
108
+ * :database - The name of the database file
109
+ * :timeout - The busy timeout period given in milliseconds
110
+
111
+ Without a database argument, assumes a memory database, so you can do:
112
+
113
+ Sequel.amalgalite
114
+
115
+ Handles paths in the connection string similar to the SQLite adapter, so see
116
+ the sqlite section below for details.
117
+
118
+ === db2
119
+
120
+ Requires: db2/db2cli
121
+
122
+ I'm not even sure exactly how this works, or if it works at all (I've never heard from
123
+ anyone who attempted to use it). It uses the SQL_HANDLE_DBC constant to
124
+ get a handle, and respects the :database, :user, and :password options. It doesn't
125
+ appear to respect the :host or :port options.
126
+
127
+ === dbi
128
+
129
+ Allows access to a multitude of databases via ruby-dbi. Additional options:
130
+
131
+ * :db_type - Specifying 'mssql' allows Microsoft SQL Server specific syntax to
132
+ be used. Otherwise has no effect.
133
+
134
+ DBI connection strings are a preprocessed a bit, and are specified with a dbi-
135
+ in front of the protocol. Examples:
136
+
137
+ dbi-ado://...
138
+ dbi-db2://...
139
+ dbi-frontbase://...
140
+ dbi-interbase://...
141
+ dbi-msql://...
142
+ dbi-mysql://...
143
+ dbi-odbc://...
144
+ dbi-oracle://...
145
+ dbi-pg://...
146
+ dbi-proxy://...
147
+ dbi-sqlite://...
148
+ dbi-sqlrelay://...
149
+
150
+ While the DBI adapter does work, it is recommended that you use another adapter
151
+ if your database supports it.
152
+
153
+ === do
154
+
155
+ Requires: data_objects
156
+
157
+ The DataObjects adapter supports PostgreSQL, MySQL, and SQLite. One possible
158
+ advantage of using DataObjects is that it does the typecasting in C, which may
159
+ be faster than the other adapters.
160
+
161
+ Similar to the JDBC adapter, the DO adapter only cares about connection strings,
162
+ which can either be the String argument given to Sequel.connect directly or contained
163
+ in a :uri or :url option. The DO adapter passes through the connection string
164
+ directly to DataObjects, it does no processing of it.
165
+
166
+ Connection string examples:
167
+
168
+ do:sqlite3::memory:
169
+ do:postgres://user:password@host/database
170
+ do:mysql://user:password@host/database
171
+
172
+ === firebird
173
+
174
+ Requires: fb (using code at http://github.com/wishdev/fb)
175
+
176
+ Does not support the :port option.
177
+
178
+ === informix
179
+
180
+ Does not support the :host or :port options.
181
+
182
+ === jdbc
183
+
184
+ Requires: java
185
+
186
+ Houses Sequel's JDBC support when running on JRuby.
187
+ Support for individual database types is done using sub adapters.
188
+ There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
189
+ Oracle, and MSSQL. All except Oracle and MSSQL can load the
190
+ JDBC gem, for those you need to have the .jar in your CLASSPATH
191
+ or load the Java class manually.
192
+
193
+ You just use the JDBC connection string directly, which can be specified
194
+ via the string given to Sequel.connect or via the :uri, :url, or :database options.
195
+ Sequel does no preprocessing of the string, it passes it directly to JDBC.
196
+ So if you have problems getting a connection string to work, look up the JDBC
197
+ documentation.
198
+
199
+ Example connections strings:
200
+
201
+ jdbc:sqlite::memory:
202
+ jdbc:postgresql://localhost/database?user=username
203
+ jdbc:mysql://localhost/test?user=root&password=root
204
+ jdbc:h2:mem:
205
+
206
+ === mysql
207
+
208
+ The MySQL adapter does not support the pure-ruby MySQL adapter that ships with
209
+ ActiveRecord, it requires the native adapter.
210
+
211
+ The following additional options are supported:
212
+
213
+ * :auto_is_null - If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
214
+ * :charset - Same as :encoding, :encoding takes precedence.
215
+ * :compress - Whether to compress data sent/received via the socket connection.
216
+ * :encoding - Specify the encoding/character set to use for the connection.
217
+ * :socket - Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
218
+ * :timeout - Sets the wait_timeout for the connection, defaults to 1 month.
219
+
220
+ === odbc
221
+
222
+ The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
223
+ The :database option given ODBC database should be the DSN (Descriptive Service Name) from the ODBC configuration.
224
+
225
+ Sequel.odbc('mydb', :user => "user", :password => "password")
226
+
227
+ The :host and :port options are not respected. The following additional options are supported:
228
+
229
+ * :db_type - Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
230
+ * :driver - The name of the ODBC driver to utilize.
231
+
232
+ === openbase
233
+
234
+ The :port option is ignored.
235
+
236
+ === oracle
237
+
238
+ Requires: oci8
239
+
240
+ The following additional options are supported:
241
+
242
+ * :privilege - The Oracle privilege level.
243
+
244
+ === postgres
245
+
246
+ Requires: pg (or postgres if pg is not available)
247
+
248
+ The Sequel postgres adapter works with the pg, postgres, and postgres-pr ruby libraries.
249
+ The pg library is the best supported, as it supports real bound variables and prepared statements.
250
+
251
+ The following additional options are supported:
252
+
253
+ * :charset - Same as :encoding, :encoding takes precedence
254
+ * :encoding - Set the client_encoding to the given string
255
+
256
+ === sqlite
257
+
258
+ As SQLite is a file-based database, the :host and :port options are ignored, and
259
+ the :database option should be a path to the file.
260
+
261
+ Examples:
262
+
263
+ # In Memory databases:
264
+ Sequel.sqlite
265
+ Sequel.connect('sqlite:/')
266
+ Sequel.sqlite(':memory:')
267
+
268
+ # Relative Path
269
+ Sequel.sqlite('blog.db')
270
+ Sequel.sqlite('./blog.db')
271
+ Sequel.connect('sqlite://blog.db')
272
+
273
+ # Absolute Path
274
+ Sequel.sqlite('/var/sqlite/blog.db')
275
+ Sequel.connect('sqlite:///var/sqlite/blog.db')
276
+
277
+ The following additional options are supported:
278
+
279
+ * :timeout - the busy timeout to use in milliseconds (default: 5000).
@@ -0,0 +1,268 @@
1
+ New Features
2
+ ------------
3
+
4
+ * Common table expressions (CTEs) are now supported. CTEs use the
5
+ SQL WITH clause, and specify inline views that queries can use.
6
+ They also support a recursive mode, where the CTE can recursively
7
+ query its own output, allowing you do do things like load all
8
+ branches for a given node in a plain tree structure.
9
+
10
+ The standard with takes an alias and a dataset:
11
+
12
+ DB[:vw].with(:vw, DB[:table].filter{col < 1})
13
+ # WITH vw AS (SELECT * FROM table WHERE col < 1)
14
+ # SELECT * FROM vw
15
+
16
+ The recursive with takes an alias, a nonrecursive dataset, and a
17
+ recursive dataset:
18
+
19
+ DB[:vw].with_recursive(:vw,
20
+ DB[:tree].filter(:id=>1),
21
+ DB[:tree].join(:vw, :id=>:parent_id).
22
+ select(:vw__id, :vw__parent_id))
23
+ # WITH RECURSIVE vw AS (SELECT * FROM tree
24
+ # WHERE (id = 1)
25
+ # UNION ALL
26
+ # SELECT vw.id, vw.parent_id
27
+ # FROM tree
28
+ # INNER JOIN vw ON (vw.id = tree.parent_id))
29
+ # SELECT * FROM vw
30
+
31
+ CTEs are supported by Microsoft SQL Server 2005+, DB2 7+,
32
+ Firebird 2.1+, Oracle 9+, and PostgreSQL 8.4+.
33
+
34
+ * SQL window functions are now supported, and a DSL has been added to
35
+ ease their creation. Window functions act similarly to aggregate
36
+ functions but operate on sliding ranges of rows.
37
+
38
+ In virtual row blocks (blocks passed to filter, select, order, etc.)
39
+ you can now provide a block to method calls to change the default
40
+ behavior to create functions that weren't possible previously. The
41
+ blocks aren't called, but their presence serves as a flag.
42
+
43
+ What function is created depends on the arguments to the method:
44
+
45
+ * If there are no arguments, an SQL::Function is created with the
46
+ name of method used, and no arguments. Previously, it was not
47
+ possible to create functions without arguments using the virtual
48
+ row block DSL. Example:
49
+
50
+ DB.dataset.select{version{}} # SELECT version()
51
+
52
+ * If the first argument is :*, an SQL::Function is created with a
53
+ single wildcard argument (*). This is mostly useful for count:
54
+
55
+ DB[:t].select{count(:*){}} # SELECT count(*) FROM t
56
+
57
+ * If the first argument is :distinct, an SQL::Function is created
58
+ with the keyword DISTINCT prefacing all remaining arguments. This
59
+ is useful for aggregate functions such as count:
60
+
61
+ DB[:t].select{count(:distinct, col1){}}
62
+ # SELECT count(DISTINCT col1) FROM t
63
+
64
+ * If the first argument is :over, the second argument, if provided,
65
+ should be a hash of options to pass to SQL::Window. The options
66
+ hash can also contain :*=>true to use a wildcard argument as the
67
+ function argument, or :args=>... to specify an array of arguments
68
+ to use as the function arguments.
69
+
70
+ DB[:t].select{rank(:over){}} # SELECT rank() OVER ()
71
+ DB[:t].select{count(:over, :*=>true){}} # SELECT count(*) OVER ()
72
+ DB[:t].select{sum(:over, :args=>col1,
73
+ :partition=>col2, :order=>col3){}}
74
+ # SELECT sum(col1) OVER (PARTITION BY col2 ORDER BY col3)
75
+
76
+ PostgreSQL also supports named windows. Named windows can be
77
+ specified by Dataset#window, and window functions can reference
78
+ them using the :window option.
79
+
80
+ * Schema information for columns now includes a :ruby_default entry
81
+ which contains a ruby object that represents the default given by
82
+ the database (which is stored in :default). Not all :default
83
+ entries can be parsed into a :ruby_default, but if the
84
+ schema_dumper extension previously supported it, it should work.
85
+
86
+ * Methods to create compound datasets (union, intersect, except), now
87
+ take an options hash instead of a true/false flag. The previous
88
+ API is still supported, but switching to specifying the ALL setting
89
+ using :all=>true is recommended.
90
+
91
+ Additionally, you can now set :from_self=>false to not wrap the
92
+ returned dataset in a "SELECT * FROM (...)".
93
+
94
+ * Dataset#ungraphed was added that removes the graphing information
95
+ from the dataset. This allows you to use Dataset#graph for the
96
+ automatic aliasing, or #eager_graph for the automatic aliasing and
97
+ joining, and then remove the graphing information so that the
98
+ resulting objects will not be split into subhashes or associations.
99
+
100
+ * There were some introspection methods added to Dataset to describe
101
+ which capabilities that dataset does or does not support:
102
+
103
+ supports_cte?
104
+ supports_distinct_on?
105
+ supports_intersect_except?
106
+ supports_intersect_except_all?
107
+ supports_window_functions?
108
+
109
+ In addition to being available for the user to use, these are also
110
+ used internally, so attempting to use a CTE on a dataset that
111
+ doesn't support it will raise an Error.
112
+
113
+ * Dataset#qualify was added, which is like qualify_to with a default
114
+ of first_source.
115
+
116
+ Additionally, qualify now affects PlaceholderLiteralStrings. It
117
+ doesn't scan the string (as Sequel never attempts to parse SQL),
118
+ but if you provide the column as a symbol placeholder argument, it
119
+ will qualify it.
120
+
121
+ * You can now specify the table and column Sequel::Migrator will use
122
+ to record the current schema version. The new Migrator.run method
123
+ must be used to use these new options.
124
+
125
+ * The JDBC adapter now accepts :user and :password options, instead
126
+ of requiring them to be specified in the connection string and
127
+ handled by the JDBC driver. This should allow connections to
128
+ Oracle using the Thin JDBC driver.
129
+
130
+ * You can now specify the max_connections, pool_timeout, and
131
+ single_threaded settings directly in the connection string:
132
+
133
+ postgres:///database?single_threaded=t
134
+ postgres:///database?max_connections=10&pool_timeout=20
135
+
136
+ * Dataset#on_duplicate_key_update now affects Dataset#insert when
137
+ using MySQL.
138
+
139
+ * You can now specify the :opclass option when creating PostgreSQL
140
+ indexes. Currently, this only supports a single operator class
141
+ for all columns. If you need different operator classes per
142
+ column, please post on sequel-talk.
143
+
144
+ * Model#autoincrementing_primary_key was added and can be used if
145
+ the autoincrementing key isn't the same as the primary key. The
146
+ only likely use for this is on MySQL MyISAM tables with composite
147
+ primary keys where only one of the composite parts is
148
+ autoincrementing.
149
+
150
+ * You can now use database column values as search patterns and
151
+ specify the text to search as a String or Regexp:
152
+
153
+ String.send(:include, Sequel::SQL::StringMethods)
154
+ Regexp.send(:include, Sequel::SQL::StringMethods)
155
+
156
+ 'a'.like(:x) # ('a' LIKE x)
157
+ /a/.like(:x) # ('a' ~ x)
158
+ /a/i.like(:x) # ('a' ~* x)
159
+ /a/.like(:x, 'b') # (('a' ~ x) OR ('a' ~ 'b'))
160
+
161
+ * The Dataset#dataset_alias private method was added. It can be
162
+ overridden if you have tables named t0, t1, etc and want to make
163
+ sure the default dataset aliases that Sequel uses do not clash
164
+ with existing table names.
165
+
166
+ * Sequel now raises an Error if you call Sequel.connect with
167
+ something that is not a Hash or String.
168
+
169
+ * bin/sequel now accepts a -N option to not test the database
170
+ connection.
171
+
172
+ * An opening_databases.rdoc file was added to the documentation
173
+ directory, which should be a good introduction for new users about
174
+ how to set up your Database connection.
175
+
176
+ Other Improvements
177
+ ------------------
178
+
179
+ * MySQL native adapter SELECT is much faster than before, up to 75%
180
+ faster.
181
+
182
+ * JDBC SELECT is about 10% faster than before. It's still much
183
+ slower than the native adapters, due to conversion issues.
184
+
185
+ * bin/sequel now works with a YAML file on ruby 1.9.
186
+
187
+ * MySQL foreign key table constraints have been fixed.
188
+
189
+ * Database#indexes now works on PostgreSQL if the schema used is a
190
+ Symbol. It also works on PostgreSQL versions all the way back to
191
+ 7.4.
192
+
193
+ * Graphing of datasets with dataset sources has been fixed.
194
+
195
+ * Changing a columns name, type, or NULL status on MySQL now
196
+ supports a much wider selection of column defaults.
197
+
198
+ * The stored procedure code is now thread-safe. Sequel is
199
+ thread-safe in general, but due to a bug the previous stored
200
+ procedure code was not thread-safe.
201
+
202
+ * The ODBC adapter now drops statements automatically instead of
203
+ requiring the user to do so manually, making it more similar
204
+ to other adapters.
205
+
206
+ * The single_table_inheritance plugin no longer overwrites the STI
207
+ field if the field already has a value. This allows you to use
208
+ create in the generic class to insert a value that will be
209
+ returned as a subclass:
210
+
211
+ Person.create(:kind => "Manager")
212
+
213
+ * When altering colums on MySQL, :unsigned, :elements, :size and other
214
+ options given are no longer ignored.
215
+
216
+ * The PostgreSQL shared adapter's explain and analyze methods have
217
+ been fixed, they had been broken in 3.0.
218
+
219
+ * Parsing of the server's version is more robust on PostgreSQL.
220
+ It should now work correctly for 8.4 and 8.4rc1 type versions.
221
+
222
+ Backwards Compatibility
223
+ -----------------------
224
+
225
+ * Dataset#table_exists? has been removed, since it never worked
226
+ perfectly. Use Database#table_exists? instead.
227
+
228
+ * Model.grep now calls Dataset#grep instead of Enumerable#grep.
229
+ If you are using Model.grep, you need to modify your application.
230
+
231
+ * The MSSQL shared adapter previously used the :with option for
232
+ storing the NOLOCK setting of the query. That option has been
233
+ renamed to :table_options, since :with is now used for CTEs.
234
+ This should not have an effect unless you where using the option
235
+ manually.
236
+
237
+ * Previously, providing a block to a method calls in virtual row
238
+ blocks did not change behavior, where now it causes a different
239
+ code path to be used. In both cases, the block is not evaluated,
240
+ but that may change in a future version.
241
+
242
+ * Dataset#to_table_reference protected method was removed, as it was
243
+ no longer used.
244
+
245
+ * The pool_timeout setting is now converted to an Integer, so if you
246
+ used to pass in a Float, it no longer works the same way.
247
+
248
+ * Most files in adapters/utils have been removed, in favor of
249
+ integrating the code directly into Database and Dataset. If you
250
+ were previously checking for the UnsupportedIntersectExcept or
251
+ related modules, use the Dataset introspection methods instead
252
+ (e.g. supports_intersect_except?).
253
+
254
+ * If you were using the ODBC adapter and manually dropping returned
255
+ statements, you should note that now statements are dropped
256
+ automatically, and the execute method doesn't return a statement
257
+ object.
258
+
259
+ * The MySQL adapter on_duplicate_key_update_sql is now a private
260
+ method.
261
+
262
+ * If you were modifying the :from dataset option directly, note that
263
+ Sequel now expects this option to be preprocessed. See the new
264
+ implementation of Dataset#from for an idea of the changes
265
+ required.
266
+
267
+ * Dataset#simple_select_all? now returns false instead of true for a
268
+ dataset that selects from another dataset.