sequel 2.10.0 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
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|