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
@@ -1,86 +1,98 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
- require "timeout"
3
2
 
4
3
  unless defined?(ORACLE_DB)
5
4
  ORACLE_DB = Sequel.connect('oracle://hr:hr@localhost/XE')
6
5
  end
7
6
  INTEGRATION_DB = ORACLE_DB unless defined?(INTEGRATION_DB)
8
7
 
9
- if ORACLE_DB.table_exists?(:items)
10
- ORACLE_DB.drop_table :items
11
- end
12
- ORACLE_DB.create_table :items do
13
- varchar2 :name, :size => 50
14
- number :value, :size => 38
15
- date :date_created
16
- index :value
17
- end
8
+ describe "An Oracle database" do
9
+ before(:all) do
10
+ ORACLE_DB.create_table!(:items) do
11
+ String :name, :size => 50
12
+ Integer :value
13
+ Date :date_created
14
+ index :value
15
+ end
18
16
 
19
- if ORACLE_DB.table_exists?(:books)
20
- ORACLE_DB.drop_table :books
21
- end
22
- ORACLE_DB.create_table :books do
23
- number :id, :size => 38
24
- varchar2 :title, :size => 50
25
- number :category_id, :size => 38
26
- end
17
+ ORACLE_DB.create_table!(:books) do
18
+ Integer :id
19
+ String :title, :size => 50
20
+ Integer :category_id
21
+ end
27
22
 
28
- if ORACLE_DB.table_exists?(:categories)
29
- ORACLE_DB.drop_table :categories
30
- end
31
- ORACLE_DB.create_table :categories do
32
- number :id, :size => 38
33
- varchar2 :cat_name, :size => 50
34
- end
23
+ ORACLE_DB.create_table!(:categories) do
24
+ Integer :id
25
+ String :cat_name, :size => 50
26
+ end
27
+ @d = ORACLE_DB[:items]
28
+ end
29
+ after do
30
+ @d.delete
31
+ end
32
+ after(:all) do
33
+ ORACLE_DB.drop_table?(:items, :books, :categories)
34
+ end
35
35
 
36
- describe "An Oracle database" do
37
36
  specify "should provide disconnect functionality" do
38
37
  ORACLE_DB.execute("select user from dual")
39
38
  ORACLE_DB.pool.size.should == 1
40
39
  ORACLE_DB.disconnect
41
40
  ORACLE_DB.pool.size.should == 0
42
41
  end
42
+
43
+ specify "should have working view_exists?" do
44
+ begin
45
+ ORACLE_DB.view_exists?(:cats).should be_false
46
+ ORACLE_DB.create_view(:cats, ORACLE_DB[:categories])
47
+ ORACLE_DB.view_exists?(:cats).should be_true
48
+ om = ORACLE_DB.identifier_output_method
49
+ im = ORACLE_DB.identifier_input_method
50
+ ORACLE_DB.identifier_output_method = :reverse
51
+ ORACLE_DB.identifier_input_method = :reverse
52
+ ORACLE_DB.view_exists?(:STAC).should be_true
53
+ ORACLE_DB.view_exists?(:cats).should be_false
54
+ ensure
55
+ ORACLE_DB.identifier_output_method = om
56
+ ORACLE_DB.identifier_input_method = im
57
+ ORACLE_DB.drop_view(:cats)
58
+ end
59
+ end
60
+
61
+ specify "should be able to get current sequence value with SQL" do
62
+ begin
63
+ ORACLE_DB.create_table!(:foo){primary_key :id}
64
+ ORACLE_DB.fetch('SELECT seq_foo_id.nextval FROM DUAL').single_value.should == 1
65
+ ensure
66
+ ORACLE_DB.drop_table(:foo)
67
+ end
68
+ end
43
69
 
44
70
  specify "should provide schema information" do
