sequel 3.21.0 → 3.36.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 (311) hide show
  1. data/CHANGELOG +855 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +23 -7
  4. data/Rakefile +42 -24
  5. data/bin/sequel +26 -8
  6. data/doc/active_record.rdoc +1 -0
  7. data/doc/advanced_associations.rdoc +171 -11
  8. data/doc/association_basics.rdoc +293 -43
  9. data/doc/dataset_basics.rdoc +5 -5
  10. data/doc/dataset_filtering.rdoc +8 -0
  11. data/doc/mass_assignment.rdoc +56 -0
  12. data/doc/migration.rdoc +85 -552
  13. data/doc/model_hooks.rdoc +78 -27
  14. data/doc/object_model.rdoc +541 -0
  15. data/doc/opening_databases.rdoc +97 -50
  16. data/doc/prepared_statements.rdoc +40 -14
  17. data/doc/querying.rdoc +28 -4
  18. data/doc/reflection.rdoc +30 -4
  19. data/doc/release_notes/3.22.0.txt +39 -0
  20. data/doc/release_notes/3.23.0.txt +172 -0
  21. data/doc/release_notes/3.24.0.txt +420 -0
  22. data/doc/release_notes/3.25.0.txt +88 -0
  23. data/doc/release_notes/3.26.0.txt +88 -0
  24. data/doc/release_notes/3.27.0.txt +82 -0
  25. data/doc/release_notes/3.28.0.txt +304 -0
  26. data/doc/release_notes/3.29.0.txt +459 -0
  27. data/doc/release_notes/3.30.0.txt +135 -0
  28. data/doc/release_notes/3.31.0.txt +146 -0
  29. data/doc/release_notes/3.32.0.txt +202 -0
  30. data/doc/release_notes/3.33.0.txt +157 -0
  31. data/doc/release_notes/3.34.0.txt +671 -0
  32. data/doc/release_notes/3.35.0.txt +144 -0
  33. data/doc/release_notes/3.36.0.txt +245 -0
  34. data/doc/schema_modification.rdoc +572 -0
  35. data/doc/sharding.rdoc +95 -3
  36. data/doc/testing.rdoc +129 -0
  37. data/doc/thread_safety.rdoc +17 -0
  38. data/doc/transactions.rdoc +137 -0
  39. data/doc/virtual_rows.rdoc +51 -2
  40. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  41. data/lib/sequel/adapters/ado.rb +40 -18
  42. data/lib/sequel/adapters/amalgalite.rb +17 -9
  43. data/lib/sequel/adapters/db2.rb +175 -86
  44. data/lib/sequel/adapters/dbi.rb +15 -15
  45. data/lib/sequel/adapters/do/mysql.rb +17 -11
  46. data/lib/sequel/adapters/do/postgres.rb +1 -57
  47. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  48. data/lib/sequel/adapters/do.rb +18 -36
  49. data/lib/sequel/adapters/firebird.rb +27 -208
  50. data/lib/sequel/adapters/ibmdb.rb +453 -0
  51. data/lib/sequel/adapters/informix.rb +6 -23
  52. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  53. data/lib/sequel/adapters/jdbc/db2.rb +47 -0
  54. data/lib/sequel/adapters/jdbc/derby.rb +287 -0
  55. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  56. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  57. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  58. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  59. data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  61. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  62. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
  64. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  65. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  66. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  67. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  68. data/lib/sequel/adapters/jdbc.rb +265 -94
  69. data/lib/sequel/adapters/mock.rb +361 -0
  70. data/lib/sequel/adapters/mysql.rb +118 -222
  71. data/lib/sequel/adapters/mysql2.rb +58 -57
  72. data/lib/sequel/adapters/odbc/mssql.rb +15 -7
  73. data/lib/sequel/adapters/odbc.rb +28 -9
  74. data/lib/sequel/adapters/openbase.rb +3 -5
  75. data/lib/sequel/adapters/oracle.rb +349 -53
  76. data/lib/sequel/adapters/postgres.rb +356 -107
  77. data/lib/sequel/adapters/shared/access.rb +32 -9
  78. data/lib/sequel/adapters/shared/db2.rb +342 -0
  79. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  80. data/lib/sequel/adapters/shared/informix.rb +53 -0
  81. data/lib/sequel/adapters/shared/mssql.rb +335 -118
  82. data/lib/sequel/adapters/shared/mysql.rb +340 -76
  83. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  84. data/lib/sequel/adapters/shared/oracle.rb +243 -45
  85. data/lib/sequel/adapters/shared/postgres.rb +524 -279
  86. data/lib/sequel/adapters/shared/progress.rb +5 -8
  87. data/lib/sequel/adapters/shared/sqlite.rb +265 -89
  88. data/lib/sequel/adapters/sqlite.rb +101 -39
  89. data/lib/sequel/adapters/swift/mysql.rb +9 -12
  90. data/lib/sequel/adapters/swift/postgres.rb +9 -74
  91. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  92. data/lib/sequel/adapters/swift.rb +8 -7
  93. data/lib/sequel/adapters/tinytds.rb +161 -21
  94. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  95. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  96. data/lib/sequel/ast_transformer.rb +194 -0
  97. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  98. data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
  99. data/lib/sequel/connection_pool/single.rb +5 -0
  100. data/lib/sequel/connection_pool/threaded.rb +38 -14
  101. data/lib/sequel/connection_pool.rb +10 -2
  102. data/lib/sequel/core.rb +118 -11
  103. data/lib/sequel/database/connecting.rb +38 -28
  104. data/lib/sequel/database/dataset.rb +4 -4
  105. data/lib/sequel/database/dataset_defaults.rb +63 -2
  106. data/lib/sequel/database/logging.rb +7 -2
  107. data/lib/sequel/database/misc.rb +150 -46
  108. data/lib/sequel/database/query.rb +215 -65
  109. data/lib/sequel/database/schema_generator.rb +64 -20
  110. data/lib/sequel/database/schema_methods.rb +212 -54
  111. data/lib/sequel/dataset/actions.rb +322 -85
  112. data/lib/sequel/dataset/features.rb +96 -8
  113. data/lib/sequel/dataset/graph.rb +38 -11
  114. data/lib/sequel/dataset/misc.rb +50 -23
  115. data/lib/sequel/dataset/mutation.rb +12 -7
  116. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  117. data/lib/sequel/dataset/query.rb +237 -44
  118. data/lib/sequel/dataset/sql.rb +698 -278
  119. data/lib/sequel/dataset.rb +8 -0
  120. data/lib/sequel/exceptions.rb +4 -0
  121. data/lib/sequel/extensions/_pretty_table.rb +79 -0
  122. data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
  123. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  124. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
  125. data/lib/sequel/extensions/migration.rb +97 -11
  126. data/lib/sequel/extensions/named_timezones.rb +5 -0
  127. data/lib/sequel/extensions/null_dataset.rb +90 -0
  128. data/lib/sequel/extensions/pg_array.rb +460 -0
  129. data/lib/sequel/extensions/pg_array_ops.rb +220 -0
  130. data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
  131. data/lib/sequel/extensions/pg_hstore.rb +296 -0
  132. data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
  133. data/lib/sequel/extensions/pg_inet.rb +89 -0
  134. data/lib/sequel/extensions/pg_json.rb +178 -0
  135. data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
  136. data/lib/sequel/extensions/pretty_table.rb +5 -71
  137. data/lib/sequel/extensions/query.rb +1 -1
  138. data/lib/sequel/extensions/query_literals.rb +79 -0
  139. data/lib/sequel/extensions/schema_caching.rb +76 -0
  140. data/lib/sequel/extensions/schema_dumper.rb +251 -37
  141. data/lib/sequel/extensions/select_remove.rb +35 -0
  142. data/lib/sequel/extensions/server_block.rb +139 -0
  143. data/lib/sequel/extensions/sql_expr.rb +4 -110
  144. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  145. data/lib/sequel/extensions/to_dot.rb +95 -83
  146. data/lib/sequel/model/associations.rb +1187 -393
  147. data/lib/sequel/model/base.rb +578 -170
  148. data/lib/sequel/model/errors.rb +1 -1
  149. data/lib/sequel/model/exceptions.rb +5 -1
  150. data/lib/sequel/model/inflections.rb +1 -1
  151. data/lib/sequel/model.rb +30 -11
  152. data/lib/sequel/no_core_ext.rb +2 -0
  153. data/lib/sequel/plugins/active_model.rb +13 -1
  154. data/lib/sequel/plugins/association_pks.rb +22 -4
  155. data/lib/sequel/plugins/caching.rb +25 -18
  156. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  157. data/lib/sequel/plugins/composition.rb +44 -12
  158. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  159. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  160. data/lib/sequel/plugins/dirty.rb +214 -0
  161. data/lib/sequel/plugins/eager_each.rb +59 -0
  162. data/lib/sequel/plugins/force_encoding.rb +6 -6
  163. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  164. data/lib/sequel/plugins/identity_map.rb +123 -8
  165. data/lib/sequel/plugins/instance_filters.rb +10 -0
  166. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  167. data/lib/sequel/plugins/json_serializer.rb +58 -6
  168. data/lib/sequel/plugins/list.rb +12 -2
  169. data/lib/sequel/plugins/many_through_many.rb +79 -28
  170. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  171. data/lib/sequel/plugins/nested_attributes.rb +139 -63
  172. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  173. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  174. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  175. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  176. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  177. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  178. data/lib/sequel/plugins/schema.rb +7 -2
  179. data/lib/sequel/plugins/serialization.rb +98 -49
  180. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  181. data/lib/sequel/plugins/sharding.rb +21 -54
  182. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  183. data/lib/sequel/plugins/static_cache.rb +99 -0
  184. data/lib/sequel/plugins/subclasses.rb +10 -2
  185. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  186. data/lib/sequel/plugins/timestamps.rb +1 -1
  187. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  188. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  189. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  190. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  191. data/lib/sequel/sql.rb +526 -59
  192. data/lib/sequel/timezones.rb +57 -38
  193. data/lib/sequel/version.rb +1 -1
  194. data/spec/adapters/db2_spec.rb +146 -0
  195. data/spec/adapters/firebird_spec.rb +1 -1
  196. data/spec/adapters/mssql_spec.rb +142 -40
  197. data/spec/adapters/mysql_spec.rb +380 -234
  198. data/spec/adapters/oracle_spec.rb +67 -77
  199. data/spec/adapters/postgres_spec.rb +1050 -212
  200. data/spec/adapters/spec_helper.rb +8 -5
  201. data/spec/adapters/sqlite_spec.rb +139 -27
  202. data/spec/core/connection_pool_spec.rb +196 -93
  203. data/spec/core/database_spec.rb +879 -510
  204. data/spec/core/dataset_spec.rb +1415 -1086
  205. data/spec/core/expression_filters_spec.rb +554 -109
  206. data/spec/core/mock_adapter_spec.rb +449 -0
  207. data/spec/core/object_graph_spec.rb +86 -114
  208. data/spec/core/schema_generator_spec.rb +4 -4
  209. data/spec/core/schema_spec.rb +482 -38
  210. data/spec/core/spec_helper.rb +6 -48
  211. data/spec/extensions/active_model_spec.rb +13 -0
  212. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  213. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  214. data/spec/extensions/association_dependencies_spec.rb +15 -25
  215. data/spec/extensions/association_pks_spec.rb +66 -32
  216. data/spec/extensions/association_proxies_spec.rb +4 -4
  217. data/spec/extensions/caching_spec.rb +47 -51
  218. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  219. data/spec/extensions/columns_introspection_spec.rb +91 -0
  220. data/spec/extensions/composition_spec.rb +18 -13
  221. data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
  222. data/spec/extensions/dataset_associations_spec.rb +199 -0
  223. data/spec/extensions/defaults_setter_spec.rb +64 -0
  224. data/spec/extensions/dirty_spec.rb +155 -0
  225. data/spec/extensions/eager_each_spec.rb +34 -0
  226. data/spec/extensions/force_encoding_spec.rb +4 -2
  227. data/spec/extensions/hook_class_methods_spec.rb +69 -92
  228. data/spec/extensions/identity_map_spec.rb +131 -22
  229. data/spec/extensions/inflector_spec.rb +0 -4
  230. data/spec/extensions/instance_filters_spec.rb +11 -21
  231. data/spec/extensions/instance_hooks_spec.rb +72 -0
  232. data/spec/extensions/json_serializer_spec.rb +49 -6
  233. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  234. data/spec/extensions/list_spec.rb +48 -39
  235. data/spec/extensions/many_through_many_spec.rb +283 -250
  236. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  237. data/spec/extensions/migration_spec.rb +140 -35
  238. data/spec/extensions/named_timezones_spec.rb +29 -11
  239. data/spec/extensions/nested_attributes_spec.rb +251 -89
  240. data/spec/extensions/null_dataset_spec.rb +85 -0
  241. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  242. data/spec/extensions/pg_array_ops_spec.rb +105 -0
  243. data/spec/extensions/pg_array_spec.rb +196 -0
  244. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  245. data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
  246. data/spec/extensions/pg_hstore_spec.rb +195 -0
  247. data/spec/extensions/pg_inet_spec.rb +44 -0
  248. data/spec/extensions/pg_json_spec.rb +101 -0
  249. data/spec/extensions/pg_statement_cache_spec.rb +209 -0
  250. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  251. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  252. data/spec/extensions/prepared_statements_spec.rb +87 -0
  253. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  254. data/spec/extensions/pretty_table_spec.rb +7 -6
  255. data/spec/extensions/query_literals_spec.rb +168 -0
  256. data/spec/extensions/query_spec.rb +6 -0
  257. data/spec/extensions/rcte_tree_spec.rb +50 -43
  258. data/spec/extensions/schema_caching_spec.rb +41 -0
  259. data/spec/extensions/schema_dumper_spec.rb +429 -22
  260. data/spec/extensions/schema_spec.rb +25 -21
  261. data/spec/extensions/select_remove_spec.rb +38 -0
  262. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  263. data/spec/extensions/serialization_spec.rb +85 -43
  264. data/spec/extensions/server_block_spec.rb +90 -0
  265. data/spec/extensions/sharding_spec.rb +69 -143
  266. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  267. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  268. data/spec/extensions/spec_helper.rb +22 -61
  269. data/spec/extensions/sql_expr_spec.rb +29 -60
  270. data/spec/extensions/static_cache_spec.rb +145 -0
  271. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  272. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  273. data/spec/extensions/timestamps_spec.rb +6 -6
  274. data/spec/extensions/to_dot_spec.rb +4 -7
  275. data/spec/extensions/touch_spec.rb +13 -14
  276. data/spec/extensions/tree_spec.rb +11 -26
  277. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  278. data/spec/extensions/update_primary_key_spec.rb +30 -24
  279. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  280. data/spec/extensions/validation_helpers_spec.rb +16 -35
  281. data/spec/extensions/xml_serializer_spec.rb +29 -4
  282. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  283. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  284. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  285. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  286. data/spec/integration/associations_test.rb +659 -21
  287. data/spec/integration/database_test.rb +9 -3
  288. data/spec/integration/dataset_test.rb +605 -91
  289. data/spec/integration/eager_loader_test.rb +19 -21
  290. data/spec/integration/migrator_test.rb +2 -3
  291. data/spec/integration/model_test.rb +81 -2
  292. data/spec/integration/plugin_test.rb +454 -143
  293. data/spec/integration/prepared_statement_test.rb +263 -128
  294. data/spec/integration/schema_test.rb +309 -43
  295. data/spec/integration/spec_helper.rb +40 -30
  296. data/spec/integration/timezone_test.rb +38 -12
  297. data/spec/integration/transaction_test.rb +183 -8
  298. data/spec/integration/type_test.rb +18 -4
  299. data/spec/model/association_reflection_spec.rb +201 -7
  300. data/spec/model/associations_spec.rb +1067 -661
  301. data/spec/model/base_spec.rb +329 -95
  302. data/spec/model/dataset_methods_spec.rb +7 -27
  303. data/spec/model/eager_loading_spec.rb +677 -676
  304. data/spec/model/hooks_spec.rb +349 -67
  305. data/spec/model/model_spec.rb +240 -168
  306. data/spec/model/plugins_spec.rb +24 -13
  307. data/spec/model/record_spec.rb +490 -232
  308. data/spec/model/spec_helper.rb +14 -71
  309. data/spec/model/validations_spec.rb +11 -0
  310. data/spec/rcov.opts +2 -0
  311. metadata +178 -80
