sequel 3.21.0 → 3.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. data/CHANGELOG +1061 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +103 -63
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +67 -51
  7. data/doc/advanced_associations.rdoc +189 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/cheat_sheet.rdoc +21 -21
  10. data/doc/core_extensions.rdoc +374 -0
  11. data/doc/dataset_basics.rdoc +10 -10
  12. data/doc/dataset_filtering.rdoc +54 -42
  13. data/doc/mass_assignment.rdoc +56 -0
  14. data/doc/migration.rdoc +89 -557
  15. data/doc/model_hooks.rdoc +80 -29
  16. data/doc/object_model.rdoc +547 -0
  17. data/doc/opening_databases.rdoc +114 -53
  18. data/doc/prepared_statements.rdoc +41 -15
  19. data/doc/querying.rdoc +137 -56
  20. data/doc/reflection.rdoc +36 -10
  21. data/doc/release_notes/3.22.0.txt +39 -0
  22. data/doc/release_notes/3.23.0.txt +172 -0
  23. data/doc/release_notes/3.24.0.txt +420 -0
  24. data/doc/release_notes/3.25.0.txt +88 -0
  25. data/doc/release_notes/3.26.0.txt +88 -0
  26. data/doc/release_notes/3.27.0.txt +82 -0
  27. data/doc/release_notes/3.28.0.txt +304 -0
  28. data/doc/release_notes/3.29.0.txt +459 -0
  29. data/doc/release_notes/3.30.0.txt +135 -0
  30. data/doc/release_notes/3.31.0.txt +146 -0
  31. data/doc/release_notes/3.32.0.txt +202 -0
  32. data/doc/release_notes/3.33.0.txt +157 -0
  33. data/doc/release_notes/3.34.0.txt +671 -0
  34. data/doc/release_notes/3.35.0.txt +144 -0
  35. data/doc/release_notes/3.36.0.txt +245 -0
  36. data/doc/release_notes/3.37.0.txt +338 -0
  37. data/doc/release_notes/3.38.0.txt +234 -0
  38. data/doc/release_notes/3.39.0.txt +237 -0
  39. data/doc/schema_modification.rdoc +585 -0
  40. data/doc/sharding.rdoc +99 -8
  41. data/doc/sql.rdoc +154 -112
  42. data/doc/testing.rdoc +169 -0
  43. data/doc/thread_safety.rdoc +17 -0
  44. data/doc/transactions.rdoc +137 -0
  45. data/doc/validations.rdoc +1 -1
  46. data/doc/virtual_rows.rdoc +78 -43
  47. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  48. data/lib/sequel/adapters/ado.rb +40 -18
  49. data/lib/sequel/adapters/amalgalite.rb +17 -9
  50. data/lib/sequel/adapters/db2.rb +175 -86
  51. data/lib/sequel/adapters/dbi.rb +15 -15
  52. data/lib/sequel/adapters/do/mysql.rb +17 -11
  53. data/lib/sequel/adapters/do/postgres.rb +2 -61
  54. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  55. data/lib/sequel/adapters/do.rb +18 -36
  56. data/lib/sequel/adapters/firebird.rb +27 -208
  57. data/lib/sequel/adapters/ibmdb.rb +453 -0
  58. data/lib/sequel/adapters/informix.rb +6 -23
  59. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  60. data/lib/sequel/adapters/jdbc/db2.rb +56 -0
  61. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  62. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  63. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  64. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  65. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  66. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  67. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  68. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  69. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  70. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  71. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  73. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  74. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  75. data/lib/sequel/adapters/jdbc.rb +279 -97
  76. data/lib/sequel/adapters/mock.rb +372 -0
  77. data/lib/sequel/adapters/mysql.rb +125 -222
  78. data/lib/sequel/adapters/mysql2.rb +65 -56
  79. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  80. data/lib/sequel/adapters/odbc.rb +28 -9
  81. data/lib/sequel/adapters/openbase.rb +3 -5
  82. data/lib/sequel/adapters/oracle.rb +349 -53
  83. data/lib/sequel/adapters/postgres.rb +368 -138
  84. data/lib/sequel/adapters/shared/access.rb +32 -9
  85. data/lib/sequel/adapters/shared/db2.rb +343 -0
  86. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  87. data/lib/sequel/adapters/shared/informix.rb +53 -0
  88. data/lib/sequel/adapters/shared/mssql.rb +401 -116
  89. data/lib/sequel/adapters/shared/mysql.rb +424 -89
  90. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  91. data/lib/sequel/adapters/shared/oracle.rb +257 -45
  92. data/lib/sequel/adapters/shared/postgres.rb +675 -279
  93. data/lib/sequel/adapters/shared/progress.rb +5 -8
  94. data/lib/sequel/adapters/shared/sqlite.rb +285 -96
  95. data/lib/sequel/adapters/sqlite.rb +101 -39
  96. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  97. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  98. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  99. data/lib/sequel/adapters/swift.rb +28 -19
  100. data/lib/sequel/adapters/tinytds.rb +174 -22
  101. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  102. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  103. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  104. data/lib/sequel/ast_transformer.rb +194 -0
  105. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  106. data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
  107. data/lib/sequel/connection_pool/single.rb +5 -0
  108. data/lib/sequel/connection_pool/threaded.rb +43 -14
  109. data/lib/sequel/connection_pool.rb +10 -2
  110. data/lib/sequel/core.rb +143 -11
  111. data/lib/sequel/database/connecting.rb +38 -28
  112. data/lib/sequel/database/dataset.rb +4 -4
  113. data/lib/sequel/database/dataset_defaults.rb +63 -2
  114. data/lib/sequel/database/logging.rb +7 -2
  115. data/lib/sequel/database/misc.rb +190 -46
  116. data/lib/sequel/database/query.rb +272 -110
  117. data/lib/sequel/database/schema_generator.rb +103 -36
  118. data/lib/sequel/database/schema_methods.rb +300 -67
  119. data/lib/sequel/dataset/actions.rb +344 -90
  120. data/lib/sequel/dataset/features.rb +101 -8
  121. data/lib/sequel/dataset/graph.rb +42 -15
  122. data/lib/sequel/dataset/misc.rb +52 -25
  123. data/lib/sequel/dataset/mutation.rb +12 -7
  124. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  125. data/lib/sequel/dataset/query.rb +305 -54
  126. data/lib/sequel/dataset/sql.rb +720 -292
  127. data/lib/sequel/dataset.rb +8 -0
  128. data/lib/sequel/exceptions.rb +4 -0
  129. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  130. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  131. data/lib/sequel/extensions/blank.rb +4 -0
  132. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  133. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  134. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  135. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  136. data/lib/sequel/extensions/inflector.rb +4 -0
  137. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  138. data/lib/sequel/extensions/migration.rb +100 -11
  139. data/lib/sequel/extensions/named_timezones.rb +9 -0
  140. data/lib/sequel/extensions/null_dataset.rb +94 -0
  141. data/lib/sequel/extensions/pagination.rb +4 -0
  142. data/lib/sequel/extensions/pg_array.rb +537 -0
  143. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  144. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  145. data/lib/sequel/extensions/pg_hstore.rb +313 -0
  146. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  147. data/lib/sequel/extensions/pg_inet.rb +113 -0
  148. data/lib/sequel/extensions/pg_interval.rb +191 -0
  149. data/lib/sequel/extensions/pg_json.rb +208 -0
  150. data/lib/sequel/extensions/pg_range.rb +512 -0
  151. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  152. data/lib/sequel/extensions/pg_row.rb +572 -0
  153. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  154. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  155. data/lib/sequel/extensions/pretty_table.rb +17 -72
  156. data/lib/sequel/extensions/query.rb +8 -4
  157. data/lib/sequel/extensions/query_literals.rb +79 -0
  158. data/lib/sequel/extensions/schema_caching.rb +76 -0
  159. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  160. data/lib/sequel/extensions/select_remove.rb +39 -0
  161. data/lib/sequel/extensions/server_block.rb +140 -0
  162. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  163. data/lib/sequel/extensions/sql_expr.rb +8 -110
  164. data/lib/sequel/extensions/string_date_time.rb +4 -0
  165. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  166. data/lib/sequel/extensions/to_dot.rb +99 -83
  167. data/lib/sequel/model/associations.rb +1263 -409
  168. data/lib/sequel/model/base.rb +624 -171
  169. data/lib/sequel/model/errors.rb +1 -1
  170. data/lib/sequel/model/exceptions.rb +24 -2
  171. data/lib/sequel/model/inflections.rb +1 -1
  172. data/lib/sequel/model.rb +30 -11
  173. data/lib/sequel/no_core_ext.rb +2 -0
  174. data/lib/sequel/plugins/active_model.rb +13 -1
  175. data/lib/sequel/plugins/association_pks.rb +22 -4
  176. data/lib/sequel/plugins/caching.rb +25 -18
  177. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  178. data/lib/sequel/plugins/composition.rb +44 -12
  179. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  180. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  181. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  182. data/lib/sequel/plugins/dirty.rb +214 -0
  183. data/lib/sequel/plugins/eager_each.rb +59 -0
  184. data/lib/sequel/plugins/force_encoding.rb +6 -6
  185. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  186. data/lib/sequel/plugins/identity_map.rb +134 -15
  187. data/lib/sequel/plugins/instance_filters.rb +10 -0
  188. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  189. data/lib/sequel/plugins/json_serializer.rb +58 -6
  190. data/lib/sequel/plugins/list.rb +13 -2
  191. data/lib/sequel/plugins/many_through_many.rb +103 -51
  192. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  193. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  194. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  195. data/lib/sequel/plugins/pg_row.rb +121 -0
  196. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  197. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  198. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  199. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  200. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  201. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  202. data/lib/sequel/plugins/schema.rb +8 -3
  203. data/lib/sequel/plugins/serialization.rb +98 -49
  204. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  205. data/lib/sequel/plugins/sharding.rb +21 -54
  206. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  207. data/lib/sequel/plugins/static_cache.rb +99 -0
  208. data/lib/sequel/plugins/subclasses.rb +29 -3
  209. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  210. data/lib/sequel/plugins/timestamps.rb +1 -1
  211. data/lib/sequel/plugins/tree.rb +3 -3
  212. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  213. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  214. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  215. data/lib/sequel/plugins/validation_helpers.rb +55 -4
  216. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  217. data/lib/sequel/sql.rb +649 -122
  218. data/lib/sequel/timezones.rb +67 -40
  219. data/lib/sequel/version.rb +1 -1
  220. data/spec/adapters/db2_spec.rb +146 -0
  221. data/spec/adapters/firebird_spec.rb +1 -1
  222. data/spec/adapters/mssql_spec.rb +194 -66
  223. data/spec/adapters/mysql_spec.rb +475 -306
  224. data/spec/adapters/oracle_spec.rb +92 -117
  225. data/spec/adapters/postgres_spec.rb +1982 -325
  226. data/spec/adapters/spec_helper.rb +9 -6
  227. data/spec/adapters/sqlite_spec.rb +203 -75
  228. data/spec/core/connection_pool_spec.rb +218 -93
  229. data/spec/core/database_spec.rb +956 -522
  230. data/spec/core/dataset_spec.rb +1631 -1242
  231. data/spec/core/expression_filters_spec.rb +690 -334
  232. data/spec/core/mock_adapter_spec.rb +453 -0
  233. data/spec/core/object_graph_spec.rb +88 -129
  234. data/spec/core/schema_generator_spec.rb +4 -4
  235. data/spec/core/schema_spec.rb +556 -53
  236. data/spec/core/spec_helper.rb +7 -48
  237. data/spec/core_extensions_spec.rb +626 -0
  238. data/spec/extensions/active_model_spec.rb +13 -0
  239. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  240. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  241. data/spec/extensions/association_dependencies_spec.rb +15 -25
  242. data/spec/extensions/association_pks_spec.rb +66 -32
  243. data/spec/extensions/association_proxies_spec.rb +4 -4
  244. data/spec/extensions/boolean_readers_spec.rb +25 -25
  245. data/spec/extensions/caching_spec.rb +47 -51
  246. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  247. data/spec/extensions/columns_introspection_spec.rb +91 -0
  248. data/spec/extensions/composition_spec.rb +18 -13
  249. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  250. data/spec/extensions/constraint_validations_spec.rb +316 -0
  251. data/spec/extensions/dataset_associations_spec.rb +199 -0
  252. data/spec/extensions/defaults_setter_spec.rb +88 -0
  253. data/spec/extensions/dirty_spec.rb +155 -0
  254. data/spec/extensions/eager_each_spec.rb +34 -0
  255. data/spec/extensions/eval_inspect_spec.rb +67 -0
  256. data/spec/extensions/force_encoding_spec.rb +4 -2
  257. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  258. data/spec/extensions/identity_map_spec.rb +142 -24
  259. data/spec/extensions/inflector_spec.rb +0 -4
  260. data/spec/extensions/instance_filters_spec.rb +11 -21
  261. data/spec/extensions/instance_hooks_spec.rb +72 -0
  262. data/spec/extensions/json_serializer_spec.rb +49 -12
  263. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  264. data/spec/extensions/list_spec.rb +49 -40
  265. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  266. data/spec/extensions/many_through_many_spec.rb +368 -254
  267. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  268. data/spec/extensions/migration_spec.rb +140 -35
  269. data/spec/extensions/named_timezones_spec.rb +29 -11
  270. data/spec/extensions/nested_attributes_spec.rb +268 -89
  271. data/spec/extensions/null_dataset_spec.rb +85 -0
  272. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  273. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  274. data/spec/extensions/pg_array_spec.rb +320 -0
  275. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  276. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  277. data/spec/extensions/pg_hstore_spec.rb +194 -0
  278. data/spec/extensions/pg_inet_spec.rb +47 -0
  279. data/spec/extensions/pg_interval_spec.rb +72 -0
  280. data/spec/extensions/pg_json_spec.rb +99 -0
  281. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  282. data/spec/extensions/pg_range_spec.rb +395 -0
  283. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  284. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  285. data/spec/extensions/pg_row_spec.rb +323 -0
  286. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  287. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  288. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  289. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  290. data/spec/extensions/prepared_statements_spec.rb +87 -0
  291. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  292. data/spec/extensions/pretty_table_spec.rb +7 -6
  293. data/spec/extensions/query_literals_spec.rb +167 -0
  294. data/spec/extensions/query_spec.rb +9 -3
  295. data/spec/extensions/rcte_tree_spec.rb +50 -43
  296. data/spec/extensions/schema_caching_spec.rb +41 -0
  297. data/spec/extensions/schema_dumper_spec.rb +434 -49
  298. data/spec/extensions/schema_spec.rb +30 -49
  299. data/spec/extensions/select_remove_spec.rb +38 -0
  300. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  301. data/spec/extensions/serialization_spec.rb +86 -48
  302. data/spec/extensions/server_block_spec.rb +90 -0
  303. data/spec/extensions/sharding_spec.rb +69 -143
  304. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  305. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  306. data/spec/extensions/spec_helper.rb +34 -67
  307. data/spec/extensions/split_array_nil_spec.rb +24 -0
  308. data/spec/extensions/sql_expr_spec.rb +29 -60
  309. data/spec/extensions/static_cache_spec.rb +145 -0
  310. data/spec/extensions/subclasses_spec.rb +14 -0
  311. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  312. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  313. data/spec/extensions/timestamps_spec.rb +6 -6
  314. data/spec/extensions/to_dot_spec.rb +8 -11
  315. data/spec/extensions/touch_spec.rb +13 -14
  316. data/spec/extensions/tree_spec.rb +11 -26
  317. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  318. data/spec/extensions/update_primary_key_spec.rb +30 -24
  319. data/spec/extensions/validation_class_methods_spec.rb +58 -67
  320. data/spec/extensions/validation_helpers_spec.rb +31 -37
  321. data/spec/extensions/xml_serializer_spec.rb +29 -4
  322. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  323. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  324. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  325. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  326. data/spec/integration/associations_test.rb +659 -21
  327. data/spec/integration/database_test.rb +11 -5
  328. data/spec/integration/dataset_test.rb +717 -129
  329. data/spec/integration/eager_loader_test.rb +38 -54
  330. data/spec/integration/migrator_test.rb +2 -3
  331. data/spec/integration/model_test.rb +81 -2
  332. data/spec/integration/plugin_test.rb +604 -147
  333. data/spec/integration/prepared_statement_test.rb +272 -128
  334. data/spec/integration/schema_test.rb +367 -57
  335. data/spec/integration/spec_helper.rb +42 -32
  336. data/spec/integration/timezone_test.rb +38 -12
  337. data/spec/integration/transaction_test.rb +183 -8
  338. data/spec/integration/type_test.rb +31 -8
  339. data/spec/model/association_reflection_spec.rb +207 -8
  340. data/spec/model/associations_spec.rb +1206 -693
  341. data/spec/model/base_spec.rb +334 -100
  342. data/spec/model/dataset_methods_spec.rb +45 -27
  343. data/spec/model/eager_loading_spec.rb +828 -692
  344. data/spec/model/hooks_spec.rb +355 -67
  345. data/spec/model/model_spec.rb +251 -179
  346. data/spec/model/plugins_spec.rb +24 -13
  347. data/spec/model/record_spec.rb +506 -232
  348. data/spec/model/spec_helper.rb +16 -77
  349. data/spec/model/validations_spec.rb +38 -2
  350. data/spec/rcov.opts +2 -0
  351. metadata +209 -80
  352. data/spec/core/core_sql_spec.rb +0 -451
