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,20 +1,20 @@
1
1
  module Sequel
2
2
  # The Schema module holds the schema generators.
3
3
  module Schema
4
- # Schema::Generator is an internal class that the user is not expected
4
+ # Schema::CreateTableGenerator is an internal class that the user is not expected
5
5
  # to instantiate directly. Instances are created by Database#create_table.
6
6
  # It is used to specify table creation parameters. It takes a Database
7
7
  # object and a block of column/index/constraint specifications, and
8
8
  # gives the Database a table description, which the database uses to
9
9
  # create a table.
10
10
  #
11
- # Schema::Generator has some methods but also includes method_missing,
11
+ # Schema::CreateTableGenerator has some methods but also includes method_missing,
12
12
  # allowing users to specify column type as a method instead of using
13
13
  # the column method, which makes for a nicer DSL.
14
14
  #
15
15
  # For more information on Sequel's support for schema modification, see
16
- # the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
17
- class Generator
16
+ # the {"Schema Modification" guide}[link:files/doc/schema_modification_rdoc.html].
17
+ class CreateTableGenerator
18
18
  # Classes specifying generic types that Sequel will convert to database-specific types.
19
19
  GENERIC_TYPES=[String, Integer, Fixnum, Bignum, Float, Numeric, BigDecimal,
20
20
  Date, DateTime, Time, File, TrueClass, FalseClass]
@@ -83,30 +83,30 @@ module Sequel
83
83
  # reference table will use for its foreign key a value that does not
84
84
  # exists(yet) on referenced table. Basically it adds
85
85
  # DEFERRABLE INITIALLY DEFERRED on key creation.
86
- # :index :: Create an index on this column.
86
+ # :index :: Create an index on this column. If given a hash, use the hash as the
87
+ # options for the index.
87
88
  # :key :: For foreign key columns, the column in the associated table
88
89
  # that this column references. Unnecessary if this column
89
- # references the primary key of the associated table.
90
+ # references the primary key of the associated table, except if you are
91
+ # using MySQL.
90
92
  # :null :: Mark the column as allowing NULL values (if true),
91
93
  # or not allowing NULL values (if false). If unspecified, will default
92
94
  # to whatever the database default is.
93
95
  # :on_delete :: Specify the behavior of this column when being deleted
94
- # (:restrict, cascade, :set_null, :set_default, :no_action).
96
+ # (:restrict, :cascade, :set_null, :set_default, :no_action).
95
97
  # :on_update :: Specify the behavior of this column when being updated
96
- # (:restrict, cascade, :set_null, :set_default, :no_action).
98
+ # (:restrict, :cascade, :set_null, :set_default, :no_action).
97
99
  # :primary_key :: Make the column as a single primary key column. This should only
98
100
  # be used if you have a single, nonautoincrementing primary key column.
99
- # :size :: The size of the column, generally used with string
100
- # columns to specify the maximum number of characters the column will hold.
101
- # An array of two integers can be provided to set the size and the
102
- # precision, respectively, of decimal columns.
101
+ # :type :: Overrides the type given as the argument. Generally not used by column
102
+ # itself, but can be passed as an option to other methods that call column.
103
103
  # :unique :: Mark the column as unique, generally has the same effect as
104
104
  # creating a unique index on the column.
105
- # :unsigned :: Make the column type unsigned, only useful for integer
106
- # columns.
107
105
  def column(name, type, opts = {})
108
106
  columns << {:name => name, :type => type}.merge(opts)
109
- index(name) if opts[:index]
107
+ if index_opts = opts[:index]
108
+ index(name, index_opts.is_a?(Hash) ? index_opts : {})
109
+ end
110
110
  end
111
111
 
112
112
  # Adds a named constraint (or unnamed if name is nil) to the DDL,
@@ -124,6 +124,14 @@ module Sequel
124
124
  # foreign_key(:artist_id) # artist_id INTEGER
125
125
  # foreign_key(:artist_id, :artists) # artist_id INTEGER REFERENCES artists
126
126
  # foreign_key(:artist_id, :artists, :key=>:id) # artist_id INTEGER REFERENCES artists(id)
127
+ # foreign_key(:artist_id, :artists, :type=>String) # artist_id varchar(255) REFERENCES artists(id)
128
+ #
129
+ # If you want a foreign key constraint without adding a column (usually because it is a
130
+ # composite foreign key), you can provide an array of columns as the first argument, and
131
+ # you can provide the :name option to name the constraint:
132
+ #
133
+ # foreign_key([:artist_name, :artist_location], :artists, :name=>:artist_fk)
134
+ # # ADD CONSTRAINT artist_fk FOREIGN KEY (artist_name, artist_location) REFERENCES artists
127
135
  def foreign_key(name, table=nil, opts = {})
128
136
  opts = case table
129
137
  when Hash
@@ -140,6 +148,12 @@ module Sequel
140
148
  end
141
149
 
142
150
  # Add a full text index on the given columns to the DDL.
