sequel 3.21.0 → 3.39.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 (352) hide show
  1. data/CHANGELOG +1061 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +103 -63
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +67 -51
  7. data/doc/advanced_associations.rdoc +189 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/cheat_sheet.rdoc +21 -21
  10. data/doc/core_extensions.rdoc +374 -0
  11. data/doc/dataset_basics.rdoc +10 -10
  12. data/doc/dataset_filtering.rdoc +54 -42
  13. data/doc/mass_assignment.rdoc +56 -0
  14. data/doc/migration.rdoc +89 -557
  15. data/doc/model_hooks.rdoc +80 -29
  16. data/doc/object_model.rdoc +547 -0
  17. data/doc/opening_databases.rdoc +114 -53
  18. data/doc/prepared_statements.rdoc +41 -15
  19. data/doc/querying.rdoc +137 -56
  20. data/doc/reflection.rdoc +36 -10
  21. data/doc/release_notes/3.22.0.txt +39 -0
  22. data/doc/release_notes/3.23.0.txt +172 -0
  23. data/doc/release_notes/3.24.0.txt +420 -0
  24. data/doc/release_notes/3.25.0.txt +88 -0
  25. data/doc/release_notes/3.26.0.txt +88 -0
  26. data/doc/release_notes/3.27.0.txt +82 -0
  27. data/doc/release_notes/3.28.0.txt +304 -0
  28. data/doc/release_notes/3.29.0.txt +459 -0
  29. data/doc/release_notes/3.30.0.txt +135 -0
  30. data/doc/release_notes/3.31.0.txt +146 -0
  31. data/doc/release_notes/3.32.0.txt +202 -0
  32. data/doc/release_notes/3.33.0.txt +157 -0
  33. data/doc/release_notes/3.34.0.txt +671 -0
  34. data/doc/release_notes/3.35.0.txt +144 -0
  35. data/doc/release_notes/3.36.0.txt +245 -0
  36. data/doc/release_notes/3.37.0.txt +338 -0
  37. data/doc/release_notes/3.38.0.txt +234 -0
  38. data/doc/release_notes/3.39.0.txt +237 -0
  39. data/doc/schema_modification.rdoc +585 -0
  40. data/doc/sharding.rdoc +99 -8
  41. data/doc/sql.rdoc +154 -112
  42. data/doc/testing.rdoc +169 -0
  43. data/doc/thread_safety.rdoc +17 -0
  44. data/doc/transactions.rdoc +137 -0
  45. data/doc/validations.rdoc +1 -1
  46. data/doc/virtual_rows.rdoc +78 -43
  47. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  48. data/lib/sequel/adapters/ado.rb +40 -18
  49. data/lib/sequel/adapters/amalgalite.rb +17 -9
  50. data/lib/sequel/adapters/db2.rb +175 -86
  51. data/lib/sequel/adapters/dbi.rb +15 -15
  52. data/lib/sequel/adapters/do/mysql.rb +17 -11
  53. data/lib/sequel/adapters/do/postgres.rb +2 -61
  54. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  55. data/lib/sequel/adapters/do.rb +18 -36
  56. data/lib/sequel/adapters/firebird.rb +27 -208
  57. data/lib/sequel/adapters/ibmdb.rb +453 -0
  58. data/lib/sequel/adapters/informix.rb +6 -23
  59. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  60. data/lib/sequel/adapters/jdbc/db2.rb +56 -0
  61. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  62. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  63. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  64. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  65. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  66. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  67. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  68. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  69. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  70. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  71. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  73. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  74. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  75. data/lib/sequel/adapters/jdbc.rb +279 -97
  76. data/lib/sequel/adapters/mock.rb +372 -0
  77. data/lib/sequel/adapters/mysql.rb +125 -222
  78. data/lib/sequel/adapters/mysql2.rb +65 -56
  79. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  80. data/lib/sequel/adapters/odbc.rb +28 -9
  81. data/lib/sequel/adapters/openbase.rb +3 -5
  82. data/lib/sequel/adapters/oracle.rb +349 -53
  83. data/lib/sequel/adapters/postgres.rb +368 -138
  84. data/lib/sequel/adapters/shared/access.rb +32 -9
  85. data/lib/sequel/adapters/shared/db2.rb +343 -0
  86. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  87. data/lib/sequel/adapters/shared/informix.rb +53 -0
  88. data/lib/sequel/adapters/shared/mssql.rb +401 -116
  89. data/lib/sequel/adapters/shared/mysql.rb +424 -89
  90. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  91. data/lib/sequel/adapters/shared/oracle.rb +257 -45
  92. data/lib/sequel/adapters/shared/postgres.rb +675 -279
  93. data/lib/sequel/adapters/shared/progress.rb +5 -8
  94. data/lib/sequel/adapters/shared/sqlite.rb +285 -96
  95. data/lib/sequel/adapters/sqlite.rb +101 -39
  96. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  97. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  98. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  99. data/lib/sequel/adapters/swift.rb +28 -19
  100. data/lib/sequel/adapters/tinytds.rb +174 -22
  101. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  102. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  103. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  104. data/lib/sequel/ast_transformer.rb +194 -0
  105. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  106. data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
  107. data/lib/sequel/connection_pool/single.rb +5 -0
  108. data/lib/sequel/connection_pool/threaded.rb +43 -14
  109. data/lib/sequel/connection_pool.rb +10 -2
  110. data/lib/sequel/core.rb +143 -11
  111. data/lib/sequel/database/connecting.rb +38 -28
  112. data/lib/sequel/database/dataset.rb +4 -4
  113. data/lib/sequel/database/dataset_defaults.rb +63 -2
  114. data/lib/sequel/database/logging.rb +7 -2
  115. data/lib/sequel/database/misc.rb +190 -46
  116. data/lib/sequel/database/query.rb +272 -110
  117. data/lib/sequel/database/schema_generator.rb +103 -36
  118. data/lib/sequel/database/schema_methods.rb +300 -67
  119. data/lib/sequel/dataset/actions.rb +344 -90
  120. data/lib/sequel/dataset/features.rb +101 -8
  121. data/lib/sequel/dataset/graph.rb +42 -15
  122. data/lib/sequel/dataset/misc.rb +52 -25
  123. data/lib/sequel/dataset/mutation.rb +12 -7
  124. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  125. data/lib/sequel/dataset/query.rb +305 -54
  126. data/lib/sequel/dataset/sql.rb +720 -292
  127. data/lib/sequel/dataset.rb +8 -0
  128. data/lib/sequel/exceptions.rb +4 -0
  129. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  130. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  131. data/lib/sequel/extensions/blank.rb +4 -0
  132. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  133. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  134. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  135. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  136. data/lib/sequel/extensions/inflector.rb +4 -0
  137. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  138. data/lib/sequel/extensions/migration.rb +100 -11
  139. data/lib/sequel/extensions/named_timezones.rb +9 -0
  140. data/lib/sequel/extensions/null_dataset.rb +94 -0
  141. data/lib/sequel/extensions/pagination.rb +4 -0
  142. data/lib/sequel/extensions/pg_array.rb +537 -0
  143. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  144. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  145. data/lib/sequel/extensions/pg_hstore.rb +313 -0
  146. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  147. data/lib/sequel/extensions/pg_inet.rb +113 -0
  148. data/lib/sequel/extensions/pg_interval.rb +191 -0
  149. data/lib/sequel/extensions/pg_json.rb +208 -0
  150. data/lib/sequel/extensions/pg_range.rb +512 -0
  151. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  152. data/lib/sequel/extensions/pg_row.rb +572 -0
  153. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  154. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  155. data/lib/sequel/extensions/pretty_table.rb +17 -72
  156. data/lib/sequel/extensions/query.rb +8 -4
  157. data/lib/sequel/extensions/query_literals.rb +79 -0
  158. data/lib/sequel/extensions/schema_caching.rb +76 -0
  159. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  160. data/lib/sequel/extensions/select_remove.rb +39 -0
  161. data/lib/sequel/extensions/server_block.rb +140 -0
  162. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  163. data/lib/sequel/extensions/sql_expr.rb +8 -110
  164. data/lib/sequel/extensions/string_date_time.rb +4 -0
  165. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  166. data/lib/sequel/extensions/to_dot.rb +99 -83
  167. data/lib/sequel/model/associations.rb +1263 -409
  168. data/lib/sequel/model/base.rb +624 -171
  169. data/lib/sequel/model/errors.rb +1 -1
  170. data/lib/sequel/model/exceptions.rb +24 -2
  171. data/lib/sequel/model/inflections.rb +1 -1
  172. data/lib/sequel/model.rb +30 -11
  173. data/lib/sequel/no_core_ext.rb +2 -0
  174. data/lib/sequel/plugins/active_model.rb +13 -1
  175. data/lib/sequel/plugins/association_pks.rb +22 -4
  176. data/lib/sequel/plugins/caching.rb +25 -18
  177. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  178. data/lib/sequel/plugins/composition.rb +44 -12
  179. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  180. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  181. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  182. data/lib/sequel/plugins/dirty.rb +214 -0
  183. data/lib/sequel/plugins/eager_each.rb +59 -0
  184. data/lib/sequel/plugins/force_encoding.rb +6 -6
  185. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  186. data/lib/sequel/plugins/identity_map.rb +134 -15
  187. data/lib/sequel/plugins/instance_filters.rb +10 -0
  188. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  189. data/lib/sequel/plugins/json_serializer.rb +58 -6
  190. data/lib/sequel/plugins/list.rb +13 -2
  191. data/lib/sequel/plugins/many_through_many.rb +103 -51
  192. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  193. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  194. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  195. data/lib/sequel/plugins/pg_row.rb +121 -0
  196. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  197. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  198. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  199. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  200. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  201. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  202. data/lib/sequel/plugins/schema.rb +8 -3
  203. data/lib/sequel/plugins/serialization.rb +98 -49
  204. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  205. data/lib/sequel/plugins/sharding.rb +21 -54
  206. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  207. data/lib/sequel/plugins/static_cache.rb +99 -0
  208. data/lib/sequel/plugins/subclasses.rb +29 -3
  209. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  210. data/lib/sequel/plugins/timestamps.rb +1 -1
  211. data/lib/sequel/plugins/tree.rb +3 -3
  212. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  213. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  214. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  215. data/lib/sequel/plugins/validation_helpers.rb +55 -4
  216. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  217. data/lib/sequel/sql.rb +649 -122
  218. data/lib/sequel/timezones.rb +67 -40
  219. data/lib/sequel/version.rb +1 -1
  220. data/spec/adapters/db2_spec.rb +146 -0
  221. data/spec/adapters/firebird_spec.rb +1 -1
  222. data/spec/adapters/mssql_spec.rb +194 -66
  223. data/spec/adapters/mysql_spec.rb +475 -306
  224. data/spec/adapters/oracle_spec.rb +92 -117
  225. data/spec/adapters/postgres_spec.rb +1982 -325
  226. data/spec/adapters/spec_helper.rb +9 -6
  227. data/spec/adapters/sqlite_spec.rb +203 -75
  228. data/spec/core/connection_pool_spec.rb +218 -93
  229. data/spec/core/database_spec.rb +956 -522
  230. data/spec/core/dataset_spec.rb +1631 -1242
  231. data/spec/core/expression_filters_spec.rb +690 -334
  232. data/spec/core/mock_adapter_spec.rb +453 -0
  233. data/spec/core/object_graph_spec.rb +88 -129
  234. data/spec/core/schema_generator_spec.rb +4 -4
  235. data/spec/core/schema_spec.rb +556 -53
  236. data/spec/core/spec_helper.rb +7 -48
  237. data/spec/core_extensions_spec.rb +626 -0
  238. data/spec/extensions/active_model_spec.rb +13 -0
  239. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  240. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  241. data/spec/extensions/association_dependencies_spec.rb +15 -25
  242. data/spec/extensions/association_pks_spec.rb +66 -32
  243. data/spec/extensions/association_proxies_spec.rb +4 -4
  244. data/spec/extensions/boolean_readers_spec.rb +25 -25
  245. data/spec/extensions/caching_spec.rb +47 -51
  246. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  247. data/spec/extensions/columns_introspection_spec.rb +91 -0
  248. data/spec/extensions/composition_spec.rb +18 -13
  249. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  250. data/spec/extensions/constraint_validations_spec.rb +316 -0
  251. data/spec/extensions/dataset_associations_spec.rb +199 -0
  252. data/spec/extensions/defaults_setter_spec.rb +88 -0
  253. data/spec/extensions/dirty_spec.rb +155 -0
  254. data/spec/extensions/eager_each_spec.rb +34 -0
  255. data/spec/extensions/eval_inspect_spec.rb +67 -0
  256. data/spec/extensions/force_encoding_spec.rb +4 -2
  257. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  258. data/spec/extensions/identity_map_spec.rb +142 -24
  259. data/spec/extensions/inflector_spec.rb +0 -4
  260. data/spec/extensions/instance_filters_spec.rb +11 -21
  261. data/spec/extensions/instance_hooks_spec.rb +72 -0
  262. data/spec/extensions/json_serializer_spec.rb +49 -12
  263. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  264. data/spec/extensions/list_spec.rb +49 -40
  265. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  266. data/spec/extensions/many_through_many_spec.rb +368 -254
  267. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  268. data/spec/extensions/migration_spec.rb +140 -35
  269. data/spec/extensions/named_timezones_spec.rb +29 -11
  270. data/spec/extensions/nested_attributes_spec.rb +268 -89
  271. data/spec/extensions/null_dataset_spec.rb +85 -0
  272. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  273. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  274. data/spec/extensions/pg_array_spec.rb +320 -0
  275. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  276. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  277. data/spec/extensions/pg_hstore_spec.rb +194 -0
  278. data/spec/extensions/pg_inet_spec.rb +47 -0
  279. data/spec/extensions/pg_interval_spec.rb +72 -0
  280. data/spec/extensions/pg_json_spec.rb +99 -0
  281. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  282. data/spec/extensions/pg_range_spec.rb +395 -0
  283. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  284. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  285. data/spec/extensions/pg_row_spec.rb +323 -0
  286. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  287. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  288. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  289. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  290. data/spec/extensions/prepared_statements_spec.rb +87 -0
  291. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  292. data/spec/extensions/pretty_table_spec.rb +7 -6
  293. data/spec/extensions/query_literals_spec.rb +167 -0
  294. data/spec/extensions/query_spec.rb +9 -3
  295. data/spec/extensions/rcte_tree_spec.rb +50 -43
  296. data/spec/extensions/schema_caching_spec.rb +41 -0
  297. data/spec/extensions/schema_dumper_spec.rb +434 -49
  298. data/spec/extensions/schema_spec.rb +30 -49
  299. data/spec/extensions/select_remove_spec.rb +38 -0
  300. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  301. data/spec/extensions/serialization_spec.rb +86 -48
  302. data/spec/extensions/server_block_spec.rb +90 -0
  303. data/spec/extensions/sharding_spec.rb +69 -143
  304. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  305. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  306. data/spec/extensions/spec_helper.rb +34 -67
  307. data/spec/extensions/split_array_nil_spec.rb +24 -0
  308. data/spec/extensions/sql_expr_spec.rb +29 -60
  309. data/spec/extensions/static_cache_spec.rb +145 -0
  310. data/spec/extensions/subclasses_spec.rb +14 -0
  311. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  312. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  313. data/spec/extensions/timestamps_spec.rb +6 -6
  314. data/spec/extensions/to_dot_spec.rb +8 -11
  315. data/spec/extensions/touch_spec.rb +13 -14
  316. data/spec/extensions/tree_spec.rb +11 -26
  317. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  318. data/spec/extensions/update_primary_key_spec.rb +30 -24
  319. data/spec/extensions/validation_class_methods_spec.rb +58 -67
  320. data/spec/extensions/validation_helpers_spec.rb +31 -37
  321. data/spec/extensions/xml_serializer_spec.rb +29 -4
  322. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  323. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  324. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  325. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  326. data/spec/integration/associations_test.rb +659 -21
  327. data/spec/integration/database_test.rb +11 -5
  328. data/spec/integration/dataset_test.rb +717 -129
  329. data/spec/integration/eager_loader_test.rb +38 -54
  330. data/spec/integration/migrator_test.rb +2 -3
  331. data/spec/integration/model_test.rb +81 -2
  332. data/spec/integration/plugin_test.rb +604 -147
  333. data/spec/integration/prepared_statement_test.rb +272 -128
  334. data/spec/integration/schema_test.rb +367 -57
  335. data/spec/integration/spec_helper.rb +42 -32
  336. data/spec/integration/timezone_test.rb +38 -12
  337. data/spec/integration/transaction_test.rb +183 -8
  338. data/spec/integration/type_test.rb +31 -8
  339. data/spec/model/association_reflection_spec.rb +207 -8
  340. data/spec/model/associations_spec.rb +1206 -693
  341. data/spec/model/base_spec.rb +334 -100
  342. data/spec/model/dataset_methods_spec.rb +45 -27
  343. data/spec/model/eager_loading_spec.rb +828 -692
  344. data/spec/model/hooks_spec.rb +355 -67
  345. data/spec/model/model_spec.rb +251 -179
  346. data/spec/model/plugins_spec.rb +24 -13
  347. data/spec/model/record_spec.rb +506 -232
  348. data/spec/model/spec_helper.rb +16 -77
  349. data/spec/model/validations_spec.rb +38 -2
  350. data/spec/rcov.opts +2 -0
  351. metadata +209 -80
  352. data/spec/core/core_sql_spec.rb +0 -451
