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
@@ -46,6 +46,13 @@ unless the first argument is a hash. So the following statements are equivalent
46
46
  DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
47
47
  DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
48
48
 
49
+ Note that using an adapter method forces the use of the specified adapter, not a database type, even
50
+ though some adapters have the same name as the database type. So if you
51
+ want to connect to SQLite, for example, you can do so using the sqlite, do, dbi, jdbc, odbc, and swift adapters.
52
+ If you want to connect to SQLite on JRuby using the jdbc adapter, you should not use <tt>Sequel.sqlite</tt>
53
+ for example, as that uses the C-based sqlite3 gem. Instead, the <tt>Sequel.jdbc</tt> would be appropriate (though
54
+ as mentioned below, using <tt>Sequel.connect</tt> is recommended instead of <tt>Sequel.jdbc</tt>).
55
+
49
56
  == Passing a block to either method
50
57
 
51
58
  Both the Sequel.connect method and the specialized adapter methods take a block. If you
@@ -59,24 +66,24 @@ For example:
59
66
 
60
67
  These options are shared by all adapters unless otherwise noted.
61
68
 
62
- * :adapter - The adapter to use
63
- * :database - The name of the database to which to connect
64
- * :default_schema - The database schema to use by default.
65
- * :host - The hostname of the database server to which to connect
66
- * :logger - An array of SQL loggers to log to
67
- * :loggers - An array of SQL loggers to log to
68
- * :password - The password for the user account
69
- * :servers - A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
70
- * :single_threaded - Whether to use a single-threaded (non-thread safe) connection pool
71
- * :test - Whether to test that a valid database connection can be made (false by default)
72
- * :user - The user account name to use logging in
69
+ :adapter :: The adapter to use
70
+ :database :: The name of the database to which to connect
71
+ :default_schema :: The database schema to use in schema_modification and introspection.
72
+ :host :: The hostname of the database server to which to connect
73
+ :logger :: An array of SQL loggers to log to
74
+ :loggers :: An array of SQL loggers to log to
75
+ :password :: The password for the user account
76
+ :servers :: A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
77
+ :single_threaded :: Whether to use a single-threaded (non-thread safe) connection pool
78
+ :test :: Whether to test that a valid database connection can be made (false by default)
79
+ :user :: The user account name to use logging in
73
80
 
74
81
  The following options can be specified and are passed to the the database's internal connection pool.
75
82
 
76
- * :after_connect - A proc called after a new connection is made, with the connection object (default: nil)
77
- * :max_connections - The maximum size of the connection pool (default: 4 connections on most databases)
78
- * :pool_sleep_time - The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
79
- * :pool_timeout - The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
83
+ :after_connect :: A proc called after a new connection is made, with the connection object (default: nil)
84
+ :max_connections :: The maximum size of the connection pool (default: 4 connections on most databases)
85
+ :pool_sleep_time :: The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
86
+ :pool_timeout :: The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
80
87
 
81
88
  == Adapter specific connection options
82
89
 
@@ -131,8 +138,8 @@ Amalgalite is an ruby extension that provides self contained access to SQLite,
131
138
  so you don't need to install SQLite separately. As amalgalite is a file backed
132
139
  database, the :host, :user, and :password options are not used.
133
140
 
134
- * :database - The name of the database file
135
- * :timeout - The busy timeout period given in milliseconds
141
+ :database :: The name of the database file
142
+ :timeout :: The busy timeout period given in milliseconds
136
143
 
137
144
  Without a database argument, assumes a memory database, so you can do:
138
145
 
@@ -145,17 +152,15 @@ the sqlite section below for details.
145
152
 
146
153
  Requires: db2/db2cli
147
154
 
148
- I'm not even sure exactly how this works, or if it works at all (I've never heard from
149
- anyone who attempted to use it). It uses the SQL_HANDLE_DBC constant to
150
- get a handle, and respects the :database, :user, and :password options. It doesn't
151
- appear to respect the :host or :port options.
155
+ This is the older DB2 adapter. It's recommended you try the ibmdb adapter
156
+ instead for new DB2 work, as it is better supported.
152
157
 
153
158
  === dbi
154
159
 
155
160
  Allows access to a multitude of databases via ruby-dbi. Additional options:
156
161
 