@@ -1,35 +1,59 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
- if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
4
3
  describe "Database schema parser" do
5
4
  before do
6
5
  @iom = INTEGRATION_DB.identifier_output_method
7
6
  @iim = INTEGRATION_DB.identifier_input_method
8
7
  @defsch = INTEGRATION_DB.default_schema
9
- clear_sqls
8
+ @qi = INTEGRATION_DB.quote_identifiers?
10
9
  end
11
10
  after do
12
11
  INTEGRATION_DB.identifier_output_method = @iom
13
12
  INTEGRATION_DB.identifier_input_method = @iim
14
13
  INTEGRATION_DB.default_schema = @defsch
15
- INTEGRATION_DB.drop_table(:items) if INTEGRATION_DB.table_exists?(:items)
14
+ INTEGRATION_DB.quote_identifiers = @qi
15
+ INTEGRATION_DB.drop_table?(:items)
16
16
  end
17
17
 
18
- specify "should handle a database with a identifier_output_method" do
18
+ specify "should handle a database with a identifier methods" do
19
19
  INTEGRATION_DB.identifier_output_method = :reverse
20
20
  INTEGRATION_DB.identifier_input_method = :reverse
21
+ INTEGRATION_DB.quote_identifiers = true
21
22
  INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
22
23
  INTEGRATION_DB.create_table!(:items){Integer :number}
