viking-sequel 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. data/CHANGELOG +3134 -0
  2. data/COPYING +19 -0
  3. data/README.rdoc +723 -0
  4. data/Rakefile +193 -0
  5. data/bin/sequel +196 -0
  6. data/doc/advanced_associations.rdoc +644 -0
  7. data/doc/cheat_sheet.rdoc +218 -0
  8. data/doc/dataset_basics.rdoc +106 -0
  9. data/doc/dataset_filtering.rdoc +158 -0
  10. data/doc/opening_databases.rdoc +296 -0
  11. data/doc/prepared_statements.rdoc +104 -0
  12. data/doc/reflection.rdoc +84 -0
  13. data/doc/release_notes/1.0.txt +38 -0
  14. data/doc/release_notes/1.1.txt +143 -0
  15. data/doc/release_notes/1.3.txt +101 -0
  16. data/doc/release_notes/1.4.0.txt +53 -0
  17. data/doc/release_notes/1.5.0.txt +155 -0
  18. data/doc/release_notes/2.0.0.txt +298 -0
  19. data/doc/release_notes/2.1.0.txt +271 -0
  20. data/doc/release_notes/2.10.0.txt +328 -0
  21. data/doc/release_notes/2.11.0.txt +215 -0
  22. data/doc/release_notes/2.12.0.txt +534 -0
  23. data/doc/release_notes/2.2.0.txt +253 -0
  24. data/doc/release_notes/2.3.0.txt +88 -0
  25. data/doc/release_notes/2.4.0.txt +106 -0
  26. data/doc/release_notes/2.5.0.txt +137 -0
  27. data/doc/release_notes/2.6.0.txt +157 -0
  28. data/doc/release_notes/2.7.0.txt +166 -0
  29. data/doc/release_notes/2.8.0.txt +171 -0
  30. data/doc/release_notes/2.9.0.txt +97 -0
  31. data/doc/release_notes/3.0.0.txt +221 -0
  32. data/doc/release_notes/3.1.0.txt +406 -0
  33. data/doc/release_notes/3.10.0.txt +286 -0
  34. data/doc/release_notes/3.2.0.txt +268 -0
  35. data/doc/release_notes/3.3.0.txt +192 -0
  36. data/doc/release_notes/3.4.0.txt +325 -0
  37. data/doc/release_notes/3.5.0.txt +510 -0
  38. data/doc/release_notes/3.6.0.txt +366 -0
  39. data/doc/release_notes/3.7.0.txt +179 -0
  40. data/doc/release_notes/3.8.0.txt +151 -0
  41. data/doc/release_notes/3.9.0.txt +233 -0
  42. data/doc/schema.rdoc +36 -0
  43. data/doc/sharding.rdoc +113 -0
  44. data/doc/virtual_rows.rdoc +205 -0
  45. data/lib/sequel.rb +1 -0
  46. data/lib/sequel/adapters/ado.rb +90 -0
  47. data/lib/sequel/adapters/ado/mssql.rb +30 -0
  48. data/lib/sequel/adapters/amalgalite.rb +176 -0
  49. data/lib/sequel/adapters/db2.rb +139 -0
  50. data/lib/sequel/adapters/dbi.rb +113 -0
  51. data/lib/sequel/adapters/do.rb +188 -0
  52. data/lib/sequel/adapters/do/mysql.rb +49 -0
  53. data/lib/sequel/adapters/do/postgres.rb +91 -0
  54. data/lib/sequel/adapters/do/sqlite.rb +40 -0
  55. data/lib/sequel/adapters/firebird.rb +283 -0
  56. data/lib/sequel/adapters/informix.rb +77 -0
  57. data/lib/sequel/adapters/jdbc.rb +587 -0
  58. data/lib/sequel/adapters/jdbc/as400.rb +58 -0
  59. data/lib/sequel/adapters/jdbc/h2.rb +133 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +57 -0
  61. data/lib/sequel/adapters/jdbc/mysql.rb +78 -0
  62. data/lib/sequel/adapters/jdbc/oracle.rb +50 -0
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +108 -0
  64. data/lib/sequel/adapters/jdbc/sqlite.rb +55 -0
  65. data/lib/sequel/adapters/mysql.rb +421 -0
  66. data/lib/sequel/adapters/odbc.rb +143 -0
  67. data/lib/sequel/adapters/odbc/mssql.rb +42 -0
  68. data/lib/sequel/adapters/openbase.rb +64 -0
  69. data/lib/sequel/adapters/oracle.rb +131 -0
  70. data/lib/sequel/adapters/postgres.rb +504 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +490 -0
  72. data/lib/sequel/adapters/shared/mysql.rb +498 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +195 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +830 -0
  75. data/lib/sequel/adapters/shared/progress.rb +44 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +389 -0
  77. data/lib/sequel/adapters/sqlite.rb +224 -0
  78. data/lib/sequel/adapters/utils/stored_procedures.rb +84 -0
  79. data/lib/sequel/connection_pool.rb +99 -0
  80. data/lib/sequel/connection_pool/sharded_single.rb +84 -0
  81. data/lib/sequel/connection_pool/sharded_threaded.rb +211 -0
  82. data/lib/sequel/connection_pool/single.rb +29 -0
  83. data/lib/sequel/connection_pool/threaded.rb +150 -0
  84. data/lib/sequel/core.rb +293 -0
  85. data/lib/sequel/core_sql.rb +241 -0
  86. data/lib/sequel/database.rb +1079 -0
  87. data/lib/sequel/database/schema_generator.rb +327 -0
  88. data/lib/sequel/database/schema_methods.rb +203 -0
  89. data/lib/sequel/database/schema_sql.rb +320 -0
  90. data/lib/sequel/dataset.rb +32 -0
  91. data/lib/sequel/dataset/actions.rb +441 -0
  92. data/lib/sequel/dataset/features.rb +86 -0
  93. data/lib/sequel/dataset/graph.rb +254 -0
  94. data/lib/sequel/dataset/misc.rb +119 -0
  95. data/lib/sequel/dataset/mutation.rb +64 -0
  96. data/lib/sequel/dataset/prepared_statements.rb +227 -0
  97. data/lib/sequel/dataset/query.rb +709 -0
  98. data/lib/sequel/dataset/sql.rb +996 -0
  99. data/lib/sequel/exceptions.rb +51 -0
  100. data/lib/sequel/extensions/blank.rb +43 -0
  101. data/lib/sequel/extensions/inflector.rb +242 -0
  102. data/lib/sequel/extensions/looser_typecasting.rb +21 -0
  103. data/lib/sequel/extensions/migration.rb +239 -0
  104. data/lib/sequel/extensions/named_timezones.rb +61 -0
  105. data/lib/sequel/extensions/pagination.rb +100 -0
  106. data/lib/sequel/extensions/pretty_table.rb +82 -0
  107. data/lib/sequel/extensions/query.rb +52 -0
  108. data/lib/sequel/extensions/schema_dumper.rb +271 -0
  109. data/lib/sequel/extensions/sql_expr.rb +122 -0
  110. data/lib/sequel/extensions/string_date_time.rb +46 -0
  111. data/lib/sequel/extensions/thread_local_timezones.rb +48 -0
  112. data/lib/sequel/metaprogramming.rb +9 -0
  113. data/lib/sequel/model.rb +120 -0
  114. data/lib/sequel/model/associations.rb +1514 -0
  115. data/lib/sequel/model/base.rb +1069 -0
  116. data/lib/sequel/model/default_inflections.rb +45 -0
  117. data/lib/sequel/model/errors.rb +39 -0
  118. data/lib/sequel/model/exceptions.rb +21 -0
  119. data/lib/sequel/model/inflections.rb +162 -0
  120. data/lib/sequel/model/plugins.rb +70 -0
  121. data/lib/sequel/plugins/active_model.rb +59 -0
  122. data/lib/sequel/plugins/association_dependencies.rb +103 -0
  123. data/lib/sequel/plugins/association_proxies.rb +41 -0
  124. data/lib/sequel/plugins/boolean_readers.rb +53 -0
  125. data/lib/sequel/plugins/caching.rb +141 -0
  126. data/lib/sequel/plugins/class_table_inheritance.rb +214 -0
  127. data/lib/sequel/plugins/composition.rb +138 -0
  128. data/lib/sequel/plugins/force_encoding.rb +72 -0
  129. data/lib/sequel/plugins/hook_class_methods.rb +126 -0
  130. data/lib/sequel/plugins/identity_map.rb +116 -0
  131. data/lib/sequel/plugins/instance_filters.rb +98 -0
  132. data/lib/sequel/plugins/instance_hooks.rb +57 -0
  133. data/lib/sequel/plugins/lazy_attributes.rb +77 -0
  134. data/lib/sequel/plugins/many_through_many.rb +208 -0
  135. data/lib/sequel/plugins/nested_attributes.rb +206 -0
  136. data/lib/sequel/plugins/optimistic_locking.rb +81 -0
  137. data/lib/sequel/plugins/rcte_tree.rb +281 -0
  138. data/lib/sequel/plugins/schema.rb +66 -0
  139. data/lib/sequel/plugins/serialization.rb +166 -0
  140. data/lib/sequel/plugins/single_table_inheritance.rb +74 -0
  141. data/lib/sequel/plugins/subclasses.rb +45 -0
  142. data/lib/sequel/plugins/tactical_eager_loading.rb +61 -0
  143. data/lib/sequel/plugins/timestamps.rb +87 -0
  144. data/lib/sequel/plugins/touch.rb +118 -0
  145. data/lib/sequel/plugins/typecast_on_load.rb +72 -0
  146. data/lib/sequel/plugins/validation_class_methods.rb +405 -0
  147. data/lib/sequel/plugins/validation_helpers.rb +223 -0
  148. data/lib/sequel/sql.rb +1020 -0
  149. data/lib/sequel/timezones.rb +161 -0
  150. data/lib/sequel/version.rb +12 -0
  151. data/lib/sequel_core.rb +1 -0
  152. data/lib/sequel_model.rb +1 -0
  153. data/spec/adapters/firebird_spec.rb +407 -0
  154. data/spec/adapters/informix_spec.rb +97 -0
  155. data/spec/adapters/mssql_spec.rb +403 -0
  156. data/spec/adapters/mysql_spec.rb +1019 -0
  157. data/spec/adapters/oracle_spec.rb +286 -0
  158. data/spec/adapters/postgres_spec.rb +969 -0
  159. data/spec/adapters/spec_helper.rb +51 -0
  160. data/spec/adapters/sqlite_spec.rb +432 -0
  161. data/spec/core/connection_pool_spec.rb +808 -0
  162. data/spec/core/core_sql_spec.rb +417 -0
  163. data/spec/core/database_spec.rb +1662 -0
  164. data/spec/core/dataset_spec.rb +3827 -0
  165. data/spec/core/expression_filters_spec.rb +595 -0
  166. data/spec/core/object_graph_spec.rb +296 -0
  167. data/spec/core/schema_generator_spec.rb +159 -0
  168. data/spec/core/schema_spec.rb +830 -0
  169. data/spec/core/spec_helper.rb +56 -0
  170. data/spec/core/version_spec.rb +7 -0
  171. data/spec/extensions/active_model_spec.rb +76 -0
  172. data/spec/extensions/association_dependencies_spec.rb +127 -0
  173. data/spec/extensions/association_proxies_spec.rb +50 -0
  174. data/spec/extensions/blank_spec.rb +67 -0
  175. data/spec/extensions/boolean_readers_spec.rb +92 -0
  176. data/spec/extensions/caching_spec.rb +250 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +252 -0
  178. data/spec/extensions/composition_spec.rb +194 -0
  179. data/spec/extensions/force_encoding_spec.rb +117 -0
  180. data/spec/extensions/hook_class_methods_spec.rb +470 -0
  181. data/spec/extensions/identity_map_spec.rb +202 -0
  182. data/spec/extensions/inflector_spec.rb +181 -0
  183. data/spec/extensions/instance_filters_spec.rb +55 -0
  184. data/spec/extensions/instance_hooks_spec.rb +133 -0
  185. data/spec/extensions/lazy_attributes_spec.rb +153 -0
  186. data/spec/extensions/looser_typecasting_spec.rb +39 -0
  187. data/spec/extensions/many_through_many_spec.rb +884 -0
  188. data/spec/extensions/migration_spec.rb +332 -0
  189. data/spec/extensions/named_timezones_spec.rb +72 -0
  190. data/spec/extensions/nested_attributes_spec.rb +396 -0
  191. data/spec/extensions/optimistic_locking_spec.rb +100 -0
  192. data/spec/extensions/pagination_spec.rb +99 -0
  193. data/spec/extensions/pretty_table_spec.rb +91 -0
  194. data/spec/extensions/query_spec.rb +85 -0
  195. data/spec/extensions/rcte_tree_spec.rb +205 -0
  196. data/spec/extensions/schema_dumper_spec.rb +357 -0
  197. data/spec/extensions/schema_spec.rb +127 -0
  198. data/spec/extensions/serialization_spec.rb +209 -0
  199. data/spec/extensions/single_table_inheritance_spec.rb +96 -0
  200. data/spec/extensions/spec_helper.rb +91 -0
  201. data/spec/extensions/sql_expr_spec.rb +89 -0
  202. data/spec/extensions/string_date_time_spec.rb +93 -0
  203. data/spec/extensions/subclasses_spec.rb +52 -0
  204. data/spec/extensions/tactical_eager_loading_spec.rb +65 -0
  205. data/spec/extensions/thread_local_timezones_spec.rb +45 -0
  206. data/spec/extensions/timestamps_spec.rb +150 -0
  207. data/spec/extensions/touch_spec.rb +155 -0
  208. data/spec/extensions/typecast_on_load_spec.rb +69 -0
  209. data/spec/extensions/validation_class_methods_spec.rb +984 -0
  210. data/spec/extensions/validation_helpers_spec.rb +438 -0
  211. data/spec/integration/associations_test.rb +281 -0
  212. data/spec/integration/database_test.rb +26 -0
  213. data/spec/integration/dataset_test.rb +963 -0
  214. data/spec/integration/eager_loader_test.rb +734 -0
  215. data/spec/integration/model_test.rb +130 -0
  216. data/spec/integration/plugin_test.rb +814 -0
  217. data/spec/integration/prepared_statement_test.rb +213 -0
  218. data/spec/integration/schema_test.rb +361 -0
  219. data/spec/integration/spec_helper.rb +73 -0
  220. data/spec/integration/timezone_test.rb +55 -0
  221. data/spec/integration/transaction_test.rb +122 -0
  222. data/spec/integration/type_test.rb +96 -0
  223. data/spec/model/association_reflection_spec.rb +175 -0
  224. data/spec/model/associations_spec.rb +2633 -0
  225. data/spec/model/base_spec.rb +418 -0
  226. data/spec/model/dataset_methods_spec.rb +78 -0
  227. data/spec/model/eager_loading_spec.rb +1391 -0
  228. data/spec/model/hooks_spec.rb +240 -0
  229. data/spec/model/inflector_spec.rb +26 -0
  230. data/spec/model/model_spec.rb +593 -0
  231. data/spec/model/plugins_spec.rb +236 -0
  232. data/spec/model/record_spec.rb +1500 -0
  233. data/spec/model/spec_helper.rb +97 -0
  234. data/spec/model/validations_spec.rb +153 -0
  235. data/spec/rcov.opts +6 -0
  236. data/spec/spec_config.rb.example +10 -0
  237. metadata +346 -0