45
- books_schema = [
46
- [:id, {:char_size=>0, :type=>:number, :allow_null=>true, :type_string=>"NUMBER(38)", :data_size=>22, :precision=>38, :char_used=>false, :scale=>0, :charset_form=>nil, :fsprecision=>38, :lfprecision=>0, :db_type=>"NUMBER(38)"}],
47
- [:title, {:char_size=>50, :type=>:varchar2, :allow_null=>true, :type_string=>"VARCHAR2(50)", :data_size=>50, :precision=>0, :char_used=>false, :scale=>0, :charset_form=>:implicit, :fsprecision=>0, :lfprecision=>0, :db_type=>"VARCHAR2(50)"}],
48
- [:category_id, {:char_size=>0, :type=>:number, :allow_null=>true, :type_string=>"NUMBER(38)", :data_size=>22, :precision=>38, :char_used=>false, :scale=>0, :charset_form=>nil, :fsprecision=>38, :lfprecision=>0, :db_type=>"NUMBER(38)"}]]
49
- categories_schema = [
50
- [:id, {:char_size=>0, :type=>:number, :allow_null=>true, :type_string=>"NUMBER(38)", :data_size=>22, :precision=>38, :char_used=>false, :scale=>0, :charset_form=>nil, :fsprecision=>38, :lfprecision=>0, :db_type=>"NUMBER(38)"}],
51
- [:cat_name, {:char_size=>50, :type=>:varchar2, :allow_null=>true, :type_string=>"VARCHAR2(50)", :data_size=>50, :precision=>0, :char_used=>false, :scale=>0, :charset_form=>:implicit, :fsprecision=>0, :lfprecision=>0, :db_type=>"VARCHAR2(50)"}]]
52
- items_schema = [
53
- [:name, {:char_size=>50, :type=>:varchar2, :allow_null=>true, :type_string=>"VARCHAR2(50)", :data_size=>50, :precision=>0, :char_used=>false, :scale=>0, :charset_form=>:implicit, :fsprecision=>0, :lfprecision=>0, :db_type=>"VARCHAR2(50)"}],
54
- [:value, {:char_size=>0, :type=>:number, :allow_null=>true, :type_string=>"NUMBER(38)", :data_size=>22, :precision=>38, :char_used=>false, :scale=>0, :charset_form=>nil, :fsprecision=>38, :lfprecision=>0, :db_type=>"NUMBER(38)"}],
55
- [:date_created, {:charset_form=>nil, :type=>:date, :type_string=>"DATE", :fsprecision=>0, :data_size=>7, :lfprecision=>0, :precision=>0, :db_type=>"DATE", :char_used=>false, :char_size=>0, :scale=>0, :allow_null=>true}]]
71
+ books_schema = [[:id, [:integer, false, true, nil]],
72
+ [:title, [:string, false, true, nil]],
73
+ [:category_id, [:integer, false, true, nil]]]
74
+ categories_schema = [[:id, [:integer, false, true, nil]],
75
+ [:cat_name, [:string, false, true, nil]]]
76
+ items_schema = [[:name, [:string, false, true, nil]],
77
+ [:value, [:integer, false, true, nil]],
78
+ [:date_created, [:datetime, false, true, nil]]]
56
79
 
57
80
  {:books => books_schema, :categories => categories_schema, :items => items_schema}.each_pair do |table, expected_schema|
58
81
  schema = ORACLE_DB.schema(table)
59
82
  schema.should_not be_nil
60
- expected_schema.should == schema
83
+ schema.map{|c, s| [c, s.values_at(:type, :primary_key, :allow_null, :ruby_default)]}.should == expected_schema
61
84
  end
62
85
  end
63
86
 
64
87
  specify "should create a temporary table" do
65
- ORACLE_DB.create_table :test_tmp, :temporary => true do
88
+ ORACLE_DB.create_table! :test_tmp, :temp => true do
89
+ varchar2 :name, :size => 50
66
90
  primary_key :id, :integer, :null => false
67
- column :name, :text
68
91
  index :name, :unique => true
69
92
  end
70
-
71
- ORACLE_DB.sqls.should == [
72
- 'CREATE GLOBAL TEMPORARY TABLE test_tmp (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
73
- 'CREATE UNIQUE INDEX test_tmp_name_index ON test_tmp (name)'
74
- ]
93
+ ORACLE_DB.drop_table?(:test_tmp)
75
94
  end
76
- end
77
95
 
78
- describe "An Oracle dataset" do
79
- before do
80
- @d = ORACLE_DB[:items]
81
- @d.delete # remove all records
82
- end
83
-
84
96
  specify "should return the correct record count" do
85
97
  @d.count.should == 0
86
98
  @d << {:name => 'abc', :value => 123}
@@ -106,7 +118,7 @@ describe "An Oracle dataset" do
106
118
  {:name => 'def'}
107
119
  ]
108
120
 
109
- @d.order(:value.desc).limit(1).to_a.should == [
121
+ @d.order(Sequel.desc(:value)).limit(1).to_a.should == [
110
122
  {:date_created=>nil, :name => 'def', :value => 789}
111
123
  ]
112
124
 
@@ -115,7 +127,7 @@ describe "An Oracle dataset" do
115
127
  {:date_created=>nil, :name => 'abc', :value => 456}
116
128
  ]
117
129
 