157
- * :db_type - Specifying 'mssql' allows Microsoft SQL Server specific syntax to
158
- be used. Otherwise has no effect.
162
+ :db_type :: Specifying 'mssql' allows Microsoft SQL Server specific syntax to
163
+ be used. Otherwise has no effect.
159
164
 
160
165
  DBI connection strings are a preprocessed a bit, and are specified with a dbi-
161
166
  in front of the protocol. Examples:
@@ -201,6 +206,13 @@ Requires: fb (using code at http://github.com/wishdev/fb)
201
206
 
202
207
  Does not support the :port option.
203
208
 
209
+ === ibmdb
210
+
211
+ requires 'ibm_db'
212
+
213
+ This connects to DB2 using IBM_DB. This is the recommended adapter if you are
214
+ using a C-based ruby to connect to DB2.
215
+
204
216
  === informix
205
217
 
206
218
  Does not support the :host or :port options. Depending on the configuration of your server
@@ -221,7 +233,7 @@ Requires: java
221
233
  Houses Sequel's JDBC support when running on JRuby.
222
234
  Support for individual database types is done using sub adapters.
223
235
  There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
224
- Oracle, MSSQL, JTDS, and AS400. All except Oracle, MSSQL, and AS400 can load the
236
+ Oracle, MSSQL, JTDS, AS400, and DB2. All except Oracle, MSSQL, AS400, and DB2 can load the
225
237
  jdbc-* gem, for those you need to have the .jar in your CLASSPATH
226
238
  or load the Java class manually before calling Sequel.connect.
227
239
 
@@ -246,37 +258,54 @@ Example connection strings:
246
258
  jdbc:postgresql://localhost/database?user=username
247
259
  jdbc:mysql://localhost/test?user=root&password=root
248
260
  jdbc:h2:mem:
261
+ jdbc:hsqldb:mem:mymemdb
262
+ jdbc:derby:memory:myDb;create=true
249
263
  jdbc:sqlserver://localhost;database=sequel_test;integratedSecurity=true
250
264
  jdbc:jtds:sqlserver://localhost/sequel_test;user=sequel_test;password=sequel_test
251
-
265
+ jdbc:oracle:thin:user/password@localhost:1521:database
266
+ jdbc:db2://localhost:3700/database:user=user;password=password;
267
+ jdbc:firebirdsql:localhost/3050:/path/to/database.fdb
268
+ jdbc:jdbcprogress:T:hostname:port:database
269
+
252
270
  You can also use JNDI connection strings:
253
271
 
254
272
  jdbc:jndi:java:comp/env/jndi_resource_name
255
273
 
256
274
  The following additional options are supported:
257
275
 
258
- * :convert_types - If set to false, does not attempt to convert some Java types to ruby types.
259
- Setting to false roughly doubles performance when selecting large numbers of rows.
260
- Note that you can't provide this option inside the connection string (as that is passed
261
- directly to JDBC), you have to pass it as a separate option.
276
+ :convert_types :: If set to false, does not attempt to convert some Java types to ruby types.
277
+ Setting to false roughly doubles performance when selecting large numbers of rows.
278
+ Note that you can't provide this option inside the connection string (as that is passed
279
+ directly to JDBC), you have to pass it as a separate option.
280
+ :login_timeout :: Set the login timeout on the JDBC connection (in seconds).
262
281
 
263
282
  === mysql
264
283
 
284
+ Requires: mysqlplus (or mysql if mysqlplus is not available)
285
+
265
286
  The MySQL adapter does not support the pure-ruby MySQL adapter that used to ship with
266
287
  ActiveRecord, it requires the native adapter.
267
288
 
268
289
  The following additional options are supported:
269
290
 
