sequel 3.21.0 → 3.41.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 (363) hide show
  1. data/CHANGELOG +1131 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +106 -65
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +68 -52
  7. data/doc/advanced_associations.rdoc +201 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/bin_sequel.rdoc +144 -0
  10. data/doc/cheat_sheet.rdoc +21 -21
  11. data/doc/core_extensions.rdoc +374 -0
  12. data/doc/dataset_basics.rdoc +10 -10
  13. data/doc/dataset_filtering.rdoc +54 -42
  14. data/doc/mass_assignment.rdoc +56 -0
  15. data/doc/migration.rdoc +89 -557
  16. data/doc/model_hooks.rdoc +80 -29
  17. data/doc/object_model.rdoc +576 -0
  18. data/doc/opening_databases.rdoc +121 -53
  19. data/doc/prepared_statements.rdoc +41 -15
  20. data/doc/querying.rdoc +137 -56
  21. data/doc/reflection.rdoc +36 -10
  22. data/doc/release_notes/3.22.0.txt +39 -0
  23. data/doc/release_notes/3.23.0.txt +172 -0
  24. data/doc/release_notes/3.24.0.txt +420 -0
  25. data/doc/release_notes/3.25.0.txt +88 -0
  26. data/doc/release_notes/3.26.0.txt +88 -0
  27. data/doc/release_notes/3.27.0.txt +82 -0
  28. data/doc/release_notes/3.28.0.txt +304 -0
  29. data/doc/release_notes/3.29.0.txt +459 -0
  30. data/doc/release_notes/3.30.0.txt +135 -0
  31. data/doc/release_notes/3.31.0.txt +146 -0
  32. data/doc/release_notes/3.32.0.txt +202 -0
  33. data/doc/release_notes/3.33.0.txt +157 -0
  34. data/doc/release_notes/3.34.0.txt +671 -0
  35. data/doc/release_notes/3.35.0.txt +144 -0
  36. data/doc/release_notes/3.36.0.txt +245 -0
  37. data/doc/release_notes/3.37.0.txt +338 -0
  38. data/doc/release_notes/3.38.0.txt +234 -0
  39. data/doc/release_notes/3.39.0.txt +237 -0
  40. data/doc/release_notes/3.40.0.txt +73 -0
  41. data/doc/release_notes/3.41.0.txt +155 -0
  42. data/doc/schema_modification.rdoc +585 -0
  43. data/doc/sharding.rdoc +99 -8
  44. data/doc/sql.rdoc +154 -112
  45. data/doc/testing.rdoc +169 -0
  46. data/doc/thread_safety.rdoc +17 -0
  47. data/doc/transactions.rdoc +137 -0
  48. data/doc/validations.rdoc +1 -1
  49. data/doc/virtual_rows.rdoc +78 -43
  50. data/lib/sequel/adapters/ado/access.rb +334 -0
  51. data/lib/sequel/adapters/ado/mssql.rb +18 -12
  52. data/lib/sequel/adapters/ado.rb +69 -21
  53. data/lib/sequel/adapters/amalgalite.rb +17 -14
  54. data/lib/sequel/adapters/cubrid.rb +143 -0
  55. data/lib/sequel/adapters/db2.rb +178 -85
  56. data/lib/sequel/adapters/dbi.rb +19 -21
  57. data/lib/sequel/adapters/do/mysql.rb +17 -11
  58. data/lib/sequel/adapters/do/postgres.rb +2 -61
  59. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  60. data/lib/sequel/adapters/do.rb +20 -39
  61. data/lib/sequel/adapters/firebird.rb +33 -210
  62. data/lib/sequel/adapters/ibmdb.rb +452 -0
  63. data/lib/sequel/adapters/informix.rb +6 -29
  64. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  65. data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
  66. data/lib/sequel/adapters/jdbc/db2.rb +78 -0
  67. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  68. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  69. data/lib/sequel/adapters/jdbc/h2.rb +68 -31
  70. data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
  71. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  73. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  74. data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
  75. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  76. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  77. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  78. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  79. data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
  80. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  81. data/lib/sequel/adapters/jdbc.rb +308 -114
  82. data/lib/sequel/adapters/mock.rb +372 -0
  83. data/lib/sequel/adapters/mysql.rb +130 -230
  84. data/lib/sequel/adapters/mysql2.rb +64 -63
  85. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  86. data/lib/sequel/adapters/odbc.rb +29 -10
  87. data/lib/sequel/adapters/openbase.rb +7 -11
  88. data/lib/sequel/adapters/oracle.rb +364 -57
  89. data/lib/sequel/adapters/postgres.rb +379 -145
  90. data/lib/sequel/adapters/shared/access.rb +236 -11
  91. data/lib/sequel/adapters/shared/cubrid.rb +216 -0
  92. data/lib/sequel/adapters/shared/db2.rb +353 -0
  93. data/lib/sequel/adapters/shared/firebird.rb +231 -0
  94. data/lib/sequel/adapters/shared/informix.rb +53 -0
  95. data/lib/sequel/adapters/shared/mssql.rb +412 -116
  96. data/lib/sequel/adapters/shared/mysql.rb +396 -89
  97. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
  98. data/lib/sequel/adapters/shared/oracle.rb +262 -45
  99. data/lib/sequel/adapters/shared/postgres.rb +688 -279
  100. data/lib/sequel/adapters/shared/progress.rb +5 -8
  101. data/lib/sequel/adapters/shared/sqlite.rb +317 -96
  102. data/lib/sequel/adapters/sqlite.rb +109 -46
  103. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  104. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  105. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  106. data/lib/sequel/adapters/swift.rb +31 -27
  107. data/lib/sequel/adapters/tinytds.rb +177 -25
  108. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  109. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  110. data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
  111. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  112. data/lib/sequel/ast_transformer.rb +194 -0
  113. data/lib/sequel/connection_pool/sharded_single.rb +23 -13
  114. data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
  115. data/lib/sequel/connection_pool/single.rb +11 -3
  116. data/lib/sequel/connection_pool/threaded.rb +69 -20
  117. data/lib/sequel/connection_pool.rb +20 -18
  118. data/lib/sequel/core.rb +143 -11
  119. data/lib/sequel/database/connecting.rb +66 -29
  120. data/lib/sequel/database/dataset.rb +4 -4
  121. data/lib/sequel/database/dataset_defaults.rb +63 -2
  122. data/lib/sequel/database/logging.rb +7 -2
  123. data/lib/sequel/database/misc.rb +192 -51
  124. data/lib/sequel/database/query.rb +299 -114
  125. data/lib/sequel/database/schema_generator.rb +103 -36
  126. data/lib/sequel/database/schema_methods.rb +310 -69
  127. data/lib/sequel/dataset/actions.rb +344 -90
  128. data/lib/sequel/dataset/features.rb +101 -8
  129. data/lib/sequel/dataset/graph.rb +42 -15
  130. data/lib/sequel/dataset/misc.rb +52 -25
  131. data/lib/sequel/dataset/mutation.rb +12 -7
  132. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  133. data/lib/sequel/dataset/query.rb +322 -68
  134. data/lib/sequel/dataset/sql.rb +716 -293
  135. data/lib/sequel/dataset.rb +8 -0
  136. data/lib/sequel/exceptions.rb +4 -0
  137. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  138. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  139. data/lib/sequel/extensions/blank.rb +4 -0
  140. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  141. data/lib/sequel/extensions/connection_validator.rb +109 -0
  142. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  143. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  144. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  145. data/lib/sequel/extensions/inflector.rb +4 -0
  146. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  147. data/lib/sequel/extensions/migration.rb +100 -11
  148. data/lib/sequel/extensions/named_timezones.rb +9 -0
  149. data/lib/sequel/extensions/null_dataset.rb +94 -0
  150. data/lib/sequel/extensions/pagination.rb +4 -0
  151. data/lib/sequel/extensions/pg_array.rb +539 -0
  152. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  153. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  154. data/lib/sequel/extensions/pg_hstore.rb +334 -0
  155. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  156. data/lib/sequel/extensions/pg_inet.rb +113 -0
  157. data/lib/sequel/extensions/pg_interval.rb +191 -0
  158. data/lib/sequel/extensions/pg_json.rb +212 -0
  159. data/lib/sequel/extensions/pg_range.rb +513 -0
  160. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  161. data/lib/sequel/extensions/pg_row.rb +576 -0
  162. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  163. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  164. data/lib/sequel/extensions/pretty_table.rb +17 -72
  165. data/lib/sequel/extensions/query.rb +8 -4
  166. data/lib/sequel/extensions/query_literals.rb +79 -0
  167. data/lib/sequel/extensions/schema_caching.rb +76 -0
  168. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  169. data/lib/sequel/extensions/select_remove.rb +39 -0
  170. data/lib/sequel/extensions/server_block.rb +140 -0
  171. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  172. data/lib/sequel/extensions/sql_expr.rb +8 -110
  173. data/lib/sequel/extensions/string_date_time.rb +4 -0
  174. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  175. data/lib/sequel/extensions/to_dot.rb +99 -83
  176. data/lib/sequel/model/associations.rb +1263 -409
  177. data/lib/sequel/model/base.rb +624 -171
  178. data/lib/sequel/model/errors.rb +1 -1
  179. data/lib/sequel/model/exceptions.rb +24 -2
  180. data/lib/sequel/model/inflections.rb +1 -1
  181. data/lib/sequel/model.rb +30 -11
  182. data/lib/sequel/no_core_ext.rb +2 -0
  183. data/lib/sequel/plugins/active_model.rb +13 -1
  184. data/lib/sequel/plugins/association_pks.rb +137 -16
  185. data/lib/sequel/plugins/caching.rb +25 -18
  186. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  187. data/lib/sequel/plugins/composition.rb +44 -12
  188. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  189. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  190. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  191. data/lib/sequel/plugins/dirty.rb +214 -0
  192. data/lib/sequel/plugins/eager_each.rb +59 -0
  193. data/lib/sequel/plugins/force_encoding.rb +6 -6
  194. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  195. data/lib/sequel/plugins/identity_map.rb +134 -15
  196. data/lib/sequel/plugins/instance_filters.rb +10 -0
  197. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  198. data/lib/sequel/plugins/json_serializer.rb +77 -6
  199. data/lib/sequel/plugins/list.rb +13 -2
  200. data/lib/sequel/plugins/many_through_many.rb +103 -51
  201. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  202. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  203. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  204. data/lib/sequel/plugins/pg_row.rb +121 -0
  205. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  206. data/lib/sequel/plugins/prepared_statements.rb +168 -0
  207. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  208. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  209. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  210. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  211. data/lib/sequel/plugins/schema.rb +8 -3
  212. data/lib/sequel/plugins/serialization.rb +98 -49
  213. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  214. data/lib/sequel/plugins/sharding.rb +21 -54
  215. data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
  216. data/lib/sequel/plugins/static_cache.rb +99 -0
  217. data/lib/sequel/plugins/subclasses.rb +29 -3
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  219. data/lib/sequel/plugins/timestamps.rb +1 -1
  220. data/lib/sequel/plugins/touch.rb +18 -6
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  223. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  224. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  225. data/lib/sequel/plugins/validation_helpers.rb +57 -4
  226. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  227. data/lib/sequel/sql.rb +721 -141
  228. data/lib/sequel/timezones.rb +67 -40
  229. data/lib/sequel/version.rb +1 -1
  230. data/spec/adapters/db2_spec.rb +146 -0
  231. data/spec/adapters/firebird_spec.rb +53 -39
  232. data/spec/adapters/mssql_spec.rb +261 -66
  233. data/spec/adapters/mysql_spec.rb +597 -352
  234. data/spec/adapters/oracle_spec.rb +92 -117
  235. data/spec/adapters/postgres_spec.rb +2103 -341
  236. data/spec/adapters/spec_helper.rb +16 -6
  237. data/spec/adapters/sqlite_spec.rb +237 -76
  238. data/spec/core/connection_pool_spec.rb +270 -141
  239. data/spec/core/database_spec.rb +980 -524
  240. data/spec/core/dataset_spec.rb +1658 -1243
  241. data/spec/core/expression_filters_spec.rb +741 -334
  242. data/spec/core/mock_adapter_spec.rb +453 -0
  243. data/spec/core/object_graph_spec.rb +88 -129
  244. data/spec/core/schema_generator_spec.rb +4 -4
  245. data/spec/core/schema_spec.rb +556 -53
  246. data/spec/core/spec_helper.rb +7 -48
  247. data/spec/core_extensions_spec.rb +626 -0
  248. data/spec/extensions/active_model_spec.rb +13 -0
  249. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  250. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  251. data/spec/extensions/association_dependencies_spec.rb +15 -25
  252. data/spec/extensions/association_pks_spec.rb +227 -33
  253. data/spec/extensions/association_proxies_spec.rb +4 -4
  254. data/spec/extensions/boolean_readers_spec.rb +25 -25
  255. data/spec/extensions/caching_spec.rb +47 -51
  256. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  257. data/spec/extensions/columns_introspection_spec.rb +91 -0
  258. data/spec/extensions/composition_spec.rb +18 -13
  259. data/spec/extensions/connection_validator_spec.rb +118 -0
  260. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  261. data/spec/extensions/constraint_validations_spec.rb +316 -0
  262. data/spec/extensions/dataset_associations_spec.rb +199 -0
  263. data/spec/extensions/defaults_setter_spec.rb +88 -0
  264. data/spec/extensions/dirty_spec.rb +155 -0
  265. data/spec/extensions/eager_each_spec.rb +34 -0
  266. data/spec/extensions/eval_inspect_spec.rb +67 -0
  267. data/spec/extensions/force_encoding_spec.rb +4 -2
  268. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  269. data/spec/extensions/identity_map_spec.rb +142 -24
  270. data/spec/extensions/inflector_spec.rb +0 -4
  271. data/spec/extensions/instance_filters_spec.rb +11 -21
  272. data/spec/extensions/instance_hooks_spec.rb +72 -0
  273. data/spec/extensions/json_serializer_spec.rb +49 -12
  274. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  275. data/spec/extensions/list_spec.rb +49 -40
  276. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  277. data/spec/extensions/many_through_many_spec.rb +368 -254
  278. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  279. data/spec/extensions/migration_spec.rb +140 -35
  280. data/spec/extensions/named_timezones_spec.rb +29 -11
  281. data/spec/extensions/nested_attributes_spec.rb +268 -89
  282. data/spec/extensions/null_dataset_spec.rb +85 -0
  283. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  284. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  285. data/spec/extensions/pg_array_spec.rb +324 -0
  286. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  287. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  288. data/spec/extensions/pg_hstore_spec.rb +200 -0
  289. data/spec/extensions/pg_inet_spec.rb +47 -0
  290. data/spec/extensions/pg_interval_spec.rb +72 -0
  291. data/spec/extensions/pg_json_spec.rb +99 -0
  292. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  293. data/spec/extensions/pg_range_spec.rb +395 -0
  294. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  295. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  296. data/spec/extensions/pg_row_spec.rb +340 -0
  297. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  298. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  299. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  300. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  301. data/spec/extensions/prepared_statements_spec.rb +87 -0
  302. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  303. data/spec/extensions/pretty_table_spec.rb +7 -6
  304. data/spec/extensions/query_literals_spec.rb +167 -0
  305. data/spec/extensions/query_spec.rb +9 -3
  306. data/spec/extensions/rcte_tree_spec.rb +50 -43
  307. data/spec/extensions/schema_caching_spec.rb +41 -0
  308. data/spec/extensions/schema_dumper_spec.rb +434 -49
  309. data/spec/extensions/schema_spec.rb +30 -49
  310. data/spec/extensions/select_remove_spec.rb +38 -0
  311. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  312. data/spec/extensions/serialization_spec.rb +86 -48
  313. data/spec/extensions/server_block_spec.rb +90 -0
  314. data/spec/extensions/sharding_spec.rb +69 -143
  315. data/spec/extensions/single_table_inheritance_spec.rb +65 -29
  316. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  317. data/spec/extensions/spec_helper.rb +34 -67
  318. data/spec/extensions/split_array_nil_spec.rb +24 -0
  319. data/spec/extensions/sql_expr_spec.rb +29 -60
  320. data/spec/extensions/static_cache_spec.rb +145 -0
  321. data/spec/extensions/subclasses_spec.rb +14 -0
  322. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  323. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  324. data/spec/extensions/timestamps_spec.rb +6 -6
  325. data/spec/extensions/to_dot_spec.rb +8 -11
  326. data/spec/extensions/touch_spec.rb +53 -14
  327. data/spec/extensions/tree_spec.rb +11 -26
  328. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  329. data/spec/extensions/update_primary_key_spec.rb +30 -24
  330. data/spec/extensions/validation_class_methods_spec.rb +77 -68
  331. data/spec/extensions/validation_helpers_spec.rb +48 -37
  332. data/spec/extensions/xml_serializer_spec.rb +29 -4
  333. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  334. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  335. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  336. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  337. data/spec/integration/associations_test.rb +659 -21
  338. data/spec/integration/database_test.rb +25 -5
  339. data/spec/integration/dataset_test.rb +729 -141
  340. data/spec/integration/eager_loader_test.rb +38 -54
  341. data/spec/integration/migrator_test.rb +2 -3
  342. data/spec/integration/model_test.rb +81 -2
  343. data/spec/integration/plugin_test.rb +871 -160
  344. data/spec/integration/prepared_statement_test.rb +272 -128
  345. data/spec/integration/schema_test.rb +377 -57
  346. data/spec/integration/spec_helper.rb +49 -32
  347. data/spec/integration/timezone_test.rb +38 -12
  348. data/spec/integration/transaction_test.rb +183 -8
  349. data/spec/integration/type_test.rb +40 -8
  350. data/spec/model/association_reflection_spec.rb +207 -8
  351. data/spec/model/associations_spec.rb +1206 -693
  352. data/spec/model/base_spec.rb +334 -100
  353. data/spec/model/dataset_methods_spec.rb +45 -27
  354. data/spec/model/eager_loading_spec.rb +828 -692
  355. data/spec/model/hooks_spec.rb +355 -67
  356. data/spec/model/model_spec.rb +251 -179
  357. data/spec/model/plugins_spec.rb +24 -13
  358. data/spec/model/record_spec.rb +506 -232
  359. data/spec/model/spec_helper.rb +16 -77
  360. data/spec/model/validations_spec.rb +38 -2
  361. data/spec/rcov.opts +2 -0
  362. metadata +223 -81
  363. data/spec/core/core_sql_spec.rb +0 -451