151
+ #
152
+ # PostgreSQL specific options:
153
+ # :language :: Set a language to use for the index (default: simple).
154
+ #
155
+ # Microsoft SQL Server specific options:
156
+ # :key_index :: The KEY INDEX to use for the full text index.
143
157
  def full_text_index(columns, opts = {})
144
158
  index(columns, opts.merge(:type => :full_text))
145
159
  end
@@ -150,12 +164,26 @@ module Sequel
150
164
  end
151
165
 
152
166
  # Add an index on the given column(s) with the given options to the DDL.
153
- # The available options are:
167
+ # General options:
154
168
  #
169
+ # :name :: The name to use for the index. If not given, a default name
170
+ # based on the table and columns is used.
155
171
  # :type :: The type of index to use (only supported by some databases)
156
172
  # :unique :: Make the index unique, so duplicate values are not allowed.
157
173
  # :where :: Create a partial index (only supported by some databases)
158
174
  #
175
+ # PostgreSQL specific options:
176
+ #
177
+ # :concurrently :: Create the index concurrently, so it doesn't block
178
+ # operations on the table while the index is being
179
+ # built.
180
+ # :op_class :: Use a specific operator class in the index.
181
+ #
182
+ # Microsoft SQL Server specific options:
183
+ #
184
+ # :include :: Include additional column values in the index, without
185
+ # actually indexing on those values.
186
+ #
159
187
  # index :name
160
188
  # # CREATE INDEX table_name_index ON table (name)
161
189
  #
@@ -230,6 +258,9 @@ module Sequel
230
258
 
231
259
  add_type_method(*GENERIC_TYPES)
232
260
  end
261
+
262
+ # Alias of CreateTableGenerator for backwards compatibility.
263
+ Generator = CreateTableGenerator
233
264
 
234
265
  # Schema::AlterTableGenerator is an internal class that the user is not expected
235
266
  # to instantiate directly. Instances are created by Database#alter_table.
@@ -239,7 +270,7 @@ module Sequel
239
270
  # alter a table's description.
240
271
  #
241
272
  # For more information on Sequel's support for schema modification, see
242
- # the {"Migrations and Schema Modification" guide}[link:files/doc/migration_rdoc.html].
273
+ # the {"Schema Modification" guide}[link:files/doc/schema_modification_rdoc.html].
243
274
  class AlterTableGenerator
244
275
  # An array of DDL operations to perform
245
276
  attr_reader :operations
@@ -253,7 +284,7 @@ module Sequel
253
284
  end
254
285
 
255
286
  # Add a column with the given name, type, and opts to the DDL for the table.
256
- # See Generator#column for the available options.
287
+ # See CreateTableGenerator#column for the available options.
257
288
  #
258
289
  # add_column(:name, String) # ADD COLUMN name varchar(255)
259
290
  def add_column(name, type, opts = {})
@@ -261,9 +292,9 @@ module Sequel
261
292
  end
262
293
 
263
294
  # Add a constraint with the given name and args to the DDL for the table.
264
- # See Generator#constraint.
295
+ # See CreateTableGenerator#constraint.
265
296
  #
266
- # add_constraint(:valid_name, :name.like('A%'))
297
+ # add_constraint(:valid_name, Sequel.like(:name, 'A%'))
267
298
  # # ADD CONSTRAINT valid_name CHECK (name LIKE 'A%')
268
299
  def add_constraint(name, *args, &block)
269
300
  @operations << {:op => :add_constraint, :name => name, :type => :check, :check => block || args}
@@ -278,37 +309,47 @@ module Sequel
278
309
  end
279
310
 
280
311
  # Add a foreign key with the given name and referencing the given table
281
- # to the DDL for the table. See Generator#column for the available options.
312
+ # to the DDL for the table. See CreateTableGenerator#column for the available options.
282
313
  #
283
314
  # You can also pass an array of column names for creating composite foreign
284
- # keys. In this case, it will assume the columns exists and will only add
285
- # the constraint.
315
+ # keys. In this case, it will assume the columns exist and will only add
316
+ # the constraint. You can provide a :name option to name the constraint.
286
317
  #
287
318
  # NOTE: If you need to add a foreign key constraint to a single existing column
288
319
  # use the composite key syntax even if it is only one column.
289
320
  #
290
321
  # add_foreign_key(:artist_id, :table) # ADD COLUMN artist_id integer REFERENCES table
291
322
  # add_foreign_key([:name], :table) # ADD FOREIGN KEY (name) REFERENCES table
323
+ #
324
+ # PostgreSQL specific options:
325
+ #
326
+ # :not_valid :: Set to true to add the constraint with the NOT VALID syntax.
327
+ # This makes it so that future inserts must respect referential
328
+ # integrity, but allows the constraint to be added even if existing
329
+ # column values reference rows that do not exist. After all the
330
+ # existing data has been cleaned up, validate_constraint can be used
331
+ # to mark the constraint as valid. Note that this option only makes
332
+ # sense when using an array of columns.
292
333
  def add_foreign_key(name, table, opts = {})
293
334
  return add_composite_foreign_key(name, table, opts) if name.is_a?(Array)
294
335
  add_column(name, Integer, {:table=>table}.merge(opts))