270
- * :auto_is_null - If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
271
- * :charset - Same as :encoding, :encoding takes precedence.
272
- * :compress - Whether to compress data sent/received via the socket connection.
273
- * :config_default_group - The default group to read from the in the MySQL config file.
274
- * :config_local_infile - If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
275
- * :encoding - Specify the encoding/character set to use for the connection.
276
- * :socket - Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
277
- * :timeout - Sets the wait_timeout for the connection, defaults to 1 month.
278
- * :read_timeout - Set the timeout in seconds for reading back results to a query.
279
- * :connect_timeout - Set the timeout in seconds before a connection attempt is abandoned.
291
+ :auto_is_null :: If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
292
+ :charset :: Same as :encoding, :encoding takes precedence.
293
+ :compress :: Whether to compress data sent/received via the socket connection.
294
+ :config_default_group :: The default group to read from the in the MySQL config file.
295
+ :config_local_infile :: If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
296
+ :encoding :: Specify the encoding/character set to use for the connection.
297
+ :socket :: Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
298
+ :sql_mode :: Set the sql_mode(s) for a given connection. Can be single symbol or string,
299
+ or an array of symbols or strings (e.g. <tt>:sql_mode=>[:no_zero_date, :pipes_as_concat]</tt>).
300
+ :timeout :: Sets the wait_timeout for the connection, defaults to 1 month.
301
+ :read_timeout :: Set the timeout in seconds for reading back results to a query.
302
+ :connect_timeout :: Set the timeout in seconds before a connection attempt is abandoned.
303
+
304
+ === mysql2
305
+
306
+ This is a newer MySQL adapter that does typecasting in C, so it is often faster than the
307
+ mysql adapter. Supports the same additional options as the mysql adapter, except for :compress, and uses
308
+ :timeout instead of :read_timeout and :connect_timeout.
280
309
 
281
310
  === odbc
282
311
 