@@ -46,6 +46,13 @@ unless the first argument is a hash. So the following statements are equivalent
46
46
  DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
47
47
  DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
48
48
 
49
+ Note that using an adapter method forces the use of the specified adapter, not a database type, even
50
+ though some adapters have the same name as the database type. So if you
51
+ want to connect to SQLite, for example, you can do so using the sqlite, do, jdbc, and swift adapters.
52
+ If you want to connect to SQLite on JRuby using the jdbc adapter, you should not use <tt>Sequel.sqlite</tt>
53
+ for example, as that uses the C-based sqlite3 gem. Instead, the <tt>Sequel.jdbc</tt> would be appropriate (though
54
+ as mentioned below, using <tt>Sequel.connect</tt> is recommended instead of <tt>Sequel.jdbc</tt>).
55
+
49
56
  == Passing a block to either method
50
57
 
51
58
  Both the Sequel.connect method and the specialized adapter methods take a block. If you
@@ -59,24 +66,24 @@ For example:
59
66
 
60
67
  These options are shared by all adapters unless otherwise noted.
61
68
 
62
- * :adapter - The adapter to use
63
- * :database - The name of the database to which to connect
64
- * :default_schema - The database schema to use by default.
65
- * :host - The hostname of the database server to which to connect
66
- * :logger - An array of SQL loggers to log to
67
- * :loggers - An array of SQL loggers to log to
68
- * :password - The password for the user account
69
- * :servers - A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
70
- * :single_threaded - Whether to use a single-threaded (non-thread safe) connection pool
71
- * :test - Whether to test that a valid database connection can be made (false by default)
72
- * :user - The user account name to use logging in
69
+ :adapter :: The adapter to use
70
+ :database :: The name of the database to which to connect
71
+ :default_schema :: The database schema to use in schema_modification and introspection.
72
+ :host :: The hostname of the database server to which to connect
73
+ :logger :: An array of SQL loggers to log to
74
+ :loggers :: An array of SQL loggers to log to
75
+ :password :: The password for the user account
76
+ :servers :: A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
77
+ :single_threaded :: Whether to use a single-threaded (non-thread safe) connection pool
78
+ :test :: Whether to test that a valid database connection can be made (false by default)
79
+ :user :: The user account name to use logging in
73
80
 