23
- INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
24
- INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
24
+ begin
25
+ INTEGRATION_DB.schema(:items, :reload=>true).should be_a_kind_of(Array)
26
+ INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
27
+ ensure
28
+ INTEGRATION_DB.drop_table(:items)
29
+ end
30
+ end
31
+
32
+ specify "should handle a dataset with identifier methods different than the database's" do
33
+ INTEGRATION_DB.identifier_output_method = :reverse
34
+ INTEGRATION_DB.identifier_input_method = :reverse
35
+ INTEGRATION_DB.quote_identifiers = true
36
+ INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
37
+ INTEGRATION_DB.create_table!(:items){Integer :number}
38
+ INTEGRATION_DB.identifier_output_method = @iom
39
+ INTEGRATION_DB.identifier_input_method = @iim
40
+ ds = INTEGRATION_DB[:items]
41
+ ds.identifier_output_method = :reverse
42
+ ds.identifier_input_method = :reverse
43
+ begin
44
+ INTEGRATION_DB.schema(ds, :reload=>true).should be_a_kind_of(Array)
45
+ INTEGRATION_DB.schema(ds, :reload=>true).first.first.should == :number
46
+ ensure
47
+ INTEGRATION_DB.identifier_output_method = :reverse
48
+ INTEGRATION_DB.identifier_input_method = :reverse
49
+ INTEGRATION_DB.drop_table(:items)
50
+ end
25
51
  end