@@ -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.
@@ -0,0 +1,215 @@
1
+ Optimizations
2
+ -------------
3
+
4
+ * Model.[] was optimized to use static SQL in cases where doing so
5
+ should result in the same output. This should result in a 30-40%
6
+ performance increase. Since this can be the most significant or
7
+ only method call in a web application action, this has potential
8
+ to significantly enhance the performance of web application code.
9
+
10
+ In order for this optimization to have an effect, you need to
11
+ make sure that you are calling set_dataset with a Symbol and
12
+ not a Dataset object:
13
+
14
+ # Optimized:
15
+ class Foo < Sequel::Model; end
16
+ class Foo < Sequel::Model(:foos); end
17
+ class Foo < Sequel::Model
18
+ set_dataset :foos
19
+ end
20
+
21
+ # Not Optimized, but otherwise equivalent:
22
+ class Foo < Sequel::Model(Model.db[:foos]); end
23
+ class Foo < Sequel::Model
24
+ set_dataset db[:foos]
25
+ end
26
+
27
+ * Dataset#literal was refactored for performance reasons to make
28
+ overriding it in subclasses unnecessary. The changes made result
29
+ in a 20-25% performance increase. Sequel can spend about 10% of
30
+ it's time in Dataset#literal, so this may be only a 2% overall
31
+ performance improvement.
32
+
33
+ New Features
34
+ ------------
35
+
36
+ * Association datasets now know about the model objects that created
37
+ them, as well as the related association reflection. This makes
38
+ association extensions much more powerful. For example, you can
39
+ now create generic association extensions such as:
40
+
41
+ module FindOrCreate
42
+ def find_or_create(vals)
43
+ first(vals) || association_reflection.associated_class. \
44
+ create(vals.merge(association_reflection[:key]=> \
45
+ model_object.id))
46
+ end
47
+ end
48
+
49
+ The above will work for any standard one_to_many association:
50
+
51
+ Artist.one_to_many :albums, :extend=>FindOrCreate
52
+ # Create an album named Foo related to this artist,
53
+ # unless such an album already exists
54
+ Artist.first.albums_dataset.find_or_create(:name=>'Foo')
55
+
56
+ Before, the only way to do the above was to use a closure inside
57
+ the :dataset option proc, which couldn't be done generically
58
+ for multiple associations.
59
+
60
+ * A :conditions association option was added, which allows simple
61
+ filters to be set up without defining :graph_conditions and
62
+ an association block:
63
+
64
+ # 2.10.0
65
+ one_to_many(:japanese_verses, :class=>:Verse, \
66
+ :graph_conditions=>{:languageid=>3})do |ds|
67
+ ds.filter(:languageid=>3)
68
+ end
69
+ # 2.11.0
70
+ one_to_many(:japanese_verses, :class=>:Verse, \
71
+ :conditions=>{:languageid=>3})
72
+
73
+ * A :clone association option was added, which allows you to clone
74
+ an existing association. This is most useful when you are dealing
75
+ with a legacy schema and had to define the same options redundantly
76
+ for each type of association. You can now do:
77
+
78
+ many_to_many :deputies, :class=>:Employee, \
79
+ :join_table=>:employeecurrentaudits, :left_key=>:currentauditid, \
80
+ :right_key=>:employeeid, :order=>[:firstname, :lastname] do |ds|
81
+ ds.filter(:active).filter(:capacity=>1)
82
+ end
83
+ many_to_many :project_managers, :clone=>:deputies do |ds|
84
+ ds.filter(:active).filter(:capacity=>2)
85
+ end
86
+ many_to_many :team_leaders, :clone=>:deputies do |ds|
87
+ ds.filter(:active).filter(:capacity=>3)
88
+ end
89
+
90
+ All of the above would use the same :class, :join_table, :left_key,
91
+ :right_key, and :order options. If you don't provide an
92
+ association block, but you are cloning an association that has one,
93
+ the cloned association's block is used. You can use the
94
+ :block=>nil option to not use a block even if the cloned
95
+ association has a block.
96
+
97
+ * Dataset#select, #select_more, #order, #order_more, and #get all
98
+ take a block that yields a Sequel::SQL::VirtualRow instance,
99
+ similar to the behavior of filter. This allows for the easier
100
+ use of SQL functions on Ruby 1.9:
101
+
102
+ # 2.10.0
103
+ dataset.select(:prettify.sql_function(:name))
104
+ # 2.11.0
105
+ dataset.select{|o| o.prettify(:name)}
106
+
107
+ * String#lit can now accept arguments and return an SQL literal
108
+ string. This allows you to do things that were previously hard
109
+ or at least unnecessarily verbose. For example, you can now
110
+ easily use the SQL standard SUBSTRING function:
111
+
112
+ column = :user
113
+ pattern = params[:pattern]
114
+ dataset.select{|o| o.substring('? from ?'.lit(column, pattern))}
115
+
116
+ * A validates_inclusion_of validation method was added to Model. You
117
+ can provide a Range or an Array in the :in option to specify the
118
+ allowed values:
119
+
120
+ validates_inclusion_of :value, :in=>1..5
121
+ validates_inclusion_of :weekday, :in=>%w'Monday Tuesday ...'
122
+
123
+ * Dataset#with_sql was added, which returns a copy of the dataset
124
+ with static SQL. This is useful if you want to keep the same
125
+ row_proc/graph/transform/etc., but want to use your own custom
126
+ SQL.
127
+
128
+ Other Improvements
129
+ ------------------
130
+
131
+ * You can now use Sequel's database independent types when casting:
132
+
133
+ dataset.select(:number.cast(String))
134
+
135
+ Among other things, the default cast types for cast_string and
136
+ cast_numeric now work in the MySQL adapter.
137
+
138
+ * Model#set_associated_object was added. The many_to_one association
139
+ setter method calls it. This allows you to easily override the
140
+ association setters for all many_to_one associations of a class
141
+ by modifying a single method.
142
+
143
+ * Typecasting invalid date strings now raises a
144
+ Sequel::Error::InvalidValue instead of an argument error, which
145
+ means that you can use raise_on_typecast_failure = false and not
146
+ have an error raised when an invalid date format is used.
147
+
148
+ * String#to_sequel_blob was added and should now be used instead
149
+ of String#to_blob. sqlite3-ruby defines String#to_blob
150
+ differently, which could cause problems.
151
+
152
+ * Blob columns are now fully supported in the SQLite adapter, with
153
+ the hex escape syntax being used for input, and returning columns
154
+ of type Sequel::SQL::Blob on output.
155
+
156
+ * The SQLite adapter drop_column support is now significantly more
157
+ robust.
158
+
159
+ * The SQLite adapter now supports rename_column.
160
+
161
+ * The MySQL adapter now supports stored procedures with multiple
162
+ arguments.
163
+
164
+ * The MySQL adapter can now not use a compressed connection to the
165
+ server via the :compress=>false option.
166
+
167
+ * The MySQL adapter now sets a default timeout of 30 days to the
168
+ database connection, you can change it via the :timeout option,
169
+ which accepts a number of seconds.
170
+
171
+ * The MySQL adapter now sets SQL_AUTO_IS_NULL to false by default,
172
+ you can use the :auto_is_null=>true option to not do this.
173
+
174
+ * The MySQL adapter now sets the encoding option on the database
175
+ connection itself, so it works across reconnects.
176
+
177
+ * Sequel itself no longer uses String#lit or Symbol#* internally, so
178
+ it shouldn't break if another library defines them.
179
+
180
+ * The default index name is now generated correctly if a non-String
181
+ or Symbol column is used.
182
+
183
+ * Some ruby -w warnings have been fixed.
184
+
185
+ * INSERTs are now sent to the master database instead of the slave
186
+ database(s) if using a master/slave database configuration and
187
+ PostgreSQL 8.2+ or Firebird.
188
+
189
+ * DateTime literalization has been fixed in the Firebird adapter.
190
+
191
+ * Date literalization has been fixed in the H2 JDBC subadapter.
192
+
193
+ * Release notes for versions from 1.0 to the present are now included
194
+ in the Sequel repository and the RDoc documentation, see
195
+ http://sequel.rubyforge.org/rdoc/files/doc/release_notes/
196
+
197
+ Backwards Compatibilty
198
+ ----------------------
199
+
200
+ * The optimization of Model.[] may break if you modify the model's
201
+ dataset behind its back. Always use Model.set_dataset if you
202
+ want to change a Model's dataset.
203
+
204
+ * Sequel::Dataset::UnsupportedExceptIntersect and
205
+ Sequel::Dataset::UnsupportedExceptIntersectAll will now only be
206
+ defined if you are using an adapter that requires them.
207
+
208
+ * The private Model#cache_delete_unless_new method has been removed.
209
+
210
+ * Sequel::SQL::IrregularFunction was removed, as it was a bad hack
211
+ that is not used by Sequel anymore. Unless you were instantiating
212
+ it directly or using a plugin/extension that did, this shouldn't
213
+ affect you. Using a Sequel::SQL::Function with a
214
+ Sequel::SQL::PlaceholderLiteralString is recommended instead, see
215
+ the substring example above.