118
- @d.order(:value.desc).filter(:name => 'abc').to_a.should == [
130
+ @d.order(Sequel.desc(:value)).filter(:name => 'abc').to_a.should == [
119
131
  {:date_created=>nil, :name => 'abc', :value => 456},
120
132
  {:date_created=>nil, :name => 'abc', :value => 123}
121
133
  ]
@@ -124,7 +136,7 @@ describe "An Oracle dataset" do
124
136
  {:date_created=>nil, :name => 'abc', :value => 123}
125
137
  ]
126
138
 
127
- @d.filter(:name => 'abc').order(:value.desc).limit(1).to_a.should == [
139
+ @d.filter(:name => 'abc').order(Sequel.desc(:value)).limit(1).to_a.should == [
128
140
  {:date_created=>nil, :name => 'abc', :value => 456}
129
141
  ]
130
142
 
@@ -148,27 +160,27 @@ describe "An Oracle dataset" do
148
160
 
149
161
  @d.max(:value).to_i.should == 789
150
162
 
151
- @d.select(:name, :AVG.sql_function(:value)).filter(:name => 'abc').group(:name).to_a.should == [
152
- {:name => 'abc', :"avg(value)" => (456+123)/2.0}
163
+ @d.select(:name, Sequel.function(:AVG, :value).as(:avg)).filter(:name => 'abc').group(:name).to_a.should == [
164
+ {:name => 'abc', :avg => (456+123)/2.0}
153
165
  ]
154
166
 
155
- @d.select(:AVG.sql_function(:value)).group(:name).order(:name).limit(1).to_a.should == [
156
- {:"avg(value)" => (456+123)/2.0}
167
+ @d.select(Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).limit(1).to_a.should == [
168
+ {:avg => (456+123)/2.0}
157
169
  ]
158
170
 
159
- @d.select(:name, :AVG.sql_function(:value)).group(:name).order(:name).to_a.should == [
160
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
161
- {:name => 'def', :"avg(value)" => 789*1.0}
171
+ @d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).to_a.should == [
172
+ {:name => 'abc', :avg => (456+123)/2.0},
173
+ {:name => 'def', :avg => 789*1.0}
162
174
  ]
163
175
 
164
- @d.select(:name, :AVG.sql_function(:value)).group(:name).order(:name).to_a.should == [
165
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
166
- {:name => 'def', :"avg(value)" => 789*1.0}
176
+ @d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).order(:name).to_a.should == [
177
+ {:name => 'abc', :avg => (456+123)/2.0},
178
+ {:name => 'def', :avg => 789*1.0}
167
179
  ]
168
180
 
169
- @d.select(:name, :AVG.sql_function(:value)).group(:name).having(:name => ['abc', 'def']).order(:name).to_a.should == [
170
- {:name => 'abc', :"avg(value)" => (456+123)/2.0},
171
- {:name => 'def', :"avg(value)" => 789*1.0}
181
+ @d.select(:name, Sequel.function(:AVG, :value).as(:avg)).group(:name).having(:name => ['abc', 'def']).order(:name).to_a.should == [
182
+ {:name => 'abc', :avg => (456+123)/2.0},
183
+ {:name => 'def', :avg => 789*1.0}
172
184
  ]
173
185
 
174
186
  @d.select(:name, :value).filter(:name => 'abc').union(@d.select(:name, :value).filter(:name => 'def')).order(:value).to_a.should == [
@@ -185,8 +197,6 @@ describe "An Oracle dataset" do
185
197
  @d << {:name => 'def', :value => 789}
186
198
  @d.filter(:name => 'abc').update(:value => 530)
187
199
 
188
- # the third record should stay the same
189
- # floating-point precision bullshit
190
200
  @d[:name => 'def'][:value].should == 789
191
201
  @d.filter(:value => 530).count.should == 2
192
202
  end
@@ -194,9 +204,9 @@ describe "An Oracle dataset" do
194
204
  specify "should translate values correctly" do
195
205
  @d << {:name => 'abc', :value => 456}
196
206
  @d << {:name => 'def', :value => 789}
197
- @d.filter(:value > 500).update(:date_created => "to_timestamp('2009-09-09', 'YYYY-MM-DD')".lit)
207
+ @d.filter('value > 500').update(:date_created => Sequel.lit("to_timestamp('2009-09-09', 'YYYY-MM-DD')"))
198
208
 
199
- @d[:name => 'def'][:date_created].should == Time.parse('2009-09-09')
209
+ @d[:name => 'def'][:date_created].strftime('%F').should == '2009-09-09'
200
210
  end
201
211
 
202
212
  specify "should delete records correctly" do
@@ -221,24 +231,20 @@ describe "An Oracle dataset" do
221
231
 
222
232
  @d.count.should == 1
223
233
  end
224
- end
225
234
 
226
- describe "Joined Oracle dataset" do
227
- before do
235
+ specify "should return correct result" do
228
236
  @d1 = ORACLE_DB[:books]
229
- @d1.delete # remove all records
237
+ @d1.delete
230
238
  @d1 << {:id => 1, :title => 'aaa', :category_id => 100}
231
239
  @d1 << {:id => 2, :title => 'bbb', :category_id => 100}
232
240
  @d1 << {:id => 3, :title => 'ccc', :category_id => 101}
233
241
  @d1 << {:id => 4, :title => 'ddd', :category_id => 102}
234
242
 
235
243
  @d2 = ORACLE_DB[:categories]
236
- @d2.delete # remove all records
244
+ @d2.delete
237
245
  @d2 << {:id => 100, :cat_name => 'ruby'}
238
246
  @d2 << {:id => 101, :cat_name => 'rails'}
239
- end
240
247
 
241
- specify "should return correct result" do
242
248
  @d1.join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id).to_a.should == [
243
249
  {:id => 1, :title => 'aaa', :cat_name => 'ruby'},
244
250
  {:id => 2, :title => 'bbb', :cat_name => 'ruby'},
@@ -257,24 +263,20 @@ describe "Joined Oracle dataset" do
257
263
  {:id => 4, :title => 'ddd', :cat_name => nil}
258
264
  ]
259
265
 
260
- @d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).order(:books__id.desc).limit(2, 0).to_a.should == [
266
+ @d1.left_outer_join(:categories, :id => :category_id).select(:books__id, :title, :cat_name).reverse_order(:books__id).limit(2, 0).to_a.should == [
261
267
  {:id => 4, :title => 'ddd', :cat_name => nil},
262
268
  {:id => 3, :title => 'ccc', :cat_name => 'rails'}
263
269
  ]
264
270
  end
265
- end
266
271
 
267
- describe "Oracle aliasing" do
268
- before do
272
+ specify "should allow columns to be renamed" do
269
273
  @d1 = ORACLE_DB[:books]
270
- @d1.delete # remove all records
274
+ @d1.delete
271
275
  @d1 << {:id => 1, :title => 'aaa', :category_id => 100}
272
276
  @d1 << {:id => 2, :title => 'bbb', :category_id => 100}
273
277
  @d1 << {:id => 3, :title => 'bbb', :category_id => 100}
274
- end
275
278
 
276
- specify "should allow columns to be renamed" do
277
- @d1.select(:title.as(:name)).order_by(:id).to_a.should == [
279
+ @d1.select(Sequel.as(:title, :name)).order_by(:id).to_a.should == [
278
280
  { :name => 'aaa' },
279
281
  { :name => 'bbb' },
280
282
  { :name => 'bbb' },
@@ -282,41 +284,14 @@ describe "Oracle aliasing" do
282
284
  end
283
285
 
284
286
  specify "nested queries should work" do
285
- @d1.select(:title).group_by(:title).count.should == 2
286
- end
287
- end
288
-
289
- describe "Row locks in Oracle" do
290
- before do
291
- @d1 = ORACLE_DB[:books]
292
- @d1.delete # remove all records
293
- @d1 << {:id => 1, :title => 'aaa'}
287
+ ORACLE_DB[:books].select(:title).group_by(:title).count.should == 2
294
288
  end
295
289
 
296
290
  specify "#for_update should use FOR UPDATE" do
297
- @d1.for_update.sql.should == "SELECT * FROM BOOKS FOR UPDATE"
291
+ ORACLE_DB[:books].for_update.sql.should == 'SELECT * FROM "BOOKS" FOR UPDATE'
298
292
  end
299
293
 
300
294
  specify "#lock_style should accept symbols" do
301
- @d1.lock_style(:update).sql.should == "SELECT * FROM BOOKS FOR UPDATE"
302
- end
303
-
304
- specify "should not update during row lock" do
305
- ORACLE_DB.transaction do
306
- @d1.filter(:id => 1).for_update.to_a
307
- proc do
308
- t1 = Thread.start do
309
- # wait for unlock
310
- Timeout::timeout(0.02) do
311
- ORACLE_DB[:books].filter(:id => 1).update(:title => "bbb")
312
- end
313
- end
314
- t1.join
315
- end.should raise_error
316
- @d1.filter(:id => 1).first[:title].should == "aaa"
317
- end
318
- t2 = Thread.start { ORACLE_DB[:books].filter(:id => 1).update(:title => "bbb") }
319
- t2.join
320
- @d1.filter(:id => 1).first[:title].should == "bbb"
295
+ ORACLE_DB[:books].lock_style(:update).sql.should == 'SELECT * FROM "BOOKS" FOR UPDATE'
321
296
  end
322
297
  end