@@ -0,0 +1,146 @@
1
+ = New Features
2
+
3
+ * The serialization plugin can now support custom serialization
4
+ formats, by supplying a serializer/deserializer pair of
5
+ callable objects. You can also register custom deserializers
6
+ via Sequel::Plugins::Serialization.register_format, so that
7
+ they can be referenced by name. Example:
8
+
9
+ Sequel::Plugins::Serialization.register_format(:reverse,
10
+ lambda{|v| v.reverse},
11
+ lambda{|v| v.reverse})
12
+ class User < Sequel::Model
13
+ serialize_attributes :reverse, :password
14
+ end
15
+
16
+ * Dataset#import and #multi_insert now support a
17
+ :return=>:primary_key option. When this option is used, the
18
+ methods return an array of primary key values, one for each
19
+ inserted row. Usage of this option on MySQL requires that a
20
+ separate query be issued per row (instead of the single
21
+ query for all rows that MySQL would usually use).
22
+
23
+ * PostgreSQL can now use Dataset#returning in conjunction with
24
+ import/multi_insert to set a custom column to return.
25
+
26
+ * Microsoft SQL Server can now use Dataset#output in conjection with
27
+ import/multi_insert to set a custom column to return.
28
+
29
+ * Dataset#import and #multi_insert now respect a :server option to
30
+ set the server/shard on which to execute the queries.
31
+ Additionally, options given to this method are also passed to
32
+ Dataset#transaction.
33
+
34
+ * Dataset#insert_multiple now returns an array of inserted primary
35
+ keys.
36
+
37
+ * Model.def_column_alias has been added to make it easy to create
38
+ alias methods for columns. This is useful if you have a legacy
39
+ database and want to create friendly method names for the
40
+ underlying columns. Note that this alias only affects the setter
41
+ and getter methods. This does not affect the dataset level, so you
42
+ still need to use the actual column names in dataset filters.
43
+
44
+ * many_to_one associations can now have the same name as the related
45
+ foreign key column, using the :key_column option. Use of this
46
+ feature is not recommended, as it is much better to either rename
47
+ the column or rename the association. Here's an example of usage:
48
+
49
+ # Example schema:
50
+ # albums artists
51
+ # :id /--> :id
52
+ # :artist --/ :name
53
+ # :name
54
+ class Album < Sequel::Model
55
+ def_column_alias(:artist_id, :artist)
56
+ many_to_one :artist, :key_column=>:artist
57
+ end
58
+
59
+ * The mock adapter can now mock out database types, by providing a
60
+ shared adapter name as the host (e.g. mock://postgres). This
61
+ emulation is not perfect, but in most cases it allows you to see
62
+ what SQL Sequel would generate on a given database without needing
63
+ to install the required database driver.
64
+
65
+ * Sequel now supports creating full text indexes on Microsoft SQL
66
+ Server. Before using it, you must have previously setup a default
67
+ full text search catalog, and you need to provide a :key_index
68
+ option with an index name symbol.
69
+
70
+ * Dataset#group_rollup and #group_cube methods have been added for
71
+ GROUP BY ROLLUP and GROUP BY CUBE support. These features are in
72
+ a recent SQL standard, and they are supported to various degrees on
73
+ Microsoft SQL Server, DB2, Oracle, MySQL, and Derby.
74
+
75
+ * Dataset#full_text_search on Microsoft SQL Server now supports
76
+ multiple search terms.
77
+
78
+ * The jdbc adapter now supports a :login_timeout option, giving the
79
+ timeout in seconds.
80
+
81
+ = Other Improvements
82
+
83
+ * Dataset#exists can now be used with prepared statement
84
+ placeholders.
85
+
86
+ * Dataset#full_text_search can now be used with prepared statement
87
+ placeholders on PostgreSQL, MySQL, and Microsoft SQL Server.
88
+
89
+ * If tables from two separate schema are detected when parsing the
90
+ schema for a table on PostgreSQL, an error is now raised.
91
+ Previously, no error was raised, which led to weird errors later,
92
+ such as duplicate columns in a model's primary_key.
93
+
94
+ * RETURNING is now supported with UPDATE/DELETE on PostgreSQL 8.2+.
95
+ Previously, Sequel only supported it on 9.1+, but PostgreSQL
96
+ introduced support for it in 8.2.
97
+
98
+ * The shared postgres adapter now correctly handles the return value
99
+ for Dataset#insert if you provide a separate column array and value
100
+ array on PostgreSQL < 8.2.
101
+
102
+ * Handle case in the PostgreSQL adapter where the server version
103
+ cannot be determined via a query.
104
+
105
+ * H2 clob types are now treated as string instead of as blob.
106
+ Treating clob as blob breaks on H2, as it doesn't automatically
107
+ hex-unescape the input for clobs as it does for blobs.
108
+
109
+ * Dataset#empty? now works correctly when the dataset has an offset
110
+ and offset support is being emulated.
111
+
112
+ * The mock adapter no longer defaults to downcasing identifiers on
113
+ output.
114
+
115
+ = Backwards Compatibility
116
+
117
+ * Dataset#exists now returns a PlaceholderLiteralString instead of a
118
+ LiteralString, which could potentially break some code. If you
119
+ would like a String returned, you can pass the returned object to
120
+ Dataset#literal:
121
+
122
+ dataset.literal(dataset.exists)
123
+
124
+ * Dataset#from no longer handles :a__b__c___d as "a.b.c AS d". This
125
+ was not the intended behavior, and nowhere else in Sequel is a
126
+ symbol treated that way. Now, Dataset#from is consistent with the
127
+ rest of Sequel, using "a.b__c AS d". This should only affect
128
+ people in very rare cases, as most databases don't use three level
129
+ qualified tables. One exception is Microsoft SQL Server, which can
130
+ use three level qualified tables for cross-database access.
131
+
132
+ * Previously, Dataset#insert_multiple returned an array of hashes, now
133
+ it returns an array of primary key values.
134
+
135
+ * Dataset#EXRACT_CLOSE in the shared sqlite adapter has been renamed to
136
+ Dataset#EXTRACT_CLOSE.
137
+
138
+ * Dataset::StoredProcedureMethods::SQL_QUERY_TYPE and
139
+ Dataset::ArgumentMapper::SQL_QUERY_TYPE constants have been removed,
140
+ as have related sql_query_type private methods.
141
+
142
+ * The serialization plugin was significantly refactored.
143
+ Model.serialization_map now contains a callable object instead of a
144
+ Symbol, and Model.serialization_format has been removed.
145
+ Model.define_serialized_attribute_accessors private method now takes
146
+ two callable objects before the columns, instead of a single symbol.
@@ -0,0 +1,202 @@
1
+ = New Features
2
+
3
+ * Prepared statements now support :map and :to_hash prepared
4
+ statement types. The main reason for this is that certain
5
+ extensions (e.g. sequel_pg) optimize map/to_hash calls, and
6
+ there previously was not a way to use prepared statements
7
+ with the map/to_hash optimizations.
8
+
9
+ * Sequel.empty_array_handle_nulls has been added to change how
10
+ IN/NOT IN operations with an empty array are handled. See
11
+ the Backwards Compatibility section for details.
12
+
13
+ * 5 new association options have been added that allow you to
14
+ define associations where the underlying columns clash with
15
+ standard ruby method names:
16
+
17
+ many_to_one :primary_key_method
18
+ one_to_many :key_method
19
+ one_to_many :primary_key_column
20
+ many_to_many :left_primary_key_column
21
+ many_to_many :right_primary_key_method
22
+
23
+ Using these new options, you can now define associations
24
+ that work correctly when the underlying primary/foreign key
25
+ columns clash with existing ruby method names. See the RDoc
26
+ for details.
27
+
28
+ * A use_after_commit_rollback setting has been added to models.
29
+ This defaults to true, but can be set to false for performance
30
+ or to allow models to be used in prepared transactions
31
+ (which don't support after_commit/after_rollback).
32
+
33
+ * Dataset#update_ignore has been added when connecting to MySQL,
34
+ enabling use of the UPDATE IGNORE syntax to skip updating a row
35
+ if the update would cause a unique constraint to be violated.
36
+
37
+ * Database#indexes is now supported when connecting to Microsoft
38
+ SQL Server.
39
+
40
+ * On Microsoft SQL Server, the :include option is now supported
41
+ when creating indexes, for storing column values in the index,
42
+ which can be used by the query optimizer.
43
+
44
+ = Other Improvements
45
+
46
+ * The filtering/excluding by associations code now uses qualified
47
+ identifiers instead of unqualified identifiers, which allows it
48
+ to avoid ambiguous column names if you are doing your own joins.
49
+
50
+ * Virtual row blocks that return arrays are now handled correctly
51
+ in Dataset#select_map/select_order_map.
52
+
53
+ * Dataset#select_map/select_order_map can now take both a block
54
+ argument as well as a regular argument.
55
+
56
+ * Dataset#select_order_map now handles virtual row blocks that
57
+ return ordered expressions.
58
+
59
+ * Database#table_exists? should no longer generate false negatives
60
+ if you only have permission to retrieve some column values but
61
+ not all. Note that if you lack permission to SELECT from the
62
+ table itself, table_exists? can still generate false negatives.
63
+
64
+ * The active_model plugin now supports ActiveModel 3.2, by adding
65
+ support for to_partial_path.
66
+
67
+ * The serialization_modification_detection plugin now handles
68
+ changed_columns correctly both for new objects and after saving
69
+ objects.
70
+
71
+ * The serialization plugin now clears the deserialized values when
72
+ it does the automatic refresh after saving a new object, mostly for
73
+ consistency. You can use the skip_create_refresh plugin to skip
74
+ refreshing when creating a new model object.
75
+
76
+ * Column default values are now wrapped in parentheses on SQLite,
77
+ which fixes some cases such as when the default is an SQL function
78
+ call.
79
+
80
+ * Alter table emulation now works correctly on SQLite when foreign
81
+ keys reference the table being altered. The emulation requires
82
+ a renaming/deleting the existing table and creating a new table,
83
+ which can break foreign key references. Sequel now disables the
84
+ foreign key PRAGMA when altering tables, so SQLite won't track
85
+ the table renames and break the foreign key relationships.
86
+
87
+ * The set_column_type table alteration method no longer modifies
88
+ default values and NULL/NOT NULL settings on Microsoft SQL
89
+ Server, H2, and SQLite.
90
+
91
+ * On MySQL, Time/DateTime columns now use the timestamp type if the
92
+ default value is Sequel::CURRENT_TIMESTAMP, since it is currently
93
+ impossible for MySQL to have a non-constant default for a
94
+ datetime column (without using a workaround like a trigger).
95
+
96
+ * Metadata methods such as tables, views, and view_exists? are now
97
+ handled correctly on Oracle if custom identifier input methods
98
+ are used.
99
+
100
+ * Sequel now ignores errors that occur when attempting to get
101
+ information on column defaults in Oracle (which can happen if you
102
+ lack permission to the appropriate table). Previously, such errors
103
+ would cause the schema parser to raise an error, now, the schema
104
+ information is just returned without default information.
105
+
106
+ * Database#indexes now skips the primary key index when connecting to
107
+ DB2, Derby, HSQLDB, and Oracle via the jdbc adapter.
108
+
109
+ * Database#indexes now works correctly on DB2.
110
+
111
+ * The progress adapter has been fixed, it had been broken since the
112
+ dataset literalization refactoring.
113
+
114
+ * Dataset#naked! now works correctly. Previously, it just returned
115
+ the receiver unmodified.
116
+
117
+ * Dataset#paginate! has been removed, as it was broken.
118
+
119
+ * The query extension no longer breaks Dataset#clone if an argument
120
+ is not given.
121
+
122
+ * Transaction related queries are no longer logged twice in the mock
123
+ adapter.
124
+
125
+ = Backwards Compatibility
126
+
127
+ * Sequel's default handling of NOT IN operators with an empty array
128
+ of values has changed, which can change which rows are returned for
129
+ such queries.
130
+
131
+ Previously, Sequel was inconsistent in that it tried to handle NULL
132
+ values correctly in the IN case, but not in the NOT IN case. Now,
133
+ it defaults to handling NULL values correctly in both cases:
134
+
135
+ # 3.31.0
136
+ DB[:a].where(:b=>[])
137
+ # SELECT * FROM a WHERE (b != b)
138
+ DB[:a].exclude(:b=>[])
139
+ # SELECT * FROM a WHERE (1 = 1)
140
+
141
+ # 3.32.0
142
+ DB[:a].where(:b=>[])
143
+ # SELECT * FROM a WHERE (b != b)
144
+ DB[:a].exclude(:b=>[])
145
+ # SELECT * FROM a WHERE (b = b)
146
+
147
+ The important change in behavior is that in the NOT IN case, if
148
+ the left hand argument is NULL, the filter returns NULL instead
149
+ of true. This has the potential to change query results.
150
+
151
+ "Correct" here is really an opinion and not a fact, as there are
152
+ valid arguments for the alternative behavior:
153
+
154
+ DB[:a].where(:b=>[])
155
+ # SELECT * FROM a WHERE (1 = 0)
156
+ DB[:a].exclude(:b=>[])
157
+ # SELECT * FROM a WHERE (1 = 1)
158
+
159
+ The difference is that the "correct" NULL behavior is more
160
+ consistent with the non-empty array cases. For example, if b is
161
+ NULL:
162
+
163
+ # "Correct" NULL handling
164
+ # Empty array: where(:b=>[])
165
+ WHERE (b != b) # NULL
166
+ WHERE (b = b) # NULL
167
+ # Non-empty array: where(:b=>[1, 2])
168
+ WHERE (b IN (1, 2)) # NULL
169
+ WHERE (b NOT IN (1, 2)) # NULL
170
+
171
+ # Static boolean handling
172
+ # Empty array: where(:b=>[])
173
+ WHERE (1 = 0) # false
174
+ WHERE (1 = 1) # true
175
+ # Non-empty array: where(:b=>[1, 2])
176
+ WHERE (b IN (1, 2)) # NULL
177
+ WHERE (b NOT IN (1, 2)) # NULL
178
+
179
+ Sequel chooses to default to behavior consistent with the non-empty
180
+ array cases (similar to SQLAlchemy). However, there are two
181
+ downsides to this handling. The first is that some databases with
182
+ poor optimizers (e.g. MySQL) might do a full table scan with the
183
+ default syntax. The second is that the static boolean handling may
184
+ be generally perferable, if you believe that IN/NOT IN with an
185
+ empty array should always be true or false and never NULL even if
186
+ the left hand argument is NULL.
187
+
188
+ As there really isn't a truly correct answer in this case, Sequel
189
+ defaults to the "correct" NULL handling, and allows you to switch
190
+ to the static boolean handling via:
191
+
192
+ Sequel.empty_array_handle_nulls = false
193
+
194
+ This is currently a global setting, it may be made Database or
195
+ Dataset specific later if requested. Also, it is possible the
196
+ default will switch in the future, so if you care about a specific
197
+ handling, you should set your own default.
198
+
199
+ * Database#table_exists? now only rescues Sequel::DatabaseErrors
200
+ instead of StandardErrors, so it's possible it will raise errors
201
+ instead of returning false on custom adapters that don't wrap
202
+ their errors correctly.
@@ -0,0 +1,157 @@
1
+ = New Features
2
+
3
+ * A server_block extension has been added that makes Sequel's
4
+ sharding support easier to use by scoping database access inside
5
+ the block to a given server/shard:
6
+
7
+ Sequel.extension :server_block
8
+ DB.extend Sequel::ServerBlock
9
+ DB.with_server(:shard_1) do
10
+ # All of these will execute against shard_1
11
+ DB.tables
12
+ DB[:table].all
13
+ DB.run 'SOME SQL'
14
+ end
15
+
16
+ * An arbitrary_servers extension has been added that extends
17
+ Sequel's sharding support so that you can use arbitrary
18
+ connection options instead of referencing an existing, predefined
19
+ server/shard:
20
+
21
+ Sequel.extension :arbitrary_servers
22
+ DB.pool.extend Sequel::ArbitraryServers
23
+ DB[:table].server(:host=>'foo', :database=>'bar').all
24
+
25
+ You can use this extension in conjunction with the server_block
26
+ extension:
27
+
28
+ DB.with_server(:host=>'foo', :database=>'bar') do
29
+ DB.synchronize do
30
+ # All of these will execute on host foo, database bar
31
+ DB.tables
32
+ DB[:table].all
33
+ DB.run 'SOME SQL'
34
+ end
35
+ end
36
+
37
+ The combination of these two extensions makes it pretty easy to
38
+ write a thread-safe Rack middleware that scopes each request
39
+ to an arbitrary database.
40
+
41
+ * The sqlite adapter now supports an integer_booleans setting
42
+ for using 1/0 for true/false values, instead of the the 't'/'f'
43
+ values used by default. As SQLite recommends using integers to
44
+ store booleans, converting your existing database and enabling
45
+ this setting is recommended, but for backwards compatibility it
46
+ is set to false. You can convert you existing database by doing
47
+ the following for each table/column that has booleans:
48
+
49
+ DB[:table].update(:boolean_column=>{'t'=>1}.
50
+ case(0, :boolean_column))
51
+
52
+ The integer_booleans default setting may change in a future
53
+ version of Sequel, so you should set it manually to false if you
54
+ prefer the current default.
55
+
56
+ * You can now disable transaction use in migrations, in one of two
57
+ ways. You generally only need to do this if you are using an
58
+ SQL query inside a migration that is specifically not supported
59
+ inside a transaction, such as CREATE INDEX CONCURRENTLY on
60
+ PostgreSQL.
61
+
62
+ The first way to disable transactions is on a per-migration basis
63
+ by calling the no_transaction method inside the Sequel.migration
64
+ block:
65
+
66
+ Sequel.migration do
67
+ no_transaction
68
+ change do
69
+ # ...
70
+ end
71
+ end
72
+
73
+ That will make it so that a transaction is not used for that
74
+ particular migration. The second way is passing the
75
+ :use_tranctions=>false option when calling Migrator.run (using
76
+ the API), which will completely disable transactions for all
77
+ migrations during the migrator run.
78
+
79
+ * The postgres adapter now respects an :sslmode option when using
80
+ pg as the underlying driver, you can set the value of this option to
81
+ disable, allow, prefer, or require.
82
+
83
+ * Database#create_schema and #drop_schema are now defined when
84
+ connecting to PostgreSQL.
85
+
86
+ * Database#supports_savepoints_in_prepared_transactions? has been
87
+ added for checking if savepoints are supported inside prepared
88
+ transactions. This is true if both savepoints and prepared
89
+ transactions are both supported, except on MySQL > 5.5.12 (due to
90
+ MySQL bug 64374).
91
+
92
+ = Other Improvements
93
+
94
+ * The mysql and mysql2 adapters now both provide an accurate number
95
+ of rows matched, so Sequel::Model usage on those adapters will now
96
+ raise a NoExistingObject exception by default if you attempt to
97
+ delete or update an instance that no longer exists in the database.
98
+
99
+ * Foreign key creation now works correctly without specifying the
100
+ :key option when using MySQL with the InnoDB table engine. InnoDB
101
+ requires that you list the column explicitly, even if you are
102
+ referencing the primary key of the table, so if the :key option is
103
+ not given, the database schema is introspected to find the primary
104
+ key for the table. If you are attempting to create a table with
105
+ a self-referential foreign key, it introspects the generator to
106
+ get the primary key for the table.
107
+
108
+ * The sqlite adapter will now return 1/0 stored in boolean columns as
109
+ true/false. It will convert dates stored as Integers/Floats to
110
+ Date objects by assuming they represent the julian date. It will
111
+ convert times stored as Integers/Floats to Sequel::SQLTime objects
112
+ by assuming they represent a number of seconds. It will convert
113
+ datetimes stored as Integers by assuming they represent a unix
114
+ epoch time integer, and datetimes stored as Floats by assuming the
115
+ represent the julian date (with fractional part representing the
116
+ time of day). These changes make Sequel handle SQLite's
117
+ recommendations for boolean/date/time storage.
118
+
119
+ * The instance_hooks plugin's (before|after)_*_hook methods now return
120
+ self so they can be used in a method chain.
121
+
122
+ * The list plugin now automatically adds new entries to the end of the
123
+ list when creating the entries, if the position field is not
124
+ specifically set.
125
+
126
+ * An identifier_output_method is now respected in the mysql2 adapter.
127
+
128
+ * NaN/Infinity Float values are now quoted correctly for input on
129
+ PostgreSQL, and the postgres adapter correctly handles them on
130
+ retrieval from the database.
131
+
132
+ * The :collate column option is now respected when creating tables or
133
+ altering columns on MySQL.
134
+
135
+ * You can now force use of the TimestampMigrator when the
136
+ IntegerMigrator would be used by default by calling
137
+ TimestampMigrator.apply or .run.
138
+
139
+ * Mock adapter usage with a specific SQL dialect now uses the
140
+ appropriate defaults for quoting identifiers.
141
+
142
+ * You can now disable the use of sudo in the rake install/uninstall
143
+ tasks using the SUDO='' environment variable.
144
+
145
+ * A very misleading error message has been fixed when attempting
146
+ to constantize an invalid string in the model inflector.
147
+
148
+ = Backwards Compatibility
149
+
150
+ * The sqlite adapter now typecasts columns that SQLite stores as
151
+ INTEGER/REAL. Previously, it only typecasted columns that
152
+ SQLite stored as TEXT/BLOB. For details about SQLite storage, see
153
+ http://www.sqlite.org/datatype3.html.
154
+
155
+ Any custom type conversion procs used with the sqlite adapter should
156
+ be modified to work with Integer/Float objects in addition to String
157
+ objects.