74
81
  The following options can be specified and are passed to the the database's internal connection pool.
75
82
 
76
- * :after_connect - A proc called after a new connection is made, with the connection object (default: nil)
77
- * :max_connections - The maximum size of the connection pool (default: 4 connections on most databases)
78
- * :pool_sleep_time - The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
79
- * :pool_timeout - The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
83
+ :after_connect :: A proc called after a new connection is made, with the connection object (default: nil)
84
+ :max_connections :: The maximum size of the connection pool (default: 4 connections on most databases)
85
+ :pool_sleep_time :: The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
86
+ :pool_timeout :: The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
80
87
 
81
88
  == Adapter specific connection options
82
89
 
@@ -131,8 +138,8 @@ Amalgalite is an ruby extension that provides self contained access to SQLite,
131
138
  so you don't need to install SQLite separately. As amalgalite is a file backed
132
139
  database, the :host, :user, and :password options are not used.
133
140
 
134
- * :database - The name of the database file
135
- * :timeout - The busy timeout period given in milliseconds
141
+ :database :: The name of the database file
142
+ :timeout :: The busy timeout period given in milliseconds
136
143
 
137
144
  Without a database argument, assumes a memory database, so you can do:
138
145
 
@@ -141,21 +148,25 @@ Without a database argument, assumes a memory database, so you can do:
141
148
  Handles paths in the connection string similar to the SQLite adapter, so see