26
52
 
27
53
  specify "should not issue an sql query if the schema has been loaded unless :reload is true" do
28
54
  INTEGRATION_DB.create_table!(:items){Integer :number}
29
55
  INTEGRATION_DB.schema(:items, :reload=>true)
30
- clear_sqls
31
56
  INTEGRATION_DB.schema(:items)
32
- clear_sqls
33
57
  INTEGRATION_DB.schema(:items, :reload=>true)
34
58
  end
35
59
 
@@ -56,11 +80,10 @@ describe "Database schema parser" do
56
80
  col_info = col.last
57
81
  col_info.should be_a_kind_of(Hash)
58
82
  col_info[:type].should == :integer
59
- clear_sqls
60
83
  INTEGRATION_DB.schema(:items)
61
84
  end
62
85
 
63
- cspecify "should parse primary keys from the schema properly", [proc{|db| db.adapter_scheme != :jdbc}, :mssql] do
86
+ specify "should parse primary keys from the schema properly" do
64
87
  INTEGRATION_DB.create_table!(:items){Integer :number}
65
88
  INTEGRATION_DB.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == []
66
89
  INTEGRATION_DB.create_table!(:items){primary_key :number}
@@ -85,7 +108,7 @@ describe "Database schema parser" do
85
108
  INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
86
109
  end
87
110
 
88
- specify "should parse types from the schema properly" do
111
+ cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
89
112
  INTEGRATION_DB.create_table!(:items){Integer :number}
90
113
  INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
91
114
  INTEGRATION_DB.create_table!(:items){Fixnum :number}
@@ -113,17 +136,20 @@ describe "Database schema parser" do
113
136
  INTEGRATION_DB.create_table!(:items){FalseClass :number}
114
137
  INTEGRATION_DB.schema(:items).first.last[:type].should == :boolean
115
138
  end
116
- end
117
- end
139
+ end if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
118
140
 
119
- begin
120
- INTEGRATION_DB.drop_table(:blah) rescue nil
141
+ test_indexes = begin
142
+ INTEGRATION_DB.drop_table?(:blah)
121
143
  INTEGRATION_DB.indexes(:blah)
144
+ true
122
145
  rescue Sequel::NotImplemented
146
+ false
123
147
  rescue
148
+ true
149
+ end
124
150
  describe "Database index parsing" do
125
151
  after do
126
- INTEGRATION_DB.drop_table(:items)
152
+ INTEGRATION_DB.drop_table?(:items)
127
153
  end
128
154
 
129
155
  specify "should parse indexes into a hash" do
@@ -149,17 +175,71 @@ describe "Database index parsing" do
149
175
  INTEGRATION_DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
150
176
  INTEGRATION_DB.indexes(:items).should == {}
151
177
  end
178
+ end if test_indexes
179
+
180
+ test_foreign_key_list = begin
181
+ INTEGRATION_DB.drop_table?(:blah)
182
+ INTEGRATION_DB.foreign_key_list(:blah)
183
+ true
184
+ rescue Sequel::NotImplemented
185
+ false
186
+ rescue
187
+ true
152
188
  end
