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,166 @@
1
+ Performance Optimizations
2
+ -------------------------
3
+
4
+ * Fetching a large number of records with the PostgreSQL adapter is
5
+ significantly faster (up to 3-4 times faster than before).
6
+
7
+ * Instantiating model objects has been made much faster, as many
8
+ options (such as raise_on_save_failure) are now lazily loaded, and
9
+ hook methods are now much faster if no hooks have been defined for
10
+ that type of hook.
11
+
12
+ New Association Options
13
+ -----------------------
14
+
15
+ * The :eager_grapher option has been added allowing you to supply
16
+ your own block to implement eager loading via eager_graph.
17
+
18
+ * many_to_one and one_to_many associations now have a :primary_key
19
+ option, specifying the name of the column that the :key option
20
+ references.
21
+
22
+ * many_to_many associations now have :left_primary_key and
23
+ :right_primary_key options, specifying the columns that :left_key
24
+ and :right_key reference, respectively.
25
+
26
+ * many_to_many associations now have a :uniq option, that adds an
27
+ :after_load callback that makes the returned array of objects
28
+ unique.
29
+
30
+ Other New Features
31
+ ------------------
32
+
33
+ * Dataset#set_graph_aliases now allows you to supply a third argument
34
+ for each column you want graph into the dataset, allowing you to use
35
+ arbitrary SQL expressions that are graphed into the correct table:
36
+
37
+ ds.set_graph_aliases!(:a=>[:b, :c], :d=>[:e, :f, 42])
38
+ # SELECT b.c AS a, 42 AS d FROM ...
39
+ ds.first # => {:b=>{:c=>?}, :e=>{:f=>42}}
40
+
41
+ * Dataset#add_graph_aliases was added, that adds additional graph
42
+ aliases instead of replacing the existing ones (as
43
+ #set_graph_aliases does). It's basically the equivalent of
44
+ select_more for graphs.
45
+
46
+ * Dataset#join_table changed it's final argument from a symbol
47
+ specifying a table name to an option hash (with backwards
48
+ compatibility kept), and adds support for a :implicit_qualifier
49
+ option, which it uses instead of the last joined table to
50
+ qualify columns.
51
+
52
+ * Association's :after_load callbacks are now called when eager
53
+ loading via eager (but not when eager loading via eager_graph).
54
+
55
+ * Any expression can now be used as the argument to Symbol#like,
56
+ which means that you can pattern match columns to other columns.
57
+ Before, it always transformed the argument to a string.
58
+
59
+ :a.like(:b)
60
+ # 2.6.0: a LIKE 'b'
61
+ # 2.7.0: a LIKE b
62
+
63
+ * Array#sql_array was added, allowing you to specify that an array
64
+ in ruby be treated like an array in SQL. This is true anyway,
65
+ except for arrays of all two pairs, which are treated like hashes,
66
+ for specifying multiple conditions with the same key:
67
+
68
+ DB[:foo].filter([:a,:b] => [[1,2],[3,4]].sql_array)
69
+ # => SELECT * FROM foo WHERE ((a, b) IN ((1, 2), (3, 4)))
70
+
71
+ * ComplexExpression#== and #sql? were added, allowing for easier
72
+ testing.
73
+
74
+ * Full text searching on PostgreSQL now joins multiple columns with
75
+ a space, to prevent joining border words, and it works when there
76
+ is a match in one column but the other column is NULL.
77
+
78
+ Other Improvements
79
+ ------------------
80
+
81
+ * Instance methods added by creating associations are added to an
82
+ anonymous module included by the class, so they can be overridden
83
+ in the class while still allowing the use of super to get the
84
+ default behavior (this is similar to column accessor methods).
85
+
86
+ * Many improvements were added to support using multiple schemas in
87
+ PostgreSQL.
88
+
89
+ * Model::Validation::Errors objects are now more compatible with
90
+ Rails, by adding a #count method and making #on return nil if there
91
+ are no error messages for that attribute.
92
+
93
+ * Serialized columns in models are no longer typecast.
94
+
95
+ * Associations are now inherited when a model class is subclassed.
96
+
97
+ * Many improvements were made that should make adding custom
98
+ association types easier.
99
+
100
+ * A corner case in eager_graph where the wrong table name would be
101
+ used to qualify a column name has been fixed.
102
+
103
+ * Dataset's cached column information is no longer modified if #each
104
+ is called with an option that modifies the columns.
105
+
106
+ * You should now be able to connect to Oracle via the JDBC adapter,
107
+ and with the same support it has when using the oracle adapter.
108
+
109
+ * Model.association_reflections is now a public methods, so you can
110
+ grab a hash of all association reflections at once (keyed by
111
+ association name symbol).
112
+
113
+ * The :encoding/:charset option now works in the PostgreSQL adapter
114
+ if the postgres-pr driver is used.
115
+
116
+ * The numeric(x,y) type is now interpreted as decimal.
117
+
118
+ Backwards Compatibilty
119
+ ----------------------
120
+
121
+ * The first argument to Model#initialize must be a hash, you can no
122
+ longer use nil. For example, the following code will break if
123
+ :album is not in params:
124
+
125
+ Album.new(params[:album])
126
+
127
+ Additionally, Model#initialize does not call the block if the
128
+ second argument is true.
129
+
130
+ * The Sequel::Model.lazy_load_schema setting was removed. It should
131
+ no longer be necessary now that schema loading is relatively speedy,
132
+ and schemas can be loaded at startup and cached.
133
+
134
+ * The PostgreSQL adapter will default to using a unix socket in /tmp
135
+ if no host is specified. Before, a TCP/IP socket to localhost was
136
+ used if no host was specified. This change makes Sequel operate
137
+ similarly to the PostgreSQL command line tools.
138
+
139
+ * The ASSOCIATION_TYPES constant has changed from an array to a hash
140
+ and it has been moved. The RECIPROCAL_ASSOCIATIONS constant has
141
+ been removed. This is unlikely to matter unless you were using
142
+ custom association types.
143
+
144
+ * The PostgreSQL adapter now sets the PostgreSQL DateStyle, in order
145
+ to implement an optimization. To turn this off, set
146
+ Sequel::Postgres.use_iso_date_format = false.
147
+
148
+ * When using the PostgreSQL adapter, in many places the schema is
149
+ specified explicitly. If you do not specify a schema, a default
150
+ one is used (public by default). If you use a schema other than
151
+ public for your work, use Database#default_schema= to set it. For
152
+ any table outside of the default schema, you should specify the
153
+ schema explicitly, even if it is in the PostgreSQL search_path.
154
+
155
+ * Model::Validation::Errors#on now returns nil instead of [] if there
156
+ are no errors for an attribute.
157
+
158
+ * Hooks added to a superclass after a subclass has been created no
159
+ longer have an effect on the subclass.
160
+
161
+ * The Postgres.string_to_bool method has been removed.
162
+
163
+ * PostgreSQL full text searching now always defaults to using the
164
+ simple dictionary. If you want to use another dictionary, it must
165
+ be specified explicitly, both when searching and when creating a
166
+ full text index.
@@ -0,0 +1,171 @@
1
+ New Features
2
+ ------------
3
+
4
+ * Sequel now supports database stored procedures similar to its
5
+ support for prepared statements. The API is as follows:
6
+
7
+ DB[:table].call_sproc(:select, :mysp, 'param1', 'param2')
8
+ # or
9
+ sp = DB[:table].prepare_sproc(:select, :mysp)
10
+ sp.call('param1', 'param2')
11
+ sp.call('param3', 'param4')
12
+
13
+ This works with Model datasets as well, allowing them to return
14
+ model objects:
15
+
16
+ Album.call_sproc(:select, :new_albums)
17
+ #=> [#<Album ...>, #<Album ...>]
18
+
19
+ You can call a stored procedure directly on the Database object
20
+ if you want to, but the results and API are adapter dependent,
21
+ and you definitely shouldn't do it if the stored procedure returns
22
+ rows:
23
+
24
+ DB.call_sproc(:mysp, :args=>['param1', 'param2'])
25
+
26
+ Currently, the MySQL and JDBC adapters support stored procedures.
27
+ Other adapters may support them in a future version.
28
+
29
+ * The connection pool code can now remove connections if the
30
+ adapter raises a Sequel::DatabaseDisconnectError indicating that
31
+ the connection has been lost. When a query is attempted and
32
+ the adapter raises this error, the connection pool removes the
33
+ connection from the pool, and reraises the error. The Oracle and
34
+ PostgreSQL adapters currently support this, and other adapters may
35
+ support it in a future version.
36
+
37
+ * Whether to upcase or quote identifiers can now be set separately.
38
+ Previously, upcasing was done when quoting except when using SQLite,
39
+ PostgreSQL, or MySQL. Now, you can turn upcasing off while still
40
+ quoting. This may be necessary if you are using a MSSQL database
41
+ that has lower case table names that conflict with reserved words.
42
+ It also allows you to uppercase identifiers when using SQLite,
43
+ PostgreSQL, or MySQL, which may be beneficial in certain cases.
44
+
45
+ To turn upcasing on or off:
46
+
47
+ # Global
48
+ Sequel.upcase_identifiers = true
49
+ # Database
50
+ DB = Sequel.connect("postgres://...", :upcase_identifiers=>true)
51
+ DB.upcase_identifiers = false
52
+ # Dataset
53
+ ds = DB[:items]
54
+ ds.upcase_identifiers = true
55
+
56
+ * Options are now supported when altering a columns type:
57
+
58
+ DB.alter_table(:items) do
59
+ set_column_type :score, :integer, :unsigned=>true
60
+ set_column_type :score, :varchar, :size=>30
61
+ set_column_type :score, :enum, :elements=>['a', 'b']
62
+ end
63
+
64
+ * Standard conforming strings are now turned on by default in the
65
+ PostgreSQL adapter. This makes PostgreSQL not interpret backslash
66
+ escapes. This is the PostgreSQL recommended setting, which will be
67
+ the default setting in a future version of PostgreSQL. If you
68
+ don't want for force the use of standard strings, use:
69
+
70
+ Sequel::Postgres.force_standard_strings = false
71
+
72
+ You need to do that after you call Sequel.connect but before you
73
+ use the database for anything, since that setting is set on
74
+ initial connection.
75
+
76
+ * Sequel now raises an error if you attempt to use EXCEPT [ALL] or
77
+ INTERSECT [ALL] on a database that doesn't support it.
78
+
79
+ * Sequel now raises an error if you attempt to use DISTINCT ON with
80
+ MySQL or Oracle, which don't support it.
81
+
82
+ * A subadapter for the Progress RDBMS was added to the ODBC adapter.
83
+ To connect to a Progress database, use the :db_type=>'progress'
84
+ option. This adapter targets Progress 9.
85
+
86
+ * The ODBC adapter now supports transactions.
87
+
88
+ * The MSSQL shared adapter now supports multi_insert (for inserting
89
+ multiple rows at once), and unicode string literals.
90
+
91
+ Other Improvements
92
+ ------------------
93
+
94
+ * There were many improvements related to using schemas in databases.
95
+ Using schema-qualified tables should work in most if not all cases
96
+ now. Model associations, getting the schema, joins, and many other
97
+ parts of Sequel were modified to allow the use of schema-qualifed
98
+ tables.
99
+
100
+ * You can now use literal strings with placeholders as well as
101
+ subselects when using prepared statements. For example, the
102
+ following all work now:
103
+
104
+ DB[:items].filter("id = ?", :$i).call(:select, :i=>1)
105
+ DB[:items].filter(:id=>DB[:items].select(:id)\
106
+ .filter(:id=>:$i)).call(:select, :i=>1)
107
+ DB["SELECT * FROM items WHERE id = ?", :$i].call(:select, :i=>1)
108
+
109
+ * Model#initialize received a few more micro-optimizations.
110
+
111
+ * Model#refresh now clears the changed columns as well as the
112
+ associations.
113
+
114
+ * You can now drop columns inside a transaction when using SQLite.
115
+
116
+ * You can now submit multiple SQL queries at once in the MySQL
117
+ adapter:
118
+
119
+ DB['SELECT 1; SELECT 2'].all
120
+ #=> [{:"1"=>1, :"2"=>2}]
121
+
122
+ This may fix issues if you've seen a MySQL "commands out of sync"
123
+ message. Note that this doesn't work if you are connecting to
124
+ MySQL via JDBC.
125
+
126
+ * You can now use AliasedExpressions directly in table names given
127
+ to join_table:
128
+
129
+ DB.from(:i.as(:j)).join(:k.as(:l), :a=>:b)
130
+ #=> ... FROM i AS j INNER JOIN k AS l ON (l.a = j.b)
131
+
132
+ * Database#rename_table once again works on PostgreSQL. It was
133
+ broken in 2.7.0.
134
+
135
+ * The interval type is now treated as it's own type. It was
136
+ previously treated as an integer type.
137
+
138
+ * Subselects are now aliased correctly when using Oracle.
139
+
140
+ * UNION, INTERSECT, and EXCEPT statements now appear before ORDER
141
+ and LIMIT on most databases. If you use these constructs, please
142
+ test and make sure that they work correctly with your database.
143
+
144
+ * SQL EXCEPT clause now works on Oracle, which uses MINUS instead.
145
+
146
+ * Dataset#exists now returns a LiteralString, to make it easier to
147
+ use.
148
+
149
+ * The Sequel.odbc_mssql method was removed, as the odbc_mssql adapter
150
+ was removed in a previous version. Instead, use:
151
+
152
+ Sequel.odbc(..., :db_type=>'mssql')
153
+
154
+ Backwards Compatibilty
155
+ ----------------------
156
+
157
+ * The hash returned by Database#schema when no table name is provided
158
+ uses quoted strings instead of symbols as keys. The hash has a
159
+ default proc, so using the symbol will return the same value as
160
+ before, but if you use each to iterate through the hash, the keys
161
+ will be different. This was necessary to handle schema-qualified
162
+ tables.
163
+
164
+ * Database#table_exists? no longer checks the output of
165
+ Database#tables. If the table exists in the schema, it returns
166
+ true, otherwise, it does a query. This was necessary because
167
+ table_exists? accepts multiple formats for table names and
168
+ Database#tables is an array of symbols.
169
+
170
+ * When getting the schema on PostgreSQL, the default schema is now
171
+ used even if the :schema=>nil option is used.
@@ -0,0 +1,97 @@
1
+ New Features
2
+ ------------
3
+
4
+ * Compound SQL statement (i.e. UNION, EXCEPT, and INTERSECT) support
5
+ is much improved. Chaining compound statement calls now longer
6
+ wipes out previous compound statements calls of the same type.
7
+ Also, the ordering of the compound statements is no longer fixed
8
+ per adapter, it now reflects the order they were called on the
9
+ object. For example, the following now work as expected:
10
+
11
+ ds1.union(ds2).union(ds3)
12
+ ds1.except(ds2).except(ds3)
13
+ ds1.intersect(ds2).intersect(ds3)
14
+ ds1.union(ds2).except(ds3)
15
+ ds1.except(ds2).intersect(ds3)
16
+ ds1.intersect(ds2).union(ds3)
17
+
18
+ * Exception classes ValidationFailure and BeforeHookFailure were
19
+ added so it is eaiser to catch a failed validation. These are
20
+ both subclasses of Sequel::Error, so there shouldn't be any
21
+ backwards compatibility issues. Error messages are also improved,
22
+ as the ValidationFailure message is a string containing all
23
+ validation failures and the BeforeHookFailure message contains
24
+ which hook type caused the failure (i.e. before_save,
25
+ before_create, or before_validate).
26
+
27
+ * The sequel command line tool now has a -L option to load
28
+ all files in the given directory. This is mainly useful for
29
+ loading a directory of model files. The files are loaded
30
+ after the database connection is set up.
31
+
32
+ * Methods to create and drop database functions, triggers, and
33
+ procedural languages were added to the PostgreSQL adapter.
34
+
35
+ Other Improvements
36
+ ------------------
37
+
38
+ * Database#schema now raises an error if you pass a table that
39
+ doesn't exist. Before, some adapters would return an empty schema.
40
+ The bigger problem with this is that it made table_exists? return
41
+ the wrong value, since it looks at the Database's schema.
42
+ Generally, this bug would show up in the following code:
43
+
44
+ class Blah < Sequel::Model
45
+ end
46
+ Blah.table_exists? # True even if blahs is not a table
47
+
48
+ * AlterTableGenerator#add_foreign_key now works for MySQL.
49
+
50
+ * Error messages in model association methods that add/remove an
51
+ associated object are now more descriptive.
52
+
53
+ * Dataset#destroy for model datasets now works with databases that
54
+ can't handle nested queries. However, it now loads all model
55
+ objects being destroyed before attempting to destroy any of them.
56
+
57
+ * Dataset#count now works correctly for compound SQL statements
58
+ (i.e. UNION, EXCEPT, and INTERSECT).
59
+
60
+ * BigDecimal NaN and (+/-)Infinity values are now literalized
61
+ correctly. Database support for this is hit or miss. Sqlite will
62
+ work correctly, PostgreSQL raises an error if you try to store an
63
+ infinite value in a numeric column (though it works for float
64
+ columns), and MySQL converts all three to 0.
65
+
66
+ * The SQLite adapter no longer loses primary key information when
67
+ dropping columns.
68
+
69
+ * The SQLite adapter now supports dropping indicies.
70
+
71
+ * A bug in the MSSQL adapter's literalization of LiteralStrings has
72
+ been fixed.
73
+
74
+ * The literalization of blobs on PostgreSQL (bytea columns) has been
75
+ fixed.
76
+
77
+ * Sequel now raises an error if you attempt to subclass Sequel::Model
78
+ before setting up a database connection.
79
+
80
+ * The native postgresql adapter has been changed to only log client
81
+ messages of level WARNING by default. You can modify this via:
82
+
83
+ Sequel::Postgres.client_min_messages = nil # Use Server Default
84
+ Sequel::Postgres.client_min_messages = :notice # Use NOTICE level
85
+
86
+ * Model#inspect now calls Model#inspect_values for easier
87
+ overloading.
88
+
89
+ Backwards Compatibilty
90
+ ----------------------
91
+
92
+ * The API to Model#save_failure (a private method) was changed to
93
+ remove the second argument.
94
+
95
+ * SQLite columns with type numeric, decimal, or money are now
96
+ returned as BigDecimal values. Before, they were probably returned
97
+ as strings.
@@ -1,3 +1,4 @@
1
+ require 'sequel_core/adapters/utils/date_format'
1
2
  require 'win32ole'
2
3
 
3
4
  module Sequel
@@ -54,6 +55,8 @@ module Sequel
54
55
  end
55
56
 
56
57
  class Dataset < Sequel::Dataset
58
+ include Dataset::SQLStandardDateFormat
59
+
57
60
  def fetch_rows(sql)
58
61
  execute(sql) do |s|
59
62
  @columns = s.Fields.extend(Enumerable).map do |column|