142
149
  the sqlite section below for details.
143
150
 
151
+ === cubrid
152
+
153
+ cubrid is a ruby extension for accessing a CUBRID database. Currently,
154
+ the ruby cubrid gem is in fairly rough state, with broken transaction
155
+ support and some other issues, but most things work.
156
+
144
157
  === db2
145
158
 
146
159
  Requires: db2/db2cli
147
160
 
148
- I'm not even sure exactly how this works, or if it works at all (I've never heard from
149
- anyone who attempted to use it). It uses the SQL_HANDLE_DBC constant to
150
- get a handle, and respects the :database, :user, and :password options. It doesn't
151
- appear to respect the :host or :port options.
161
+ This is the older DB2 adapter. It's recommended you try the ibmdb adapter
162
+ instead for new DB2 work, as it is better supported.
152
163
 
153
164
  === dbi
154
165
 
155
166
  Allows access to a multitude of databases via ruby-dbi. Additional options:
156
167
 
157
- * :db_type - Specifying 'mssql' allows Microsoft SQL Server specific syntax to
158
- be used. Otherwise has no effect.
168
+ :db_type :: Specifying 'mssql' allows Microsoft SQL Server specific syntax to
169
+ be used. Otherwise has no effect.
159
170
 
160
171
  DBI connection strings are a preprocessed a bit, and are specified with a dbi-