153
- end
189
+ describe "Database foreign key parsing" do
190
+ before do
191
+ @db = INTEGRATION_DB
192
+ @pr = lambda do |table, *expected|
193
+ actual = @db.foreign_key_list(table).sort_by{|c| c[:columns].map{|s| s.to_s}.join << (c[:key]||[]).map{|s| s.to_s}.join}.map{|v| v.values_at(:columns, :table, :key)}
194
+ actual.zip(expected).each do |a, e|
195
+ if e.last.first == :pk
196
+ if a.last == nil
197
+ a.pop
198
+ e.pop
199
+ else
200
+ e.last.shift
201
+ end
202
+ end
203
+ a.should == e
204
+ end
205
+ actual.length.should == expected.length
206
+ end
207
+ end
208
+ after do
209
+ @db.drop_table?(:b, :a)
210
+ end
211
+
212
+ specify "should parse foreign key information into an array of hashes" do
213
+ @db.create_table!(:a, :engine=>:InnoDB){primary_key :c; Integer :d; index :d, :unique=>true}
214
+ @db.create_table!(:b, :engine=>:InnoDB){foreign_key :e, :a}
215
+ @pr[:a]
216
+ @pr[:b, [[:e], :a, [:pk, :c]]]
217
+
218
+ @db.alter_table(:b){add_foreign_key :f, :a, :key=>[:d]}
219
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:d]]]
220
+
221
+ @db.alter_table(:b){add_foreign_key [:f], :a, :key=>[:c]}
222
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
223
+
224
+ @db.alter_table(:a){add_index [:d, :c], :unique=>true}
225
+ @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
226
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
227
+ end
228
+
229
+ specify "should handle composite foreign and primary keys" do
230
+ @db.create_table!(:a, :engine=>:InnoDB){Integer :b; Integer :c; primary_key [:b, :c]; index [:c, :b], :unique=>true}
231
+ @db.create_table!(:b, :engine=>:InnoDB){Integer :e; Integer :f; foreign_key [:e, :f], :a; foreign_key [:f, :e], :a, :key=>[:c, :b]}
232
+ @pr[:b, [[:e, :f], :a, [:pk, :b, :c]], [[:f, :e], :a, [:c, :b]]]
233
+ end
234
+ end if test_foreign_key_list
154
235
 
155
236
  describe "Database schema modifiers" do
156
237
  before do
157
238
  @db = INTEGRATION_DB
158
239
  @ds = @db[:items]
159
- clear_sqls
160
240
  end
161
241
  after do
162
- @db.drop_table(:items) if @db.table_exists?(:items)
242
+ @db.drop_table?(:items, :items2)
163
243
  end
164
244
 
165
245
  specify "should create tables correctly" do
@@ -170,12 +250,60 @@ describe "Database schema modifiers" do
170
250
  @ds.columns!.should == [:number]
171
251
  end
172
252
 
253
+ specify "should create tables from select statements correctly" do
254
+ @db.create_table!(:items){Integer :number}
255
+ @ds.insert([10])
256
+ @db.create_table(:items2, :as=>@db[:items])
257
+ @db.schema(:items2, :reload=>true).map{|x| x.first}.should == [:number]
258
+ @db[:items2].columns.should == [:number]
259
+ @db[:items2].all.should == [{:number=>10}]
260
+ end
261
+
262
+ specify "should handle create table in a rolled back transaction" do
263
+ @db.drop_table?(:items)
264
+ @db.transaction(:rollback=>:always){@db.create_table(:items){Integer :number}}
265
+ @db.table_exists?(:items).should be_false
266
+ end if INTEGRATION_DB.supports_transactional_ddl?
267
+
268
+ describe "join tables" do
269
+ after do
270
+ @db.drop_join_table(:cat_id=>:cats, :dog_id=>:dogs) if @db.table_exists?(:cats_dogs)
271
+ @db.drop_table(:cats, :dogs)
272
+ @db.table_exists?(:cats_dogs).should == false
273
+ end
274
+
275
+ specify "should create join tables correctly" do
276
+ @db.create_table!(:cats){primary_key :id}
277
+ @db.create_table!(:dogs){primary_key :id}
278
+ @db.create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
279
+ @db.table_exists?(:cats_dogs).should == true
280
+ end
281
+ end
282
+
173
283
  specify "should create temporary tables without raising an exception" do
174
284
  @db.create_table!(:items, :temp=>true){Integer :number}
175
285
  end
176
286
 
287
+ specify "should have create_table? only create the table if it doesn't already exist" do
288
+ @db.create_table!(:items){String :a}
289
+ @db.create_table?(:items){String :b}
290
+ @db[:items].columns.should == [:a]
291
+ @db.drop_table?(:items)
292
+ @db.create_table?(:items){String :b}
293
+ @db[:items].columns.should == [:b]
294
+ end
295
+
296
+ specify "should have create_table? work correctly with indexes" do
297
+ @db.create_table!(:items){String :a, :index=>true}
298
+ @db.create_table?(:items){String :b, :index=>true}
299
+ @db[:items].columns.should == [:a]
300
+ @db.drop_table?(:items)
301
+ @db.create_table?(:items){String :b, :index=>true}
302
+ @db[:items].columns.should == [:b]
303
+ end
304
+
177
305
  specify "should rename tables correctly" do
178
- @db.drop_table(:items) rescue nil
306
+ @db.drop_table?(:items)
179
307
  @db.create_table!(:items2){Integer :number}
180
308
  @db.rename_table(:items2, :items)
181
309
  @db.table_exists?(:items).should == true
@@ -215,24 +343,34 @@ describe "Database schema modifiers" do
215
343
  specify "should add columns to tables correctly" do
216
344
  @db.create_table!(:items){Integer :number}
217
345
  @ds.insert(:number=>10)
218
- @db.alter_table(:items){add_column :name, :text}
346
+ @db.alter_table(:items){add_column :name, String}
219
347
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name]
220
348
  @ds.columns!.should == [:number, :name]