@@ -0,0 +1,140 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "Sequel::Plugins::ManyToOnePkLookup" do
4
+ before do
5
+ class ::LookupModel < ::Sequel::Model
6
+ plugin :many_to_one_pk_lookup
7
+ columns :id, :caching_model_id, :caching_model_id2
8
+ many_to_one :caching_model
9
+ many_to_one :caching_model2, :key=>[:caching_model_id, :caching_model_id2], :class=>:CachingModel
10
+ end
11
+ @c = LookupModel
12
+
13
+ class ::CachingModel < Sequel::Model
14
+ columns :id, :id2
15
+ end
16
+ @cc = CachingModel
17
+
18
+ @db = MODEL_DB
19
+ end
20
+ after do
21
+ Object.send(:remove_const, :CachingModel)
22
+ Object.send(:remove_const, :LookupModel)
23
+ end
24
+
25
+ shared_examples_for "many_to_one_pk_lookup with composite keys" do
26
+ it "should use a simple primary key lookup when retrieving many_to_one associated records" do
27
+ @db.sqls.should == []
28
+ @c.load(:id=>3, :caching_model_id=>1, :caching_model_id2=>2).caching_model2.should equal(@cm12)
29
+ @c.load(:id=>3, :caching_model_id=>2, :caching_model_id2=>1).caching_model2.should equal(@cm21)
30
+ @db.sqls.should == []
31
+ @c.load(:id=>4, :caching_model_id=>2, :caching_model_id2=>2).caching_model2
32
+ @db.sqls.should_not == []
33
+ end
34
+ end
35
+
36
+ shared_examples_for "many_to_one_pk_lookup" do
37
+ it "should use a simple primary key lookup when retrieving many_to_one associated records via a composite key" do
38
+ @cc.set_primary_key([:id, :id2])
39
+ @db.sqls.should == []
40
+ @c.load(:id=>3, :caching_model_id=>1).caching_model.should equal(@cm1)
41
+ @c.load(:id=>4, :caching_model_id=>2).caching_model.should equal(@cm2)
42
+ @db.sqls.should == []
43
+ @c.load(:id=>4, :caching_model_id=>3).caching_model
44
+ @db.sqls.should_not == []
45
+ end
46
+
47
+ it "should not use a simple primary key lookup if the assocation has a nil :key option" do
48
+ @c.many_to_one :caching_model, :key=>nil, :dataset=>proc{CachingModel.filter(:caching_model_id=>caching_model_id)}
49
+ @c.load(:id=>3, :caching_model_id=>1).caching_model
50
+ @db.sqls.should_not == []
51
+ end
52
+
53
+ it "should not use a simple primary key lookup if the assocation has a nil :key option" do
54
+ @c.many_to_one :caching_model, :many_to_one_pk_lookup=>false
55
+ @c.load(:id=>3, :caching_model_id=>1).caching_model
56
+ @db.sqls.should_not == []
57
+ end
58
+
59
+ it "should not use a simple primary key lookup if the assocation's :primary_key option doesn't match the primary key of the associated class" do
60
+ @c.many_to_one :caching_model, :primary_key=>:id2
61
+ @c.load(:id=>3, :caching_model_id=>1).caching_model
62
+ @db.sqls.should_not == []
63
+ end
64
+
65
+ it "should not use a simple primary key lookup if the prepared_statements_associations method is being used" do
66
+ c2 = Class.new(Sequel::Model(:not_caching_model))
67
+ c2.dataset._fetch = {:id=>1}
68
+ c = Class.new(Sequel::Model(:lookup_model))
69
+ c.class_eval do
70
+ plugin :prepared_statements_associations
71
+ plugin :many_to_one_pk_lookup
72
+ columns :id, :caching_model_id
73
+ many_to_one :caching_model, :class=>c2
74
+ end
75
+ c.load(:id=>3, :caching_model_id=>1).caching_model.should == c2.load(:id=>1)
76
+ @db.sqls.should_not == []
77
+ end
78
+
79
+ it "should use a simple primary key lookup if the prepared_statements_associations method is being used but associated model also uses caching" do
80
+ c = Class.new(Sequel::Model(:lookup_model))
81
+ c.class_eval do
82
+ plugin :prepared_statements_associations
83
+ plugin :many_to_one_pk_lookup
84
+ columns :id, :caching_model_id
85
+ many_to_one :caching_model
86
+ end
87
+ c.load(:id=>3, :caching_model_id=>1).caching_model.should equal(@cm1)
88
+ @db.sqls.should == []
89
+ end
90
+ end
91
+
92
+ describe "With caching plugin" do
93
+ before do
94
+ @cache_class = Class.new(Hash) do
95
+ attr_accessor :ttl
96
+ def set(k, v, ttl); self[k] = v; @ttl = ttl; end
97
+ def get(k); self[k]; end
98
+ end
99
+ cache = @cache_class.new
100
+ @cache = cache
101
+
102
+ @cc.plugin :caching, @cache
103
+ @cc.dataset._fetch = {:id=>1}
104
+ @cm1 = @cc[1]
105
+ @cm2 = @cc[2]
106
+ @cm12 = @cc[1, 2]
107
+ @cm21 = @cc[2, 1]
108
+
109
+ @db.reset
110
+ end
111
+
112
+ it_should_behave_like "many_to_one_pk_lookup"
113
+ it_should_behave_like "many_to_one_pk_lookup with composite keys"
114
+ end
115
+
116
+ describe "With static_cache plugin with single key" do
117
+ before do
118
+ @cc.dataset._fetch = [{:id=>1}, {:id=>2}]
119
+ @cc.plugin :static_cache
120
+ @cm1 = @cc[1]
121
+ @cm2 = @cc[2]
122
+ @db.reset
123
+ end
124
+
125
+ it_should_behave_like "many_to_one_pk_lookup"
126
+ end
127
+
128
+ describe "With static_cache plugin with composite key" do
129
+ before do
130
+ @cc.set_primary_key([:id, :id2])
131
+ @cc.dataset._fetch = [{:id=>1, :id2=>2}, {:id=>2, :id2=>1}]
132
+ @cc.plugin :static_cache
133
+ @cm12 = @cc[[1, 2]]
134
+ @cm21 = @cc[[2, 1]]
135
+ @db.reset
136
+ end
137
+
138
+ it_should_behave_like "many_to_one_pk_lookup with composite keys"
139
+ end
140
+ end
@@ -129,6 +129,7 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
129
129
  rename_column :e, :g