161
172
  in front of the protocol. Examples:
@@ -187,7 +198,7 @@ be faster than the other adapters.
187
198
  Similar to the JDBC adapter, the DO adapter only cares about connection strings,
188
199
  which can either be the String argument given to Sequel.connect directly or contained
189
200
  in a :uri or :url option. The DO adapter passes through the connection string
190
- directly to DataObjects, it does no processing of it.
201
+ directly to DataObjects, it does no processing of it (other than removing the do: prefix).
191
202
 
192
203
  Connection string examples:
193
204
 
@@ -201,6 +212,13 @@ Requires: fb (using code at http://github.com/wishdev/fb)
201
212
 
202
213
  Does not support the :port option.
203
214
 
215
+ === ibmdb
216
+
217
+ requires 'ibm_db'
218
+
219
+ This connects to DB2 using IBM_DB. This is the recommended adapter if you are
220
+ using a C-based ruby to connect to DB2.
221
+
204
222
  === informix
205
223
 
206
224
  Does not support the :host or :port options. Depending on the configuration of your server
@@ -220,9 +238,9 @@ Requires: java
220
238
 
221
239
  Houses Sequel's JDBC support when running on JRuby.
222
240
  Support for individual database types is done using sub adapters.
223
- There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
224
- Oracle, MSSQL, JTDS, and AS400. All except Oracle, MSSQL, and AS400 can load the
225
- jdbc-* gem, for those you need to have the .jar in your CLASSPATH
241
+ There are currently subadapters for PostgreSQL, MySQL, SQLite, H2, HSQLDB, Derby,
242
+ Oracle, MSSQL, JTDS, AS400, Progress, Firebird, Informix, and DB2. For PostgreSQL, MySQL, SQLite, H2, Derby,
243
+ and JTDS, this can use the jdbc-* gem, for the others you need to have the .jar in your CLASSPATH
226
244
  or load the Java class manually before calling Sequel.connect.
227
245
 
228
246
  You just use the JDBC connection string directly, which can be specified
@@ -246,37 +264,55 @@ Example connection strings:
246
264
  jdbc:postgresql://localhost/database?user=username
247
265
  jdbc:mysql://localhost/test?user=root&password=root
248
266
  jdbc:h2:mem:
267
+ jdbc:hsqldb:mem:mymemdb
268
+ jdbc:derby:memory:myDb;create=true
249
269
  jdbc:sqlserver://localhost;database=sequel_test;integratedSecurity=true
250
270
  jdbc:jtds:sqlserver://localhost/sequel_test;user=sequel_test;password=sequel_test
251
-
271
+ jdbc:oracle:thin:user/password@localhost:1521:database
272
+ jdbc:db2://localhost:3700/database:user=user;password=password;
273
+ jdbc:firebirdsql:localhost/3050:/path/to/database.fdb
274
+ jdbc:jdbcprogress:T:hostname:port:database
275
+ jdbc:cubrid:hostname:port:database:::
276
+
252
277
  You can also use JNDI connection strings:
253
278
 
254
279
  jdbc:jndi:java:comp/env/jndi_resource_name
255
280
 
256
281
  The following additional options are supported:
257
282
 
258
- * :convert_types - If set to false, does not attempt to convert some Java types to ruby types.
259
- Setting to false roughly doubles performance when selecting large numbers of rows.
260
- Note that you can't provide this option inside the connection string (as that is passed
261
- directly to JDBC), you have to pass it as a separate option.
283
+ :convert_types :: If set to false, does not attempt to convert some Java types to ruby types.
284
+ Setting to false roughly doubles performance when selecting large numbers of rows.
285
+ Note that you can't provide this option inside the connection string (as that is passed
286
+ directly to JDBC), you have to pass it as a separate option.
287
+ :login_timeout :: Set the login timeout on the JDBC connection (in seconds).
262
288
 