@@ -287,8 +316,8 @@ The :database option given ODBC database should be the DSN (Descriptive Service
287
316
 
288
317
  The :host and :port options are not respected. The following additional options are supported:
289
318
 
290
- * :db_type - Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
291
- * :driver - The name of the ODBC driver to utilize.
319
+ :db_type :: Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
320
+ :driver :: The name of the ODBC driver to utilize.
292
321
 
293
322
  === openbase
294
323
 
@@ -300,7 +329,11 @@ Requires: oci8
300
329
 
301
330
  The following additional options are supported:
302
331
 
303
- * :privilege - The Oracle privilege level.
332
+ :autosequence :: Set to true to use Sequel's conventions to guess the sequence to use for datasets. False
333
+ by default.
334
+ :prefetch_rows :: The number of rows to prefetch. Defaults to 1, a larger number can be specified
335
+ and will improve performance when retrieving a large number of rows.
336
+ :privilege :: The Oracle privilege level.
304
337
 
305
338
  === postgres
306
339
 
@@ -308,14 +341,23 @@ Requires: pg (or postgres if pg is not available)
308
341
 
309
342
  The Sequel postgres adapter works with the pg, postgres, and postgres-pr ruby libraries.
310
343
  The pg library is the best supported, as it supports real bound variables and prepared statements.
344
+ If the pg library is being used, Sequel will also attempt to load the sequel_pg library, which is
345
+ a C extension that optimizes performance when Sequel is used with pg. All users of Sequel who
346
+ use pg are encouraged to install sequel_pg.
311
347
 
312
348
  The following additional options are supported:
313
349
 
314
- * :charset - Same as :encoding, :encoding takes precedence
315
- * :encoding - Set the client_encoding to the given string
350
+ :charset :: Same as :encoding, :encoding takes precedence
351
+ :encoding :: Set the client_encoding to the given string
352
+ :connect_timeout :: Set the number of seconds to wait for a connection (default 20, only respected
353
+ if using the pg library).
354
+ :sslmode :: Set to 'disable', 'allow', 'prefer', 'require' to choose how to treat SSL (only
355
+ respected if using the pg library)
316
356
 
317
357
  === sqlite
318
358
 
359
+ Requires: sqlite3
360
+
319
361
  As SQLite is a file-based database, the :host and :port options are ignored, and
320
362
  the :database option should be a path to the file.
321
363
 
@@ -337,7 +379,7 @@ Examples:
337
379
 
338
380
  The following additional options are supported:
339
381
 
340
- * :timeout - the busy timeout to use in milliseconds (default: 5000).
382
+ :timeout :: the busy timeout to use in milliseconds (default: 5000).
341
383
 
342
384
  === swift
343
385
 
@@ -353,16 +395,21 @@ Examples:
353
395
 
354
396
  === tinytds
355
397
 
398
+ Requires: tiny_tds
399
+
356
400
  Because the underscore is not a valid character in a URI schema, the adapter
357
401
  is named tinytds instead of tiny_tds. The connection options are passed directly
358
- to tiny_tds, except that the tiny_tds :dataserver and :username options are set to
359
- the Sequel :host and :user options. The :host option should be an entry in the
360
- freetds.conf file, it's not currently possible to a host not present in the
361
- freetds.conf file. Some options that you may want to set are
362
- :login_timeout, :timeout, :appname, and :encoding, see the tiny_tds README for details.
402
+ to tiny_tds, except that the tiny_tds :username option is set to
403
+ the Sequel :user option. If you want to use an entry in the freetds.conf file, you
404
+ should specify the :dataserver option with that name as the value. Some other
405
+ options that you may want to set are :login_timeout, :timeout, :tds_version, :azure,
406
+ :appname, and :encoding, see the tiny_tds README for details.
407
+
363
408
  For highest performance, you should disable any identifier output method when
364
409
  using the tinytds adapter, which probably means disabling any identifier input method
365
410
  as well. The default for Microsoft SQL Server is to :downcase identifiers on output
366
411
  and :upcase them on input, so the highest performance will require changing the setting
367
412
  from the default.
368
413
 
414
+ The Sequel tinytds adapter requires tiny_tds >= 0.4.5, and if you are using FreeTDS
415
+ 0.91, you must at least be using 0.91rc2 (0.91rc1 does not work).
@@ -3,15 +3,22 @@
3
3
  Sequel has support for prepared statements and bound variables. No matter which
4
4
  database you are using, the Sequel prepared statement/bound variable API remains
5
5
  the same. There is native support for prepared statements/bound variables on
6
- the following databases:
6
+ the following adapters:
7
7
 
8
- * PostgreSQL (using the pg driver, requires type specifiers)
9
- * MySQL (prepared statements only, as the ruby mysql driver doesn't support
10
- bound variables)
11
- * SQLite
12
- * JDBC
8
+ * ibmdb (prepared statements only)
9
+ * jdbc
10
+ * mysql (prepared statements only)
11
+ * mysql2 (prepared statements only)
12
+ * oracle (requires type specifiers for nil/NULL values)
13
+ * postgres (when using the pg driver, may require type specifiers)
14
+ * sqlite
15
+ * tinytds
13
16
 
14
- Support on other databases is emulated via string interpolation.
17
+ Support on other adapters is emulated via string interpolation.
18
+
19
+ You can use the prepared_statements model plugin to automatically use prepared
20
+ statements for some common model actions such as saving or deleting a model
21
+ instance, or looking up a model based on a primary key.
15
22
 
16
23
  == Placeholders
17
24
 
@@ -74,20 +81,19 @@ and update queries, the hash to insert/update is passed to +prepare+:
74
81
 
75
82
  If you are using the ruby-postgres or postgres-pr driver, PostgreSQL uses the
76
83
  default emulated support. If you are using ruby-pg, there is native support,
77
- but it requires type specifiers most of the time. This is easy if you have
78
- direct control over the SQL string, but since Sequel abstracts that, the types
79
- have to be specified another way. This is done by adding a __* suffix to the
80
- placeholder symbol (e.g. :$name__text, which will be compiled to "$1::text"
81
- in the SQL). Prepared statements are always server side.
84
+ but it may require type specifiers on some old versions (generally not anymore).
85
+ You can add a __* suffix to the placeholder symbol to specify a type, which
86
+ casts to that type in the SQL (e.g. :$name__text, which will be compiled to
87
+ "$1::text" in the SQL). Prepared statements are always server side.
82
88
 
83
89
  === SQLite
84
90
 
85
91
  SQLite supports both prepared statements and bound variables. Prepared
86
92
  statements are cached per connection.
87
93
 
88
- === MySQL
94
+ === MySQL/Mysql2
89
95
 
90
- The MySQL ruby driver does not support bound variables, so the the bound
96
+ The MySQL/Mysql2 ruby drivers do not support bound variables, so the bound
91
97
  variable methods fall back to string interpolation. It uses server side
92
98
  prepared statements.
93
99
 
@@ -99,6 +105,26 @@ over JDBC, you can add the prepareThreshold=N parameter to the connection
99
105
  string, which will use a server side prepared statement after N calls to
100
106
  the prepared statement.
101
107
 
108
+ === TinyTDS
109
+
110
+ Uses the sp_executesql stored procedure with bound variables, since
111
+ Microsoft SQL Server doesn't support true prepared statements.
112
+
113
+ === IBM_DB
114
+
115
+ DB2 supports both prepared statements and bound variables. Prepared
116
+ statement objects are cached per connection.
117
+
118
+ === Oracle
119
+
120
+ Oracle supports both prepared statements and bound variables. Prepared
121
+ statements (OCI8::Cursor objects) are cached per connection. If you
122
+ ever plan to use a nil/NULL value as a bound variable/prepared statement
123
+ value, you must specify the type in the placeholder using a __* suffix.
124
+ You can use any of the schema types that Sequel supports, such as
125
+ :$name__string or :$num__integer. Using blobs as bound variables is
126
+ not currently supported.
127
+
102
128
  === All Others
103
129
 
104
130
  Support is emulated using interpolation.
data/doc/querying.rdoc CHANGED
@@ -167,17 +167,26 @@ It's also common to want to order such a map, so Sequel provides a
167
167
  Sequel makes it easy to take an SQL query and return it as a ruby hash,
168
168
  using the +to_hash+ method:
169
169
 
170
- artist_names = Artist.to_hash(:name, :id)
170
+ artist_names = Artist.to_hash(:id, :name)
171
171
  # SELECT * FROM artists
172
- => {"YJM"=>1, "AS"=>2}
172
+ => {1=>"YJM", 2=>"AS"}
173
173
 
174
174
  As you can see, the +to_hash+ method uses the first symbol as the key
175
175
  and the second symbol as the value. So if you swap the two arguments the hash
176
176
  will have its keys and values transposed:
177
177
 
178
- artist_names = Artist.to_hash(:id, :name)
178
+ artist_names = Artist.to_hash(:name, :id)
179
179
  # SELECT * FROM artists
180
- => {1=>"YJM", 2=>"AS"}
180
+ => {"YJM"=>1, "AS"=>2}
181
+
182
+ Now what if you have multiple values for the same key? By default, +to_hash+
183
+ will just have the last matching value. If you care about all matching values,
184
+ use +to_hash_groups+, which makes the values of the array an array of matching
185
+ values, in the order they were received:
186
+
187
+ artist_names = Artist.to_hash_groups(:name, :id)
188
+ # SELECT * FROM artists
189
+ => {"YJM"=>[1, 10, ...], "AS"=>[2, 20, ...]}
181
190
 
182
191
  If you only provide one argument to +to_hash+, it uses the entire hash
183
192
  or model object as the value:
@@ -186,6 +195,12 @@ or model object as the value:
186
195
  # SELECT * FROM artists
187
196
  => {"YJM"=>{:id=>1, :name=>"YJM"}, "AS"=>{:id=>2, :name=>"AS"}}
188
197
 
198
+ and +to_hash_groups+ works similarly:
199
+
200
+ artist_names = DB[:artists].to_hash_groups(:name)
201
+ # SELECT * FROM artists
202
+ => {"YJM"=>[{:id=>1, :name=>"YJM"}, {:id=>10, :name=>"YJM"}], ...}
203
+
189
204
  Model datasets have a +to_hash+ method that can be called without any
190
205
  arguments, in which case it will use the primary key as the key and
191
206
  the model object as the value. This can be used to easily create an
@@ -196,6 +211,9 @@ identity map:
196
211
  => {1=>#<Artist @values={:id=>1, :name=>"YGM"}>,
197
212
  2=>#<Artist @values={:id=>2, :name=>"AS"}>}
198
213
 
214
+ There is no equivalent handling to +to_hash_groups+, since there would
215
+ only be one matching record, as the primary key must be unique.
216
+
199
217
  Note that +to_hash+ never modifies the columns selected. However, just
200
218
  like Sequel has a +select_map+ method to modify the columns selected and
201
219
  return an array, Sequel also has a +select_hash+ method to modify the
@@ -205,6 +223,12 @@ columns selected and return a hash:
205
223
  # SELECT name, id FROM artists
206
224
  => {"YJM"=>1, "AS"=>2}
207
225
 
226
+ Likewise, +select_hash_groups+ also exists:
227
+
228
+ artist_names = Artist.select_hash_groups(:name, :id)
229
+ # SELECT name, id FROM artists
230
+ => {"YJM"=>[1, 10, ...], "AS"=>[2, 20, ...]}
231
+
208
232
  == Modifying datasets
209
233
 
210
234
  Note that the retrieval methods discussed above just return
data/doc/reflection.rdoc CHANGED
@@ -4,9 +4,9 @@ Sequel supports reflection information in multiple ways.
4
4
 
5
5
  == Adapter in Use
6
6
 
7
- You can get the adapter in use using Database.adapter_scheme. As this is a class method, you generally need to do DB.class.adapter_scheme:
7
+ You can get the adapter in use using Database#adapter_scheme:
8
8
 
9
- DB.class.adapter_scheme # e.g. :postgres, :jdbc, :odbc
9
+ DB.adapter_scheme # e.g. :postgres, :jdbc, :odbc
10
10
 
11
11
  == Database Connected To
12
12
 
@@ -16,18 +16,44 @@ In some cases, the adapter scheme will be the same as the database to which you
16
16
 
17
17
  == Tables in the Database
18
18
 
19
- On many database types/adapters, Database#tables exists and gives an array of table name symbols:
19
+ Database#tables gives an array of table name symbols:
20
20
 
21
21
  DB.tables # [:table1, :table2, :table3, ...]
22
22
 
23
+ == Views in the Database
24
+
25
+ Database#views and gives an array of view name symbols:
26
+
27
+ DB.views # [:view1, :view2, :view3, ...]
28
+
23
29
  == Indexes on a table
24
30
 
25
- On a few database types/adapters, Database#indexes takes a table name gives a hash of index information. Keys are index names, values are subhashes with the keys :columns and :unique :
31
+ Database#indexes takes a table name gives a hash of index information. Keys are index names, values are subhashes with the keys :columns and :unique :
26
32
 
27
33
  DB.indexes(:table1) # {:index1=>{:columns=>[:column1], :unique=>false}, :index2=>{:columns=>[:column2, :column3], :unique=>true}}
28
34
 
29
35
  Index information generally does not include partial indexes, functional indexes, or indexes on the primary key of the table.
30
36
 
37
+ == Foreign Key Information for a Table
38
+
39
+ Database#foreign_key_list takes a table name and gives an array of hashes of foreign key information:
40
+
41
+ DB.foreign_key_list(:table1) # [{:columns=>[:column1], :table=>:referenced_table, :key=>[:referenced_column1]}]
42
+
43
+ At least the following entries will be present in the hash:
44
+
45
+ :columns :: An array of columns in the given table
46
+ :table :: The table referenced by the columns
47
+ :key :: An array of columns referenced (in the table specified by :table), but can be nil on certain adapters
48
+ if the primary key is referenced.
49
+
50
+ The hash may also contain entries for:
51
+
52
+ :deferrable :: Whether the constraint is deferrable
53
+ :name :: The name of the constraint
54
+ :on_delete :: The action to take ON DELETE
55
+ :on_update :: The action to take ON UPDATE
56
+
31
57
  == Column Information for a Table
32
58
 
33
59
  Database#schema takes a table symbol and returns column information in an array with each element being an array with two elements. The first elements of the subarray is a column symbol, and the second element is a hash of information about that column. The hash should include the following keys:
@@ -0,0 +1,39 @@
1
+ = New Features
2
+
3
+ * Support COLLATE in column definitions. At least MySQL and Microsoft
4
+ SQL Server support them, and PostgreSQL 9.1 should as well.
5
+
6
+ * When connecting to Microsoft SQL Server, you can use the
7
+ mssql_unicode_strings accessor to turn of the default usage
8
+ of unicode strings (N'') and use regular strings (''). This
9
+ can improve performance, but changes the behavior. It's
10
+ set to true by default for backwards compatibility. You can
11
+ change it at both the dataset and database level:
12
+
13
+ DB.mssql_unicode_strings = false # default for datasets
14
+ dataset.mssql_unicode_strings = false # just this dataset
15
+
16
+ * In the oracle adapter, if Sequel.application_timezone is :utc, set
17
+ the timezone for the connection to use the 00:00 timezone.
18
+
19
+ = Other Improvements
20
+
21
+ * In the single_table_inheritance plugin, correctly handle a
22
+ multi-level class hierarchy so that loading instances from a
23
+ middle level of the hierarchy can return instances of subclasses.
24
+
25
+ * Don't use a schema when creating a temporary table, even if
26
+ default_schema is set.
27
+
28
+ * Fix the migrator when a default_schema is used.
29
+
30
+ * In the ado adapter, assume a connection to SQL Server if the
31
+ :conn_string is given and doesn't indicate Access/Jet.
32
+
33
+ * Fix fetching rows in the tinytds adapter when the
34
+ identifier_output_method is nil.
35
+
36
+ * The tinytds adapter now checks for disconnect errors, but it might
37
+ not be reliable until the next release of tiny_tds.
38
+
39
+ * The odbc adapter now handles ODBC::Time instances correctly.