130
130
  end
131
131
  create_view(:c, 'SELECT * FROM b')
132
+ create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
132
133
  end
133
134
  end
134
135
 
@@ -150,13 +151,16 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
150
151
  [:add_spatial_index, :e, {:name=>"e_s"}],
151
152
  [:rename_column, :e, :g]]
152
153
  ],
153
- [:create_view, :c, "SELECT * FROM b"]]
154
+ [:create_view, :c, "SELECT * FROM b"],
155
+ [:create_join_table, {:cat_id=>:cats, :dog_id=>:dogs}]]
154
156
  end
155
157
 
156
158
  specify "should execute down with reversing actions in reverse order" do
157
159
  p = @p
158
160
  Sequel.migration{change(&p)}.apply(@db, :down)
159
- @db.actions.should == [[:drop_view, :c],
161
+ @db.actions.should == [
162
+ [:drop_join_table, {:cat_id=>:cats, :dog_id=>:dogs}],
163
+ [:drop_view, :c],
160
164
  [:alter_table, [
161
165
  [:rename_column, :g, :e],
162
166
  [:drop_index, :e, {:name=>"e_s"}],
@@ -195,14 +199,14 @@ end
195
199
 
196
200
  describe "Sequel::IntegerMigrator" do
197
201
  before do
198
- dbc = Class.new(MockDatabase) do
202
+ dbc = Class.new(Sequel::Mock::Database) do
199
203
  attr_reader :drops, :tables_created, :columns_created, :versions
200
204
  def initialize(*args)
201
205
  super
202
206
  @drops = []
203
207
  @tables_created = []
204
208
  @columns_created = []
205
- @versions = {}
209
+ @versions = Hash.new{|h,k| h[k.to_sym]}
206
210
  end
207
211
 
208
212
  def version; versions.values.first || 0; end
@@ -211,8 +215,8 @@ describe "Sequel::IntegerMigrator" do
211
215
 
212
216
  def create_table(name, opts={}, &block)
213
217
  super
214
- @columns_created << / \(?(\w+) integer.*\)?\z/.match(sqls.last)[1].to_sym
215
- @tables_created << name
218
+ @columns_created << / \(?(\w+) integer.*\)?\z/.match(@sqls.last)[1].to_sym
219
+ @tables_created << name.to_sym
216
220
  end
217
221
 
218
222
  def dataset(opts={})
@@ -220,15 +224,15 @@ describe "Sequel::IntegerMigrator" do
220
224
  ds.extend(Module.new do
221
225
  def count; 1; end
222
226
  def columns; db.columns_created end
223
- def insert(h); db.versions.merge!(h); db.sqls << insert_sql(h) end
224
- def update(h); db.versions.merge!(h); db.sqls << update_sql(h) end
227
+ def insert(h); db.versions.merge!(h); db.run insert_sql(h) end
228
+ def update(h); db.versions.merge!(h); db.run update_sql(h) end
225
229
  def fetch_rows(sql); db.execute(sql); yield(db.versions) unless db.versions.empty? end
226
230
  end)
227
231
  ds
228
232
  end
229
233
 
230
234
  def table_exists?(name)
231
- @tables_created.include?(name)
235
+ @tables_created.include?(name.to_sym)
232
236
  end
233
237
  end
234
238
  @db = dbc.new
@@ -250,7 +254,7 @@ describe "Sequel::IntegerMigrator" do
250
254
 
251
255
  specify "should add a column name if it doesn't already exist in the schema_info table" do
252
256
  @db.create_table(:schema_info){Integer :v}
253
- @db.should_receive(:alter_table).with(:schema_info)
257
+ @db.should_receive(:alter_table).with('schema_info')
254
258
  Sequel::Migrator.apply(@db, @dirname)
255
259
  end
256
260
 
@@ -273,8 +277,20 @@ describe "Sequel::IntegerMigrator" do
273
277
  @db.creates.should == [1111, 2222, 3333]
274
278
  @db.version.should == 3
275
279
  @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.should == [1, 2, 3]
280
+ end
281
+
282
+ specify "should be able to tell whether there are outstanding migrations" do
283
+ Sequel::Migrator.is_current?(@db, @dirname).should be_false
284
+ Sequel::Migrator.apply(@db, @dirname)
285
+ Sequel::Migrator.is_current?(@db, @dirname).should be_true
276
286
  end
277
287
 
288
+ specify "should have #check_current raise an exception if the migrator is not current" do
289
+ proc{Sequel::Migrator.check_current(@db, @dirname)}.should raise_error(Sequel::Migrator::NotCurrentError)
290
+ Sequel::Migrator.apply(@db, @dirname)
291
+ proc{Sequel::Migrator.check_current(@db, @dirname)}.should_not raise_error
292
+ end
293
+
278
294
  specify "should apply migrations correctly in the up direction with target" do
279
295
  Sequel::Migrator.apply(@db, @dirname, 2)
280
296
  @db.creates.should == [1111, 2222]
@@ -311,64 +327,106 @@ describe "Sequel::IntegerMigrator" do
311
327
  Sequel::Migrator.apply(@db, @dirname, 0).should == 0
312
328
  Sequel::Migrator.apply(@db, @dirname).should == 3
313
329
  end
330
+
331
+ specify "should use IntegerMigrator if IntegerMigrator.apply called, even for timestamped migration directory" do
332
+ proc{Sequel::IntegerMigrator.apply(@db, "spec/files/timestamped_migrations")}.should raise_error(Sequel::Migrator::Error)
333
+ end
334
+
335
+ specify "should not use transactions by default" do
336
+ Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
337
+ @db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
338
+ end
339
+
340
+ specify "should use transactions by default if the database supports transactional ddl" do
341
+ @db.meta_def(:supports_transactional_ddl?){true}
342
+ Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
343
+ @db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
344
+ end
345
+
346
+ specify "should respect transaction use on a per migration basis" do
347
+ @db.meta_def(:supports_transactional_ddl?){true}
348
+ Sequel::Migrator.apply(@db, "spec/files/transaction_specified_migrations")
349
+ @db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
350
+ end
351
+
352
+ specify "should force transactions if enabled in the migrator" do
353
+ Sequel::Migrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
354
+ @db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
355
+ end
356
+
357
+ specify "should not use transactions if disabled in the migrator" do
358
+ Sequel::Migrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
359
+ @db.sqls.should == ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
360
+ end
314
361
  end
315
362
 
316
363
  describe "Sequel::TimestampMigrator" do
317
364
  before do
318
- $sequel_migration_version = 0
319
- $sequel_migration_files = []
320
- @dsc = dsc = Class.new(MockDataset) do
365
+ sequel_migration_version = 0
366
+ @dsc = dsc = Class.new(Sequel::Mock::Dataset) do
367
+ self::FILES =[]
368
+ define_method(:sequel_migration_version){sequel_migration_version}
369
+ define_method(:sequel_migration_version=){|v| sequel_migration_version = v}
370
+
321
371
  def columns
372
+ super
322
373
  case opts[:from].first
323
- when :schema_info
374
+ when :schema_info, 'schema_info'
324
375
  [:version]
325
- when :schema_migrations
376
+ when :schema_migrations, 'schema_migrations'
326
377
  [:filename]
327
- when :sm
378
+ when :sm, 'sm'
328
379
  [:fn]
329
380
  end
330
381
  end
331
382
 
332
383
  def fetch_rows(sql)
384
+ super
333
385
  case opts[:from].first
334
- when :schema_info
335
- yield({:version=>$sequel_migration_version})
336
- when :schema_migrations
337
- $sequel_migration_files.sort.each{|f| yield(:filename=>f)}
338
- when :sm
339
- $sequel_migration_files.sort.each{|f| yield(:fn=>f)}
386
+ when :schema_info, 'schema_info'
387
+ yield({:version=>sequel_migration_version})
388
+ when :schema_migrations, 'schema_migrations'
389
+ self.class::FILES.sort.each{|f| yield(:filename=>f)}
390
+ when :sm, 'sm'
391
+ self.class::FILES.sort.each{|f| yield(:fn=>f)}
340
392
  end
341
393
  end
342
394
 
343
395
  def insert(h={})
396
+ super
344
397
  case opts[:from].first
345
- when :schema_info
346
- $sequel_migration_version = h.values.first
347
- when :schema_migrations, :sm
348
- $sequel_migration_files << h.values.first
398
+ when :schema_info, 'schema_info'
399
+ self.sequel_migration_version = h.values.first
400
+ when :schema_migrations, :sm, 'schema_migrations', 'sm'
401
+ self.class::FILES << h.values.first
349
402
  end
350
403
  end
351
404
 
352
405
  def update(h={})
406
+ super
353
407
  case opts[:from].first
354
- when :schema_info
355
- $sequel_migration_version = h.values.first
408
+ when :schema_info, 'schema_info'
409
+ self.sequel_migration_version = h.values.first
356
410
  end
357
411
  end
358
412
 
359
413
  def delete
414
+ super
360
415
  case opts[:from].first
361
- when :schema_migrations, :sm
362
- $sequel_migration_files.delete(opts[:where].args.last)
416
+ when :schema_migrations, :sm, 'schema_migrations', 'sm'
417
+ self.class::FILES.delete(opts[:where].args.last)
363
418
  end
364
419
  end
365
420
  end
366
- dbc = Class.new(MockDatabase) do
367
- tables = {}
421
+ dbc = Class.new(Sequel::Mock::Database) do
422
+ self::Tables = tables= {}
368
423
  define_method(:dataset){|*a| dsc.new(self, *a)}
369
- define_method(:create_table){|name, *args| tables[name] = true}
370
- define_method(:drop_table){|*names| names.each{|n| tables.delete(n)}}
371
- define_method(:table_exists?){|name| tables.has_key?(name)}
424
+ def create_table(name, *args, &block)
425
+ super
426
+ self.class::Tables[name.to_sym] = true
427
+ end
428
+ define_method(:drop_table){|*names| super(*names); names.each{|n| tables.delete(n.to_sym)}}
429
+ define_method(:table_exists?){|name| super(name); tables.has_key?(name.to_sym)}
372
430
  end
373
431
  @db = dbc.new
374
432
  @m = Sequel::Migrator
@@ -402,6 +460,22 @@ describe "Sequel::TimestampMigrator" do
402
460
  @db[:schema_migrations].select_order_map(:filename).should == %w'1273253849_create_sessions.rb'
403
461
  end
404
462
 
463
+ specify "should not be current when there are migrations to apply" do
464
+ @dir = 'spec/files/timestamped_migrations'
465
+ @m.apply(@db, @dir)
466
+ @m.is_current?(@db, @dir).should be_true
467
+ @dir = 'spec/files/interleaved_timestamped_migrations'
468
+ @m.is_current?(@db, @dir).should be_false
469
+ end
470
+
471
+ specify "should raise an exception if the migrator is not current" do
472
+ @dir = 'spec/files/timestamped_migrations'
473
+ @m.apply(@db, @dir)
474
+ proc{@m.check_current(@db, @dir)}.should_not raise_error
475
+ @dir = 'spec/files/interleaved_timestamped_migrations'
476
+ proc{@m.check_current(@db, @dir)}.should raise_error(Sequel::Migrator::NotCurrentError)
477
+ end
478
+
405
479
  specify "should apply all missing files when migrating up" do
406
480
  @dir = 'spec/files/timestamped_migrations'
407
481
  @m.apply(@db, @dir)
@@ -556,4 +630,35 @@ describe "Sequel::TimestampMigrator" do
556
630
  @m.apply(@db, @dir, 0).should == nil
557
631
  @m.apply(@db, @dir).should == nil
558
632
  end
633
+
634
+ specify "should use TimestampMigrator if TimestampMigrator.apply is called even for integer migrations directory" do
635
+ Sequel::TimestampMigrator.apply(@db, "spec/files/integer_migrations")
636
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm1111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_sessions.rb')", "CREATE TABLE sm2222 (smc2 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_nodes.rb')", "CREATE TABLE sm3333 (smc3 integer)", "INSERT INTO schema_migrations (filename) VALUES ('003_3_create_users.rb')"]
637
+ end
638
+
639
+ specify "should not use transactions by default" do
640
+ Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
641
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
642
+ end
643
+
644
+ specify "should use transactions by default if database supports transactional ddl" do
645
+ @db.meta_def(:supports_transactional_ddl?){true}
646
+ Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
647
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
648
+ end
649
+
650
+ specify "should support transaction use on a per migration basis" do
651
+ Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_specified_migrations")
652
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
653
+ end
654
+
655
+ specify "should force transactions if enabled by the migrator" do
656
+ Sequel::TimestampMigrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
657
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
658
+ end
659
+
660
+ specify "should not use transactions if disabled in the migrator" do
661
+ Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
662
+ @db.sqls.should == ["SELECT NULL FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
663
+ end
559
664
  end
@@ -12,7 +12,7 @@ describe "Sequel named_timezones extension" do
12
12
  before do
13
13
  @tz_in = TZInfo::Timezone.get('America/Los_Angeles')
14
14
  @tz_out = TZInfo::Timezone.get('America/New_York')
15
- @db = MockDatabase.new
15
+ @db = Sequel.mock
16
16
  @dt = DateTime.civil(2009,6,1,10,20,30,0)
17
17
  Sequel.application_timezone = 'America/Los_Angeles'
18
18
  Sequel.database_timezone = 'America/New_York'
@@ -35,14 +35,12 @@ describe "Sequel named_timezones extension" do
35
35
  Sequel.database_timezone.should == @tz_out
36
36
  end
37
37
 
38
- unless RUBY_VERSION == '1.8.6' && RUBY_PLATFORM =~ /win/
39
- it "should convert datetimes going into the database to named database_timezone" do
40
- ds = @db[:a]
41
- def ds.supports_timestamp_timezones?; true; end
42
- def ds.supports_timestamp_usecs?; false; end
43
- ds.insert([@dt, DateTime.civil(2009,6,1,3,20,30,-7/24.0), DateTime.civil(2009,6,1,6,20,30,-1/6.0)])
44
- @db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
45
- end
38
+ it "should convert datetimes going into the database to named database_timezone" do
39
+ ds = @db[:a]
40
+ def ds.supports_timestamp_timezones?; true; end
41
+ def ds.supports_timestamp_usecs?; false; end
42
+ ds.insert([@dt, DateTime.civil(2009,6,1,3,20,30,-7/24.0), DateTime.civil(2009,6,1,6,20,30,-1/6.0)])
43
+ @db.sqls.should == ["INSERT INTO a VALUES ('2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400', '2009-06-01 06:20:30-0400')"]
46
44
  end
47
45
 
48
46
  it "should convert datetimes coming out of the database from database_timezone to application_timezone" do
@@ -66,8 +64,28 @@ describe "Sequel named_timezones extension" do
66
64
  end
67
65
 
68
66
  it "should work with the thread_local_timezones extension" do
69
- [Thread.new{Sequel.thread_application_timezone = 'America/New_York'; sleep 0.03; Sequel.application_timezone.should == @tz_out},
70
- Thread.new{sleep 0.01; Sequel.thread_application_timezone = 'America/Los_Angeles'; sleep 0.01; Sequel.application_timezone.should == @tz_in}].each{|x| x.join}
67
+ q, q1, q2 = Queue.new, Queue.new, Queue.new
68
+ tz1, tz2 = nil, nil
69
+ t1 = Thread.new do
70
+ Sequel.thread_application_timezone = 'America/New_York'
71
+ q2.push nil
72
+ q.pop
73
+ tz1 = Sequel.application_timezone
74
+ end
75
+ t2 = Thread.new do
76
+ Sequel.thread_application_timezone = 'America/Los_Angeles'
77
+ q2.push nil
78
+ q1.pop
79
+ tz2 = Sequel.application_timezone
80
+ end
81
+ q2.pop
82
+ q2.pop
83
+ q.push nil
84
+ q1.push nil
85
+ t1.join
86
+ t2.join
87
+ tz1.should == @tz_out
88
+ tz2.should == @tz_in
71
89
  end
72
90
  end
73
91
  end