221
349
  @ds.all.should == [{:number=>10, :name=>nil}]
222
350
  end
223
351
 
224
- cspecify "should add primary key columns to tables correctly", :h2 do
352
+ cspecify "should add primary key columns to tables correctly", :h2, :derby do
225
353
  @db.create_table!(:items){Integer :number}
226
354
  @ds.insert(:number=>10)
227
355
  @db.alter_table(:items){add_primary_key :id}
228
356
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :id]
229
357
  @ds.columns!.should == [:number, :id]
230
358
  @ds.map(:number).should == [10]
359
+ proc{@ds.insert(:id=>@ds.map(:id).first)}.should raise_error
360
+ end
361
+
362
+ specify "should drop primary key constraints from tables correctly" do
363
+ @db.create_table!(:items){Integer :number; primary_key [:number], :name=>:items_pk}
364
+ @ds.insert(:number=>10)
365
+ @db.alter_table(:items){drop_constraint :items_pk, :type=>:primary_key}
366
+ @ds.map(:number).should == [10]
367
+ proc{@ds.insert(10)}.should_not raise_error
231
368
  end
232
369
 
233
370
  specify "should add foreign key columns to tables correctly" do
234
371
  @db.create_table!(:items){primary_key :id}
235
- i = @ds.insert
372
+ @ds.insert
373
+ i = @ds.get(:id)
236
374
  @db.alter_table(:items){add_foreign_key :item_id, :items}
237
375
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
238
376
  @ds.columns!.should == [:id, :item_id]
@@ -269,7 +407,22 @@ describe "Database schema modifiers" do
269
407
  proc{@ds.insert(:n=>nil)}.should raise_error(Sequel::DatabaseError)
270
408
  end
271
409
 
272
- specify "should set column NULL/NOT NULL correctly" do
410
+ specify "should rename columns when the table is referenced by a foreign key" do
411
+ begin
412
+ @db.create_table!(:itemsfk){primary_key :id; Integer :a}
413
+ @db.create_table!(:items){foreign_key :id, :itemsfk}
414
+ @db[:itemsfk].insert(:a=>10)
415
+ @ds.insert(:id=>1)
416
+ @db.alter_table(:itemsfk){rename_column :a, :b}
417
+ @db[:itemsfk].insert(:b=>20)
418
+ @ds.insert(:id=>2)
419
+ @db[:itemsfk].select_order_map([:id, :b]).should == [[1, 10], [2, 20]]
420
+ ensure
421
+ @db.drop_table(:items, :itemsfk)
422
+ end
423
+ end
424
+
425
+ cspecify "should set column NULL/NOT NULL correctly", [:jdbc, :db2], [:db2] do
273
426
  @db.create_table!(:items, :engine=>:InnoDB){Integer :id}
274
427
  @ds.insert(:id=>10)
275
428
  @db.alter_table(:items){set_column_allow_null :id, false}
@@ -277,7 +430,7 @@ describe "Database schema modifiers" do
277
430
  @ds.columns!.should == [:id]
278
431
  proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
279
432
  @db.alter_table(:items){set_column_allow_null :id, true}
280
- @ds.insert
433
+ @ds.insert(:id=>nil)
281
434
  @ds.all.should == [{:id=>10}, {:id=>nil}]
282
435
  end
283
436
 
@@ -291,28 +444,92 @@ describe "Database schema modifiers" do
291
444
  @ds.all.should == [{:id=>10}, {:id=>20}]
292
445
  end
293
446
 
294
- specify "should set column types correctly" do
447
+ cspecify "should set column types correctly", [:jdbc, :db2], [:db2], :oracle do
295
448
  @db.create_table!(:items){Integer :id}
296
449
  @ds.insert(:id=>10)
297
450
  @db.alter_table(:items){set_column_type :id, String}
298
451
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
299
452
  @ds.columns!.should == [:id]
300
- @ds.insert(:id=>20)
453
+ @ds.insert(:id=>'20')
301
454
  @ds.all.should == [{:id=>"10"}, {:id=>"20"}]
302
455
  end
303
456
 
304
- cspecify "should add unique constraints and foreign key table constraints correctly", :sqlite do
305
- @db.create_table!(:items){Integer :id; Integer :item_id}
457
+ cspecify "should set column types without modifying NULL/NOT NULL", [:jdbc, :db2], [:db2], :oracle, :derby do
458
+ @db.create_table!(:items){Integer :id, :null=>false, :default=>2}
459
+ proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
460
+ @db.alter_table(:items){set_column_type :id, String}
461
+ proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
462
+
463
+ @db.create_table!(:items){Integer :id}
464
+ @ds.insert(:id=>nil)
465
+ @db.alter_table(:items){set_column_type :id, String}
466
+ @ds.insert(:id=>nil)
467
+ @ds.map(:id).should == [nil, nil]
468
+ end
469
+
470
+ cspecify "should set column types without modifying defaults", [:jdbc, :db2], [:db2], :oracle, :derby do
471
+ @db.create_table!(:items){Integer :id, :default=>0}
472
+ @ds.insert
473
+ @ds.map(:id).should == [0]
474
+ @db.alter_table(:items){set_column_type :id, String}
475
+ @ds.insert
476
+ @ds.map(:id).should == ['0', '0']
477
+
478
+ @db.create_table!(:items){String :id, :default=>'a'}
479
+ @ds.insert
480
+ @ds.map(:id).should == %w'a'
481
+ @db.alter_table(:items){set_column_type :id, String, :size=>1}
482
+ @ds.insert
483
+ @ds.map(:id).should == %w'a a'
484
+ end
485
+
486
+ specify "should add unnamed unique constraints and foreign key table constraints correctly" do
487
+ @db.create_table!(:items, :engine=>:InnoDB){Integer :id; Integer :item_id}
306
488
  @db.alter_table(:items) do