263
289
  === mysql
264
290
 
291
+ Requires: mysqlplus (or mysql if mysqlplus is not available)
292
+
265
293
  The MySQL adapter does not support the pure-ruby MySQL adapter that used to ship with
266
294
  ActiveRecord, it requires the native adapter.
267
295
 
268
296
  The following additional options are supported:
269
297
 
270
- * :auto_is_null - If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
271
- * :charset - Same as :encoding, :encoding takes precedence.
272
- * :compress - Whether to compress data sent/received via the socket connection.
273
- * :config_default_group - The default group to read from the in the MySQL config file.
274
- * :config_local_infile - If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
275
- * :encoding - Specify the encoding/character set to use for the connection.
276
- * :socket - Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
277
- * :timeout - Sets the wait_timeout for the connection, defaults to 1 month.
278
- * :read_timeout - Set the timeout in seconds for reading back results to a query.
279
- * :connect_timeout - Set the timeout in seconds before a connection attempt is abandoned.
298
+ :auto_is_null :: If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
299
+ :charset :: Same as :encoding, :encoding takes precedence.
300
+ :compress :: Whether to compress data sent/received via the socket connection.
301
+ :config_default_group :: The default group to read from the in the MySQL config file.
302
+ :config_local_infile :: If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
303
+ :encoding :: Specify the encoding/character set to use for the connection.
304
+ :socket :: Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
305
+ :sql_mode :: Set the sql_mode(s) for a given connection. Can be single symbol or string,
306
+ or an array of symbols or strings (e.g. <tt>:sql_mode=>[:no_zero_date, :pipes_as_concat]</tt>).
307
+ :timeout :: Sets the wait_timeout for the connection, defaults to 1 month.
308
+ :read_timeout :: Set the timeout in seconds for reading back results to a query.
309
+ :connect_timeout :: Set the timeout in seconds before a connection attempt is abandoned.
310
+
311
+ === mysql2
312
+
313
+ This is a newer MySQL adapter that does typecasting in C, so it is often faster than the
314
+ mysql adapter. Supports the same additional options as the mysql adapter, except for :compress, and uses
315
+ :timeout instead of :read_timeout and :connect_timeout.
280
316
 