295
336
  end
296
337
 
297
338
  # Add a full text index on the given columns to the DDL for the table.
298
- # See Generator#index for available options.
339
+ # See CreateTableGenerator#index for available options.
299
340
  def add_full_text_index(columns, opts = {})
300
341
  add_index(columns, {:type=>:full_text}.merge(opts))
301
342
  end
302
343
 
303
344
  # Add an index on the given columns to the DDL for the table. See
304
- # Generator#index for available options.
345
+ # CreateTableGenerator#index for available options.
305
346
  #
306
347
  # add_index(:artist_id) # CREATE INDEX table_artist_id_index ON table (artist_id)
307
348
  def add_index(columns, opts = {})
308
349
  @operations << {:op => :add_index, :columns => Array(columns)}.merge(opts)
309
350
  end
310
351
 
311
- # Add a primary key to the DDL for the table. See Generator#column
352
+ # Add a primary key to the DDL for the table. See CreateTableGenerator#column
312
353
  # for the available options. Like +add_foreign_key+, if you specify
313
354
  # the column name as an array, it just creates a constraint:
314
355
  #
@@ -321,7 +362,7 @@ module Sequel
321
362
  end
322
363
 
323
364
  # Add a spatial index on the given columns to the DDL for the table.
324
- # See Generator#index for available options.
365
+ # See CreateTableGenerator#index for available options.
325
366
  def add_spatial_index(columns, opts = {})
326
367
  add_index(columns, {:type=>:spatial}.merge(opts))
327
368
  end
@@ -329,18 +370,33 @@ module Sequel
329
370
  # Remove a column from the DDL for the table.
330
371
  #
331
372
  # drop_column(:artist_id) # DROP COLUMN artist_id
332
- def drop_column(name)
333
- @operations << {:op => :drop_column, :name => name}
373
+ # drop_column(:artist_id, :cascade=>true) # DROP COLUMN artist_id CASCADE
374
+ def drop_column(name, opts={})
375
+ @operations << {:op => :drop_column, :name => name}.merge(opts)
334
376
  end
335
377
 
336
- # Remove a constraint from the DDL for the table.
378
+ # Remove a constraint from the DDL for the table. MySQL/SQLite specific options:
379
+ #
380
+ # :type :: Set the type of constraint to drop, either :primary_key, :foreign_key,
381
+ # or :unique.
337
382
  #
338
383
  # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
339
- def drop_constraint(name)
340
- @operations << {:op => :drop_constraint, :name => name}
384
+ # drop_constraint(:unique_name, :cascade=>true) # DROP CONSTRAINT unique_name CASCADE
385
+ def drop_constraint(name, opts={})
386
+ @operations << {:op => :drop_constraint, :name => name}.merge(opts)
341
387
  end
342
388
 
343
- # Remove an index from the DDL for the table.
389
+ # Remove an index from the DDL for the table. General options:
390
+ #
391
+ # :name :: The name of the index to drop. If not given, uses the same name
392
+ # that would be used by add_index with the same columns.
393
+ #
394
+ # PostgreSQL specific options:
395
+ #
396
+ # :cascade :: Cascade the index drop to dependent objects.
397
+ # :concurrently :: Drop the index using CONCURRENTLY, which doesn't block
398
+ # operations on the table. Supported in PostgreSQL 9.2+.
399
+ # :if_exists :: Only drop the index if it already exists.
344
400
  #
345
401
  # drop_index(:artist_id) # DROP INDEX table_artist_id_index
346
402
  # drop_index([:a, :b]) # DROP INDEX table_a_b_index
@@ -366,17 +422,28 @@ module Sequel
366
422
  # Modify a column's type in the DDL for the table.
367
423
  #
368
424
  # set_column_type(:artist_name, 'char(10)') # ALTER COLUMN artist_name TYPE char(10)
425
+ #
426
+ # PostgreSQL specific options:
427
+ #
428
+ # :using :: Add a USING clause that specifies how to convert existing values to new values.
369
429
  def set_column_type(name, type, opts={})
370
430
  @operations << {:op => :set_column_type, :name => name, :type => type}.merge(opts)
371
431
  end
372
432
 
373
- # Modify a column's NOT NULL constraint.
433
+ # Set a given column as allowing NULL values.
374
434
  #
375
- # set_column_allow_null(:artist_name, false) # ALTER COLUMN artist_name SET NOT NULL
376
- def set_column_allow_null(name, allow_null)
435
+ # set_column_allow_null(:artist_name) # ALTER COLUMN artist_name DROP NOT NULL
436
+ def set_column_allow_null(name, allow_null=true)
377
437
  @operations << {:op => :set_column_null, :name => name, :null => allow_null}
378
438
  end
379
439
 
440
+ # Set a given column as not allowing NULL values.
441
+ #
442
+ # set_column_not_null(:artist_name) # ALTER COLUMN artist_name SET NOT NULL
443
+ def set_column_not_null(name)
444
+ set_column_allow_null(name, false)
445
+ end
446
+
380
447
  private
381
448
 
382
449
  # Add a composite primary key constraint