307
489
  add_unique_constraint [:item_id, :id]
308
490
  add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id]
309
491
  end
310
492
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
311
493
  @ds.columns!.should == [:id, :item_id]
494
+ proc{@ds.insert(1, 1)}.should_not raise_error
495
+ proc{@ds.insert(1, 1)}.should raise_error
496
+ proc{@ds.insert(1, 2)}.should raise_error
312
497
  end
313
498
 
314
- cspecify "should remove columns from tables correctly", :h2, :mssql do
499
+ specify "should add named unique constraints and foreign key table constraints correctly" do
500
+ @db.create_table!(:items, :engine=>:InnoDB){Integer :id, :null=>false; Integer :item_id, :null=>false}
501
+ @db.alter_table(:items) do
502
+ add_unique_constraint [:item_id, :id], :name=>:unique_iii
503
+ add_foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:fk_iii
504
+ end
505
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
506
+ @ds.columns!.should == [:id, :item_id]
507
+ proc{@ds.insert(1, 1)}.should_not raise_error
508
+ proc{@ds.insert(1, 1)}.should raise_error
509
+ proc{@ds.insert(1, 2)}.should raise_error
510
+ end
511
+
512
+ specify "should drop unique constraints and foreign key table constraints correctly" do
315
513
  @db.create_table!(:items) do
514
+ Integer :id
515
+ Integer :item_id
516
+ unique [:item_id, :id], :name=>:items_uk
517
+ foreign_key [:id, :item_id], :items, :key=>[:item_id, :id], :name=>:items_fk
518
+ end
519
+ @db.alter_table(:items) do
520
+ drop_constraint(:items_fk, :type=>:foreign_key)
521
+ drop_constraint(:items_uk, :type=>:unique)
522
+ end
523
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id, :item_id]
524
+ @ds.columns!.should == [:id, :item_id]
525
+ proc{@ds.insert(1, 2)}.should_not raise_error
526
+ proc{@ds.insert(1, 2)}.should_not raise_error
527
+ end
528
+
529
+ cspecify "should remove columns from tables correctly", :h2, :mssql, [:jdbc, :db2], :hsqldb do
530
+ # MySQL with InnoDB cannot drop foreign key columns unless you know the
531
+ # name of the constraint, see Bug #14347
532
+ @db.create_table!(:items, :engine=>:MyISAM) do
316
533
  primary_key :id
317
534
  String :name
318
535
  Integer :number
@@ -332,7 +549,7 @@ describe "Database schema modifiers" do
332
549
  @ds.columns!.should == [:id]
333
550
  end
334
551
 
335
- specify "should remove multiple columns in a single alter_table block" do
552
+ cspecify "should remove multiple columns in a single alter_table block", [:jdbc, :db2] do
336
553
  @db.create_table!(:items) do
337
554
  primary_key :id
338
555
  String :name
@@ -350,10 +567,12 @@ describe "Database schema modifiers" do
350
567
  end
351
568
  end
352
569
 
353
- begin
570
+ test_tables = begin
354
571
  INTEGRATION_DB.tables
572
+ true
355
573
  rescue Sequel::NotImplemented
356
- rescue
574
+ false
575
+ end
357
576
  describe "Database#tables" do
358
577
  before do
359
578
  class ::String
@@ -362,25 +581,72 @@ describe "Database#tables" do
362
581
  "xxxxx#{@@xxxxx += 1}"
363
582
  end
364
583
  end
365
- @iom = INTEGRATION_DB.identifier_output_method
366
- @iim = INTEGRATION_DB.identifier_input_method
367
- clear_sqls
584
+ @db = INTEGRATION_DB
585
+ @db.create_table(:sequel_test_table){Integer :a}
586
+ @db.create_view :sequel_test_view, @db[:sequel_test_table]
587
+ @iom = @db.identifier_output_method
588
+ @iim = @db.identifier_input_method
368
589
  end
369
590
  after do
370
- INTEGRATION_DB.identifier_output_method = @iom
371
- INTEGRATION_DB.identifier_input_method = @iim
591
+ @db.identifier_output_method = @iom
592
+ @db.identifier_input_method = @iim
593
+ @db.drop_view :sequel_test_view
594
+ @db.drop_table :sequel_test_table
372
595
  end
373
596
 
374
597
  specify "should return an array of symbols" do
375
- ts = INTEGRATION_DB.tables
598
+ ts = @db.tables
376
599
  ts.should be_a_kind_of(Array)
377
600
  ts.each{|t| t.should be_a_kind_of(Symbol)}
601
+ ts.should include(:sequel_test_table)
602
+ ts.should_not include(:sequel_test_view)
378
603
  end
379
604
 
380
605
  specify "should respect the database's identifier_output_method" do
381
- INTEGRATION_DB.identifier_output_method = :xxxxx
382
- INTEGRATION_DB.identifier_input_method = :xxxxx
383
- INTEGRATION_DB.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
606
+ @db.identifier_output_method = :xxxxx
607
+ @db.identifier_input_method = :xxxxx
608
+ @db.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
384
609
  end
610
+ end if test_tables
611
+
612
+ test_views = begin
613
+ INTEGRATION_DB.views
614
+ true
615
+ rescue Sequel::NotImplemented
616
+ false
385
617
  end