281
317
  === odbc
282
318
 
@@ -287,8 +323,8 @@ The :database option given ODBC database should be the DSN (Descriptive Service
287
323
 
288
324
  The :host and :port options are not respected. The following additional options are supported:
289
325
 
290
- * :db_type - Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
291
- * :driver - The name of the ODBC driver to utilize.
326
+ :db_type :: Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
327
+ :driver :: The name of the ODBC driver to utilize.
292
328
 
293
329
  === openbase
294
330
 
@@ -300,7 +336,11 @@ Requires: oci8
300
336
 
301
337
  The following additional options are supported:
302
338
 
303
- * :privilege - The Oracle privilege level.
339
+ :autosequence :: Set to true to use Sequel's conventions to guess the sequence to use for datasets. False
340
+ by default.
341
+ :prefetch_rows :: The number of rows to prefetch. Defaults to 1, a larger number can be specified
342
+ and will improve performance when retrieving a large number of rows.
343
+ :privilege :: The Oracle privilege level.
304
344
 
305
345
  === postgres
306
346
 
@@ -308,14 +348,23 @@ Requires: pg (or postgres if pg is not available)
308
348
 
309
349
  The Sequel postgres adapter works with the pg, postgres, and postgres-pr ruby libraries.
310
350
  The pg library is the best supported, as it supports real bound variables and prepared statements.
351
+ If the pg library is being used, Sequel will also attempt to load the sequel_pg library, which is
352
+ a C extension that optimizes performance when Sequel is used with pg. All users of Sequel who
353
+ use pg are encouraged to install sequel_pg.
311
354
 
312
355
  The following additional options are supported:
313
356
 
314
- * :charset - Same as :encoding, :encoding takes precedence
315
- * :encoding - Set the client_encoding to the given string
357
+ :charset :: Same as :encoding, :encoding takes precedence
358
+ :encoding :: Set the client_encoding to the given string
359
+ :connect_timeout :: Set the number of seconds to wait for a connection (default 20, only respected
360
+ if using the pg library).
361
+ :sslmode :: Set to 'disable', 'allow', 'prefer', 'require' to choose how to treat SSL (only
362
+ respected if using the pg library)
316
363
 
317
364
  === sqlite
318
365
 
366
+ Requires: sqlite3
367
+
319
368
  As SQLite is a file-based database, the :host and :port options are ignored, and
320
369
  the :database option should be a path to the file.
321
370
 
@@ -337,7 +386,7 @@ Examples:
337
386
 
338
387
  The following additional options are supported:
339
388
 
340
- * :timeout - the busy timeout to use in milliseconds (default: 5000).
389
+ :timeout :: the busy timeout to use in milliseconds (default: 5000).
341
390
 
342
391
  === swift
343
392
 
@@ -345,6 +394,12 @@ swift is a ruby 1.9 only library, so you'll need to be running ruby 1.9. It
345
394
  can connect to SQLite, MySQL, and PostgreSQL, and you must specify which
346
395
  database using the db_type option.
347
396
 
397
+ You need to install one of the swift db adapters
398
+
399
+ * swift-db-sqlite3
400
+ * swift-db-mysql
401
+ * swift-db-postgres
402
+
348
403
  Examples:
349
404
 
350
405
  swift:///?database=:memory:&db_type=sqlite
@@ -353,16 +408,29 @@ Examples:
353
408
 
354
409
  === tinytds
355
410
 
411
+ Requires: tiny_tds
412
+
356
413
  Because the underscore is not a valid character in a URI schema, the adapter
357
414
  is named tinytds instead of tiny_tds. The connection options are passed directly
358
- to tiny_tds, except that the tiny_tds :dataserver and :username options are set to
359
- the Sequel :host and :user options. The :host option should be an entry in the
360
- freetds.conf file, it's not currently possible to a host not present in the
361
- freetds.conf file. Some options that you may want to set are
362
- :login_timeout, :timeout, :appname, and :encoding, see the tiny_tds README for details.
415
+ to tiny_tds, except that the tiny_tds :username option is set to
416
+ the Sequel :user option. If you want to use an entry in the freetds.conf file, you
417
+ should specify the :dataserver option with that name as the value. Some other
418
+ options that you may want to set are :login_timeout, :timeout, :tds_version, :azure,
419
+ :appname, and :encoding, see the tiny_tds README for details.
420
+
421
+ Other Sequel specific options:
422
+
423
+ :textsize :: Override the default TEXTSIZE setting for this connection. The FreeTDS
424
+ default is small (around 64000 bytes), but can be set up to around 2GB.
425
+ This should be specified as an integer. If you plan on setting large
426
+ text or blob values via tinytds, you should use this option or modify
427
+ your freetds.conf file.
428
+
363
429
  For highest performance, you should disable any identifier output method when
364
430
  using the tinytds adapter, which probably means disabling any identifier input method
365
431
  as well. The default for Microsoft SQL Server is to :downcase identifiers on output
366
432
  and :upcase them on input, so the highest performance will require changing the setting
367
433
  from the default.
368
434
 
435
+ The Sequel tinytds adapter requires tiny_tds >= 0.4.5, and if you are using FreeTDS
436
+ 0.91, you must at least be using 0.91rc2 (0.91rc1 does not work).
@@ -3,15 +3,22 @@
3
3
  Sequel has support for prepared statements and bound variables. No matter which
4
4
  database you are using, the Sequel prepared statement/bound variable API remains
5
5
  the same. There is native support for prepared statements/bound variables on
6
- the following databases:
6
+ the following adapters:
7
7
 
8
- * PostgreSQL (using the pg driver, requires type specifiers)
9
- * MySQL (prepared statements only, as the ruby mysql driver doesn't support
10
- bound variables)
11
- * SQLite
12
- * JDBC
8
+ * ibmdb (prepared statements only)
9
+ * jdbc
10
+ * mysql (prepared statements only)
11
+ * mysql2 (prepared statements only)
12
+ * oracle (requires type specifiers for nil/NULL values)
13
+ * postgres (when using the pg driver)
14
+ * sqlite
15
+ * tinytds
13
16
 
14
- Support on other databases is emulated via string interpolation.
17
+ Support on other adapters is emulated via string interpolation.
18
+
19
+ You can use the prepared_statements model plugin to automatically use prepared
20
+ statements for some common model actions such as saving or deleting a model
21
+ instance, or looking up a model based on a primary key.
15
22
 
16
23
  == Placeholders
17
24
 
@@ -22,7 +29,7 @@ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
22
29
  that and allows you to specify placeholders by using the :$name format for
23
30
  placeholders, e.g.:
24
31
 
25
- ds = DB[:items].filter(:name=>:$n)
32
+ ds = DB[:items].where(:name=>:$n)
26
33
 
27
34
  == Bound Variables
28
35
 
@@ -74,20 +81,19 @@ and update queries, the hash to insert/update is passed to +prepare+:
74
81
 
75
82
  If you are using the ruby-postgres or postgres-pr driver, PostgreSQL uses the
76
83
  default emulated support. If you are using ruby-pg, there is native support,
77
- but it requires type specifiers most of the time. This is easy if you have
78
- direct control over the SQL string, but since Sequel abstracts that, the types
79
- have to be specified another way. This is done by adding a __* suffix to the
80
- placeholder symbol (e.g. :$name__text, which will be compiled to "$1::text"
81
- in the SQL). Prepared statements are always server side.
84
+ but it may require type specifiers on some old versions (generally not anymore).
85
+ You can add a __* suffix to the placeholder symbol to specify a type, which
86
+ casts to that type in the SQL (e.g. :$name__text, which will be compiled to
87
+ "$1::text" in the SQL). Prepared statements are always server side.
82
88
 
83
89
  === SQLite
84
90
 
85
91
  SQLite supports both prepared statements and bound variables. Prepared
86
92
  statements are cached per connection.
87
93
 
88
- === MySQL
94
+ === MySQL/Mysql2
89
95
 
90
- The MySQL ruby driver does not support bound variables, so the the bound
96
+ The MySQL/Mysql2 ruby drivers do not support bound variables, so the bound
91
97
  variable methods fall back to string interpolation. It uses server side
92
98
  prepared statements.
93
99
 
@@ -99,6 +105,26 @@ over JDBC, you can add the prepareThreshold=N parameter to the connection
99
105
  string, which will use a server side prepared statement after N calls to
100
106
  the prepared statement.
101
107
 
108
+ === TinyTDS
109
+
110
+ Uses the sp_executesql stored procedure with bound variables, since
111
+ Microsoft SQL Server doesn't support true prepared statements.
112
+
113
+ === IBM_DB
114
+
115
+ DB2 supports both prepared statements and bound variables. Prepared
116
+ statement objects are cached per connection.
117
+
118
+ === Oracle
119
+
120
+ Oracle supports both prepared statements and bound variables. Prepared
121
+ statements (OCI8::Cursor objects) are cached per connection. If you
122
+ ever plan to use a nil/NULL value as a bound variable/prepared statement
123
+ value, you must specify the type in the placeholder using a __* suffix.
124
+ You can use any of the schema types that Sequel supports, such as
125
+ :$name__string or :$num__integer. Using blobs as bound variables is
126
+ not currently supported.
127
+
102
128
  === All Others
103
129
 
104
130
  Support is emulated using interpolation.