386
- end
618
+ describe "Database#views" do
619
+ before do
620
+ class ::String
621
+ @@xxxxx = 0
622
+ def xxxxx
623
+ "xxxxx#{@@xxxxx += 1}"
624
+ end
625
+ end
626
+ @db = INTEGRATION_DB
627
+ @db.create_table(:sequel_test_table){Integer :a}
628
+ @db.create_view :sequel_test_view, @db[:sequel_test_table]
629
+ @iom = @db.identifier_output_method
630
+ @iim = @db.identifier_input_method
631
+ end
632
+ after do
633
+ @db.identifier_output_method = @iom
634
+ @db.identifier_input_method = @iim
635
+ @db.drop_view :sequel_test_view
636
+ @db.drop_table :sequel_test_table
637
+ end
638
+
639
+ specify "should return an array of symbols" do
640
+ ts = @db.views
641
+ ts.should be_a_kind_of(Array)
642
+ ts.each{|t| t.should be_a_kind_of(Symbol)}
643
+ ts.should_not include(:sequel_test_table)
644
+ ts.should include(:sequel_test_view)
645
+ end
646
+
647
+ specify "should respect the database's identifier_output_method" do
648
+ @db.identifier_output_method = :xxxxx
649
+ @db.identifier_input_method = :xxxxx
650
+ @db.views.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
651
+ end
652
+ end if test_views
@@ -9,12 +9,13 @@ begin
9
9
  rescue LoadError
10
10
  end
11
11
 
12
- Sequel::Model.use_transactions = false
12
+ if ENV['SEQUEL_COLUMNS_INTROSPECTION']
13
+ Sequel.extension :columns_introspection
14
+ Sequel::Dataset.introspect_all_columns
15
+ end
13
16
 
14
- $sqls = []
15
- def clear_sqls
16
- $sqls.clear
17
- end
17
+ Sequel::Model.use_transactions = false
18
+ Sequel::Model.cache_anonymous_models = false
18
19
 
19
20
  unless defined?(RSpec)
20
21
  module Spec::Matchers
@@ -29,45 +30,45 @@ unless defined?(RSpec)
29
30
  end
30
31
  end
31
32
 
32
- (defined?(RSpec) ? RSpec::Core::ExampleGroup : Spec::Example::ExampleGroup).class_eval do
33
- def log
34
- begin
35
- INTEGRATION_DB.loggers << Logger.new(STDOUT)
36
- yield
37
- ensure
38
- INTEGRATION_DB.loggers.pop
39
- end
40
- end
41
-
42
- def self.log_specify(message, &block)
43
- specify(message){log{instance_eval(&block)}}
44
- end
45
-
46
- def self.cspecify(message, *checked, &block)
47
- pending = false
33
+ def Sequel.guarded?(*checked)
34
+ unless ENV['SEQUEL_NO_PENDING']
48
35
  checked.each do |c|
49
36
  case c
50
37
  when INTEGRATION_DB.database_type
51
- pending = c
38
+ return c
52
39
  when Array
53
40
  case c.length
54
41
  when 1
55
- pending = c if c.first == INTEGRATION_DB.adapter_scheme
42
+ return c if c.first == INTEGRATION_DB.adapter_scheme
56
43
  when 2
57
44
  if c.first.is_a?(Proc)
58
- pending = c if c.first.call(INTEGRATION_DB) && c.last == INTEGRATION_DB.database_type
45
+ return c if c.first.call(INTEGRATION_DB) && c.last == INTEGRATION_DB.database_type
59
46
  elsif c.last.is_a?(Proc)
60
- pending = c if c.first == INTEGRATION_DB.adapter_scheme && c.last.call(INTEGRATION_DB)
47
+ return c if c.first == INTEGRATION_DB.adapter_scheme && c.last.call(INTEGRATION_DB)
61
48
  else
62
- pending = c if c.first == INTEGRATION_DB.adapter_scheme && c.last == INTEGRATION_DB.database_type
49
+ return c if c.first == INTEGRATION_DB.adapter_scheme && c.last == INTEGRATION_DB.database_type
63
50
  end
64
51
  when 3
65
- pending = c if c[0] == INTEGRATION_DB.adapter_scheme && c[1] == INTEGRATION_DB.database_type && c[2].call(INTEGRATION_DB)
52
+ return c if c[0] == INTEGRATION_DB.adapter_scheme && c[1] == INTEGRATION_DB.database_type && c[2].call(INTEGRATION_DB)
66
53
  end
67
54
  end
68
- break if pending
69
55
  end
70
- if pending
56
+ end
57
+ false
58
+ end
59
+
60
+ (defined?(RSpec) ? RSpec::Core::ExampleGroup : Spec::Example::ExampleGroup).class_eval do
61
+ def log
62
+ begin
63
+ INTEGRATION_DB.loggers << Logger.new(STDOUT)
64
+ yield
65
+ ensure
66
+ INTEGRATION_DB.loggers.pop
67
+ end
68
+ end
69
+
70
+ def self.cspecify(message, *checked, &block)
71
+ if pending = Sequel.guarded?(*checked)
71
72
  specify(message){pending("Not yet working on #{Array(pending).join(', ')}", &block)}
72
73
  else
73
74
  specify(message, &block)
@@ -82,5 +83,14 @@ if defined?(INTEGRATION_DB) || defined?(INTEGRATION_URL) || ENV['SEQUEL_INTEGRAT
82
83
  #INTEGRATION_DB.instance_variable_set(:@server_version, 80100)
83
84
  end
84
85
  else
85
- INTEGRATION_DB = Sequel.sqlite('', :quote_identifiers=>false)
86
+ INTEGRATION_DB = Sequel.sqlite
87
+ end
88
+
89
+ if INTEGRATION_DB.adapter_scheme == :ibmdb
90
+ def INTEGRATION_DB.drop_table(*tables)
91
+ super
92
+ rescue Sequel::DatabaseError
93
+ disconnect
94
+ super
95
+ end
86
96
  end