sequel 3.48.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +114 -0
  3. data/Rakefile +10 -7
  4. data/doc/association_basics.rdoc +25 -23
  5. data/doc/code_order.rdoc +7 -0
  6. data/doc/core_extensions.rdoc +0 -10
  7. data/doc/object_model.rdoc +4 -1
  8. data/doc/querying.rdoc +3 -3
  9. data/doc/release_notes/4.0.0.txt +262 -0
  10. data/doc/security.rdoc +0 -28
  11. data/doc/testing.rdoc +8 -14
  12. data/lib/sequel/adapters/ado.rb +7 -11
  13. data/lib/sequel/adapters/ado/access.rb +8 -8
  14. data/lib/sequel/adapters/ado/mssql.rb +4 -4
  15. data/lib/sequel/adapters/amalgalite.rb +6 -6
  16. data/lib/sequel/adapters/cubrid.rb +7 -7
  17. data/lib/sequel/adapters/db2.rb +5 -9
  18. data/lib/sequel/adapters/dbi.rb +2 -6
  19. data/lib/sequel/adapters/do.rb +4 -4
  20. data/lib/sequel/adapters/firebird.rb +4 -4
  21. data/lib/sequel/adapters/ibmdb.rb +8 -8
  22. data/lib/sequel/adapters/informix.rb +2 -10
  23. data/lib/sequel/adapters/jdbc.rb +17 -17
  24. data/lib/sequel/adapters/jdbc/as400.rb +2 -2
  25. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
  26. data/lib/sequel/adapters/jdbc/db2.rb +1 -1
  27. data/lib/sequel/adapters/jdbc/derby.rb +1 -1
  28. data/lib/sequel/adapters/jdbc/h2.rb +2 -2
  29. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
  30. data/lib/sequel/adapters/jdbc/informix.rb +1 -1
  31. data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
  32. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  33. data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
  34. data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
  35. data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
  36. data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
  37. data/lib/sequel/adapters/mock.rb +7 -7
  38. data/lib/sequel/adapters/mysql.rb +3 -3
  39. data/lib/sequel/adapters/mysql2.rb +4 -4
  40. data/lib/sequel/adapters/odbc.rb +2 -6
  41. data/lib/sequel/adapters/odbc/mssql.rb +1 -1
  42. data/lib/sequel/adapters/openbase.rb +1 -5
  43. data/lib/sequel/adapters/oracle.rb +13 -17
  44. data/lib/sequel/adapters/postgres.rb +20 -25
  45. data/lib/sequel/adapters/shared/cubrid.rb +3 -3
  46. data/lib/sequel/adapters/shared/db2.rb +2 -2
  47. data/lib/sequel/adapters/shared/firebird.rb +7 -7
  48. data/lib/sequel/adapters/shared/mssql.rb +9 -9
  49. data/lib/sequel/adapters/shared/mysql.rb +29 -13
  50. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
  51. data/lib/sequel/adapters/shared/oracle.rb +22 -13
  52. data/lib/sequel/adapters/shared/postgres.rb +61 -46
  53. data/lib/sequel/adapters/shared/sqlite.rb +9 -9
  54. data/lib/sequel/adapters/sqlite.rb +17 -11
  55. data/lib/sequel/adapters/swift.rb +3 -3
  56. data/lib/sequel/adapters/swift/mysql.rb +1 -1
  57. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  58. data/lib/sequel/adapters/tinytds.rb +8 -8
  59. data/lib/sequel/ast_transformer.rb +3 -1
  60. data/lib/sequel/connection_pool.rb +4 -2
  61. data/lib/sequel/connection_pool/sharded_single.rb +2 -2
  62. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
  63. data/lib/sequel/connection_pool/threaded.rb +7 -7
  64. data/lib/sequel/core.rb +4 -67
  65. data/lib/sequel/database.rb +1 -0
  66. data/lib/sequel/database/connecting.rb +2 -8
  67. data/lib/sequel/database/dataset.rb +2 -7
  68. data/lib/sequel/database/dataset_defaults.rb +0 -18
  69. data/lib/sequel/database/features.rb +4 -4
  70. data/lib/sequel/database/misc.rb +6 -8
  71. data/lib/sequel/database/query.rb +5 -61
  72. data/lib/sequel/database/schema_generator.rb +22 -20
  73. data/lib/sequel/database/schema_methods.rb +48 -20
  74. data/lib/sequel/database/transactions.rb +7 -17
  75. data/lib/sequel/dataset.rb +2 -0
  76. data/lib/sequel/dataset/actions.rb +23 -91
  77. data/lib/sequel/dataset/features.rb +1 -4
  78. data/lib/sequel/dataset/graph.rb +3 -47
  79. data/lib/sequel/dataset/misc.rb +4 -33
  80. data/lib/sequel/dataset/prepared_statements.rb +3 -1
  81. data/lib/sequel/dataset/query.rb +116 -240
  82. data/lib/sequel/dataset/sql.rb +19 -97
  83. data/lib/sequel/deprecated.rb +0 -16
  84. data/lib/sequel/exceptions.rb +0 -3
  85. data/lib/sequel/extensions/_pretty_table.rb +1 -1
  86. data/lib/sequel/extensions/columns_introspection.rb +1 -12
  87. data/lib/sequel/extensions/constraint_validations.rb +3 -3
  88. data/lib/sequel/extensions/core_extensions.rb +0 -9
  89. data/lib/sequel/extensions/date_arithmetic.rb +1 -2
  90. data/lib/sequel/extensions/graph_each.rb +11 -0
  91. data/lib/sequel/extensions/migration.rb +5 -5
  92. data/lib/sequel/extensions/null_dataset.rb +11 -13
  93. data/lib/sequel/extensions/pagination.rb +3 -6
  94. data/lib/sequel/extensions/pg_array.rb +6 -4
  95. data/lib/sequel/extensions/pg_array_ops.rb +35 -1
  96. data/lib/sequel/extensions/pg_json.rb +12 -2
  97. data/lib/sequel/extensions/pg_json_ops.rb +266 -0
  98. data/lib/sequel/extensions/pg_range.rb +2 -2
  99. data/lib/sequel/extensions/pg_range_ops.rb +0 -8
  100. data/lib/sequel/extensions/pg_row.rb +2 -2
  101. data/lib/sequel/extensions/pretty_table.rb +0 -4
  102. data/lib/sequel/extensions/query.rb +3 -8
  103. data/lib/sequel/extensions/schema_caching.rb +0 -7
  104. data/lib/sequel/extensions/schema_dumper.rb +10 -17
  105. data/lib/sequel/extensions/select_remove.rb +0 -4
  106. data/lib/sequel/extensions/set_overrides.rb +28 -0
  107. data/lib/sequel/extensions/to_dot.rb +6 -10
  108. data/lib/sequel/model.rb +6 -7
  109. data/lib/sequel/model/associations.rb +127 -182
  110. data/lib/sequel/model/base.rb +88 -211
  111. data/lib/sequel/model/errors.rb +0 -13
  112. data/lib/sequel/model/plugins.rb +2 -2
  113. data/lib/sequel/no_core_ext.rb +0 -1
  114. data/lib/sequel/plugins/after_initialize.rb +11 -17
  115. data/lib/sequel/plugins/association_autoreloading.rb +1 -47
  116. data/lib/sequel/plugins/association_dependencies.rb +2 -2
  117. data/lib/sequel/plugins/auto_validations.rb +2 -8
  118. data/lib/sequel/plugins/blacklist_security.rb +32 -2
  119. data/lib/sequel/plugins/caching.rb +1 -1
  120. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  121. data/lib/sequel/plugins/composition.rb +10 -8
  122. data/lib/sequel/plugins/constraint_validations.rb +2 -2
  123. data/lib/sequel/plugins/dataset_associations.rb +4 -0
  124. data/lib/sequel/plugins/defaults_setter.rb +8 -6
  125. data/lib/sequel/plugins/dirty.rb +6 -6
  126. data/lib/sequel/plugins/force_encoding.rb +13 -8
  127. data/lib/sequel/plugins/hook_class_methods.rb +1 -7
  128. data/lib/sequel/plugins/json_serializer.rb +13 -74
  129. data/lib/sequel/plugins/lazy_attributes.rb +2 -4
  130. data/lib/sequel/plugins/list.rb +1 -1
  131. data/lib/sequel/plugins/many_through_many.rb +4 -11
  132. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
  133. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  134. data/lib/sequel/plugins/optimistic_locking.rb +3 -5
  135. data/lib/sequel/plugins/pg_array_associations.rb +453 -0
  136. data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
  137. data/lib/sequel/plugins/prepared_statements.rb +1 -1
  138. data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
  139. data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
  140. data/lib/sequel/plugins/rcte_tree.rb +1 -1
  141. data/lib/sequel/plugins/serialization.rb +5 -4
  142. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  143. data/lib/sequel/plugins/sharding.rb +7 -1
  144. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  145. data/lib/sequel/plugins/timestamps.rb +1 -1
  146. data/lib/sequel/plugins/touch.rb +2 -2
  147. data/lib/sequel/plugins/tree.rb +1 -1
  148. data/lib/sequel/plugins/typecast_on_load.rb +19 -4
  149. data/lib/sequel/plugins/validation_class_methods.rb +0 -30
  150. data/lib/sequel/plugins/validation_helpers.rb +13 -31
  151. data/lib/sequel/plugins/xml_serializer.rb +18 -57
  152. data/lib/sequel/sql.rb +20 -22
  153. data/lib/sequel/version.rb +2 -2
  154. data/spec/adapters/db2_spec.rb +14 -23
  155. data/spec/adapters/firebird_spec.rb +25 -29
  156. data/spec/adapters/informix_spec.rb +11 -14
  157. data/spec/adapters/mssql_spec.rb +71 -77
  158. data/spec/adapters/mysql_spec.rb +165 -172
  159. data/spec/adapters/oracle_spec.rb +36 -39
  160. data/spec/adapters/postgres_spec.rb +175 -100
  161. data/spec/adapters/spec_helper.rb +13 -11
  162. data/spec/adapters/sqlite_spec.rb +36 -44
  163. data/spec/core/connection_pool_spec.rb +2 -1
  164. data/spec/core/database_spec.rb +55 -55
  165. data/spec/core/dataset_spec.rb +45 -249
  166. data/spec/core/deprecated_spec.rb +0 -8
  167. data/spec/core/expression_filters_spec.rb +23 -5
  168. data/spec/core/object_graph_spec.rb +4 -66
  169. data/spec/core/schema_spec.rb +35 -12
  170. data/spec/core/spec_helper.rb +3 -2
  171. data/spec/core_extensions_spec.rb +17 -19
  172. data/spec/extensions/arbitrary_servers_spec.rb +2 -3
  173. data/spec/extensions/association_dependencies_spec.rb +14 -14
  174. data/spec/extensions/auto_validations_spec.rb +7 -0
  175. data/spec/extensions/blacklist_security_spec.rb +5 -5
  176. data/spec/extensions/blank_spec.rb +2 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +2 -2
  178. data/spec/extensions/columns_introspection_spec.rb +2 -29
  179. data/spec/extensions/composition_spec.rb +10 -17
  180. data/spec/extensions/core_refinements_spec.rb +5 -1
  181. data/spec/extensions/dataset_associations_spec.rb +18 -0
  182. data/spec/extensions/date_arithmetic_spec.rb +2 -2
  183. data/spec/extensions/defaults_setter_spec.rb +9 -9
  184. data/spec/extensions/dirty_spec.rb +0 -5
  185. data/spec/extensions/eval_inspect_spec.rb +2 -0
  186. data/spec/extensions/force_encoding_spec.rb +2 -18
  187. data/spec/extensions/hash_aliases_spec.rb +8 -0
  188. data/spec/extensions/hook_class_methods_spec.rb +39 -58
  189. data/spec/extensions/inflector_spec.rb +2 -0
  190. data/spec/extensions/instance_filters_spec.rb +8 -8
  191. data/spec/extensions/json_serializer_spec.rb +1 -41
  192. data/spec/extensions/list_spec.rb +1 -1
  193. data/spec/extensions/many_through_many_spec.rb +106 -109
  194. data/spec/extensions/migration_spec.rb +2 -0
  195. data/spec/extensions/named_timezones_spec.rb +1 -0
  196. data/spec/extensions/pg_array_associations_spec.rb +603 -0
  197. data/spec/extensions/pg_array_ops_spec.rb +25 -0
  198. data/spec/extensions/pg_array_spec.rb +9 -1
  199. data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
  200. data/spec/extensions/pg_hstore_spec.rb +1 -0
  201. data/spec/extensions/pg_json_ops_spec.rb +131 -0
  202. data/spec/extensions/pg_json_spec.rb +10 -4
  203. data/spec/extensions/pg_range_ops_spec.rb +2 -5
  204. data/spec/extensions/pg_range_spec.rb +6 -2
  205. data/spec/extensions/pg_row_ops_spec.rb +2 -0
  206. data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
  207. data/spec/extensions/rcte_tree_spec.rb +15 -15
  208. data/spec/extensions/schema_dumper_spec.rb +0 -1
  209. data/spec/extensions/schema_spec.rb +9 -9
  210. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  211. data/spec/extensions/serialization_spec.rb +18 -29
  212. data/spec/extensions/set_overrides_spec.rb +4 -0
  213. data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
  214. data/spec/extensions/single_table_inheritance_spec.rb +4 -4
  215. data/spec/extensions/spec_helper.rb +8 -9
  216. data/spec/extensions/sql_expr_spec.rb +2 -0
  217. data/spec/extensions/string_date_time_spec.rb +2 -0
  218. data/spec/extensions/string_stripper_spec.rb +2 -0
  219. data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
  220. data/spec/extensions/thread_local_timezones_spec.rb +2 -0
  221. data/spec/extensions/timestamps_spec.rb +1 -1
  222. data/spec/extensions/to_dot_spec.rb +1 -1
  223. data/spec/extensions/touch_spec.rb +24 -24
  224. data/spec/extensions/tree_spec.rb +7 -7
  225. data/spec/extensions/typecast_on_load_spec.rb +8 -1
  226. data/spec/extensions/update_primary_key_spec.rb +10 -10
  227. data/spec/extensions/validation_class_methods_spec.rb +10 -39
  228. data/spec/extensions/validation_helpers_spec.rb +29 -47
  229. data/spec/extensions/xml_serializer_spec.rb +1 -23
  230. data/spec/integration/associations_test.rb +231 -40
  231. data/spec/integration/database_test.rb +1 -1
  232. data/spec/integration/dataset_test.rb +64 -64
  233. data/spec/integration/eager_loader_test.rb +28 -28
  234. data/spec/integration/migrator_test.rb +1 -1
  235. data/spec/integration/model_test.rb +2 -2
  236. data/spec/integration/plugin_test.rb +21 -21
  237. data/spec/integration/prepared_statement_test.rb +7 -7
  238. data/spec/integration/schema_test.rb +115 -110
  239. data/spec/integration/spec_helper.rb +17 -27
  240. data/spec/integration/timezone_test.rb +1 -1
  241. data/spec/integration/transaction_test.rb +10 -10
  242. data/spec/integration/type_test.rb +2 -2
  243. data/spec/model/association_reflection_spec.rb +2 -28
  244. data/spec/model/associations_spec.rb +239 -188
  245. data/spec/model/base_spec.rb +27 -68
  246. data/spec/model/dataset_methods_spec.rb +4 -4
  247. data/spec/model/eager_loading_spec.rb +160 -172
  248. data/spec/model/hooks_spec.rb +62 -79
  249. data/spec/model/model_spec.rb +36 -51
  250. data/spec/model/plugins_spec.rb +5 -19
  251. data/spec/model/record_spec.rb +125 -151
  252. data/spec/model/spec_helper.rb +8 -6
  253. data/spec/model/validations_spec.rb +4 -17
  254. data/spec/spec_config.rb +2 -10
  255. metadata +50 -56
  256. data/lib/sequel/deprecated_core_extensions.rb +0 -135
  257. data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
  258. data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
  259. data/lib/sequel/plugins/identity_map.rb +0 -260
  260. data/lib/sequel_core.rb +0 -2
  261. data/lib/sequel_model.rb +0 -2
  262. data/spec/extensions/association_autoreloading_spec.rb +0 -102
  263. data/spec/extensions/identity_map_spec.rb +0 -337
  264. data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
  265. data/spec/extensions/pg_statement_cache_spec.rb +0 -208
  266. data/spec/rcov.opts +0 -8
  267. data/spec/spec_config.rb.example +0 -10
@@ -13,6 +13,7 @@ module Sequel
13
13
  # The Database class is meant to be subclassed by database adapters in order
14
14
  # to provide the functionality needed for executing queries.
15
15
  class Database
16
+ OPTS = Sequel::OPTS
16
17
  end
17
18
 
18
19
  require(%w"connecting dataset dataset_defaults logging features misc query transactions schema_generator schema_methods", 'database')
@@ -45,7 +45,7 @@ module Sequel
45
45
  end
46
46
 
47
47
  # Connects to a database. See Sequel.connect.
48
- def self.connect(conn_string, opts = {})
48
+ def self.connect(conn_string, opts = OPTS)
49
49
  case conn_string
50
50
  when String
51
51
  if match = /\A(jdbc|do):/o.match(conn_string)
@@ -138,12 +138,6 @@ module Sequel
138
138
  end
139
139
  end
140
140
 
141
- # Connects to the database. This method should be overridden by descendants.
142
- def connect(server)
143
- Sequel::Deprecation.deprecate('Database#connect default implementation and Sequel::NotImplemented', 'All database instance can be assumed to implement connect.')
144
- raise NotImplemented, "#connect should be overridden by adapters"
145
- end
146
-
147
141
  # The database type for this database object, the same as the adapter scheme
148
142
  # by default. Should be overridden in adapters (especially shared adapters)
149
143
  # to be the correct type, so that even if two separate Database objects are
@@ -167,7 +161,7 @@ module Sequel
167
161
  # DB.disconnect # All servers
168
162
  # DB.disconnect(:servers=>:server1) # Single server
169
163
  # DB.disconnect(:servers=>[:server1, :server2]) # Multiple servers
170
- def disconnect(opts = {})
164
+ def disconnect(opts = OPTS)
171
165
  pool.disconnect(opts)
172
166
  end
173
167
 
@@ -24,13 +24,8 @@ module Sequel
24
24
  #
25
25
  # DB.dataset # SELECT *
26
26
  # DB.dataset.from(:items) # SELECT * FROM items
27
- def dataset(opts=(no_arg_given=true; nil))
28
- # REMOVE40
29
- if no_arg_given
30
- @dataset_class.new(self)
31
- else
32
- @dataset_class.new(self, opts)
33
- end
27
+ def dataset
28
+ @dataset_class.new(self)
34
29
  end
35
30
 
36
31
  # Fetches records for an arbitrary SQL statement. If a block is given,
@@ -44,19 +44,6 @@ module Sequel
44
44
  # The identifier output method to use by default for this database (default: adapter default)
45
45
  attr_reader :identifier_output_method
46
46
 
47
- # REMOVE40
48
- def _default_schema
49
- @default_schema
50
- end
51
- def default_schema
52
- Sequel::Deprecation.deprecate('Database#default_schema', 'Use qualified tables instead')
53
- @default_schema
54
- end
55
- def default_schema=(v)
56
- Sequel::Deprecation.deprecate('Database#default_schema=', 'Use qualified tables instead') if v
57
- @default_schema = v
58
- end
59
-
60
47
  # If the database has any dataset modules associated with it,
61
48
  # use a subclass of the given class that includes the modules
62
49
  # as the dataset class.
@@ -146,11 +133,6 @@ module Sequel
146
133
  self.class.const_get(:DatasetClass)
147
134
  end
148
135
 
149
- # REMOVE40
150
- def default_schema_default
151
- nil
152
- end
153
-
154
136
  # Reset the default dataset used by most Database methods that
155
137
  # create datasets. Usually done after changes to the identifier
156
138
  # mangling methods.
@@ -39,12 +39,12 @@ module Sequel
39
39
  # Whether the database supports Database#foreign_key_list for
40
40
  # parsing foreign keys.
41
41
  def supports_foreign_key_parsing?
42
- [:access, :mssql, :mysql, :postgres, :sqlite].include?(database_type)
42
+ respond_to?(:foreign_key_list)
43
43
  end
44
44
 
45
45
  # Whether the database supports Database#indexes for parsing indexes.
46
46
  def supports_index_parsing?
47
- [:access, :cubrid, :db2, :mssql, :mysql, :postgres, :sqlite].include?(database_type) || adapter_scheme == :jdbc
47
+ respond_to?(:indexes)
48
48
  end
49
49
 
50
50
  # Whether the database and adapter support prepared transactions
@@ -71,12 +71,12 @@ module Sequel
71
71
 
72
72
  # Whether the database supports Database#tables for getting list of tables.
73
73
  def supports_table_listing?
74
- [:access, :cubrid, :db2, :firebird, :mssql, :mysql, :oracle, :postgres, :sqlite].include?(database_type) || adapter_scheme == :jdbc
74
+ respond_to?(:tables)
75
75
  end
76
76
  #
77
77
  # Whether the database supports Database#views for getting list of views.
78
78
  def supports_view_listing?
79
- supports_table_listing?
79
+ respond_to?(:views)
80
80
  end
81
81
 
82
82
  # Whether the database and adapter support transaction isolation levels, false by default.
@@ -110,7 +110,7 @@ module Sequel
110
110
  # :sql_log_level :: Method to use to log SQL to a logger, :info by default.
111
111
  #
112
112
  # All options given are also passed to the connection pool.
113
- def initialize(opts = {}, &block)
113
+ def initialize(opts = OPTS, &block)
114
114
  @opts ||= opts
115
115
  @opts = connection_pool_default_options.merge(@opts)
116
116
  @loggers = Array(@opts[:logger]) + Array(@opts[:loggers])
@@ -121,7 +121,6 @@ module Sequel
121
121
 
122
122
  @opts[:single_threaded] = @single_threaded = typecast_value_boolean(@opts.fetch(:single_threaded, Database.single_threaded))
123
123
  @schemas = {}
124
- @default_schema = @opts.fetch(:default_schema, default_schema_default)
125
124
  @default_string_column_size = @opts[:default_string_column_size] || DEFAULT_STRING_COLUMN_SIZE
126
125
  @prepared_statements = {}
127
126
  @transactions = {}
@@ -150,7 +149,7 @@ module Sequel
150
149
  # in progress transaction commits (and only if it commits).
151
150
  # Options:
152
151
  # :server :: The server/shard to use.
153
- def after_commit(opts={}, &block)
152
+ def after_commit(opts=OPTS, &block)
154
153
  raise Error, "must provide block to after_commit" unless block
155
154
  synchronize(opts[:server]) do |conn|
156
155
  if h = _trans(conn)
@@ -167,7 +166,7 @@ module Sequel
167
166
  # in progress transaction rolls back (and only if it rolls back).
168
167
  # Options:
169
168
  # :server :: The server/shard to use.
170
- def after_rollback(opts={}, &block)
169
+ def after_rollback(opts=OPTS, &block)
171
170
  raise Error, "must provide block to after_rollback" unless block
172
171
  synchronize(opts[:server]) do |conn|
173
172
  if h = _trans(conn)
@@ -212,7 +211,7 @@ module Sequel
212
211
  # Return true if already in a transaction given the options,
213
212
  # false otherwise. Respects the :server option for selecting
214
213
  # a shard.
215
- def in_transaction?(opts={})
214
+ def in_transaction?(opts=OPTS)
216
215
  synchronize(opts[:server]){|conn| !!_trans(conn)}
217
216
  end
218
217
 
@@ -398,7 +397,7 @@ module Sequel
398
397
 
399
398
  # Convert the given exception to an appropriate Sequel::DatabaseError
400
399
  # subclass, keeping message and traceback.
401
- def raise_error(exception, opts={})
400
+ def raise_error(exception, opts=OPTS)
402
401
  if !opts[:classes] || Array(opts[:classes]).any?{|c| exception.is_a?(c)}
403
402
  raise Sequel.convert_exception_class(exception, database_error_class(exception, opts))
404
403
  else
@@ -495,8 +494,7 @@ module Sequel
495
494
  def typecast_value_string(value)
496
495
  case value
497
496
  when Hash, Array
498
- Sequel::Deprecation.deprecate('Automatically typecasting a hash or array to string for a string column', 'Either typecast the input manually or use the looser_typecasting extension')
499
- value.to_s
497
+ raise Sequel::InvalidValue, "invalid value for String: #{value.inspect}"
500
498
  else
501
499
  value.to_s
502
500
  end
@@ -36,53 +36,27 @@ module Sequel
36
36
  prepared_statement(ps_name).call(hash, &block)
37
37
  end
38
38
 
39
- # Executes the given SQL on the database. This method should be overridden in descendants.
40
- # This method should not be called directly by user code.
41
- def execute(sql, opts={})
42
- Sequel::Deprecation.deprecate('Database#execute default implementation and Sequel::NotImplemented', 'All database instances can be assumed to implement execute')
43
- raise NotImplemented, "#execute should be overridden by adapters"
44
- end
45
-
46
39
  # Method that should be used when submitting any DDL (Data Definition
47
40
  # Language) SQL, such as +create_table+. By default, calls +execute_dui+.
48
41
  # This method should not be called directly by user code.
49
- def execute_ddl(sql, opts={}, &block)
42
+ def execute_ddl(sql, opts=OPTS, &block)
50
43
  execute_dui(sql, opts, &block)
51
44
  end
52
45
 
53
46
  # Method that should be used when issuing a DELETE, UPDATE, or INSERT
54
47
  # statement. By default, calls execute.
55
48
  # This method should not be called directly by user code.
56
- def execute_dui(sql, opts={}, &block)
49
+ def execute_dui(sql, opts=OPTS, &block)
57
50
  execute(sql, opts, &block)
58
51
  end
59
52
 
60
53
  # Method that should be used when issuing a INSERT
61
54
  # statement. By default, calls execute_dui.
62
55
  # This method should not be called directly by user code.
63
- def execute_insert(sql, opts={}, &block)
56
+ def execute_insert(sql, opts=OPTS, &block)
64
57
  execute_dui(sql, opts, &block)
65
58
  end
66
59
 
67
- # Returns an array of hashes containing foreign key information from the
68
- # table. Each hash will contain at least the following fields:
69
- #
70
- # :columns :: An array of columns in the given table
71
- # :table :: The table referenced by the columns
72
- # :key :: An array of columns referenced (in the table specified by :table),
73
- # but can be nil on certain adapters if the primary key is referenced.
74
- #
75
- # The hash may also contain entries for:
76
- #
77
- # :deferrable :: Whether the constraint is deferrable
78
- # :name :: The name of the constraint
79
- # :on_delete :: The action to take ON DELETE
80
- # :on_update :: The action to take ON UPDATE
81
- def foreign_key_list(table, opts={})
82
- Sequel::Deprecation.deprecate('Database#foreign_key_list default implementation and Sequel::NotImplemented', 'Use Database#supports_foreign_key_parsing? to check for support')
83
- raise NotImplemented, "#foreign_key_list should be overridden by adapters"
84
- end
85
-
86
60
  # Returns a single value from the database, e.g.:
87
61
  #
88
62
  # DB.get(1) # SELECT 1
@@ -92,26 +66,12 @@ module Sequel
92
66
  @default_dataset.get(*args, &block)
93
67
  end
94
68
 
95
- # Return a hash containing index information for the table. Hash keys are index name symbols.
96
- # Values are subhashes with two keys, :columns and :unique. The value of :columns
97
- # is an array of symbols of column names. The value of :unique is true or false
98
- # depending on if the index is unique.
99
- #
100
- # Should not include the primary key index, functional indexes, or partial indexes.
101
- #
102
- # DB.indexes(:artists)
103
- # # => {:artists_name_ukey=>{:columns=>[:name], :unique=>true}}
104
- def indexes(table, opts={})
105
- Sequel::Deprecation.deprecate('Database#indexes default implementation and Sequel::NotImplemented', 'Use Database#supports_index_parsing? to check for support')
106
- raise NotImplemented, "#indexes should be overridden by adapters"
107
- end
108
-
109
69
  # Runs the supplied SQL statement string on the database server. Returns nil.
110
70
  # Options:
111
71
  # :server :: The server to run the SQL on.
112
72
  #
113
73
  # DB.run("SET some_server_variable = 42")
114
- def run(sql, opts={})
74
+ def run(sql, opts=OPTS)
115
75
  execute_ddl(sql, opts)
116
76
  nil
117
77
  end
@@ -156,7 +116,7 @@ module Sequel
156
116
  # # :ruby_default=>nil,
157
117
  # # :db_type=>"text",
158
118
  # # :allow_null=>false}]]
159
- def schema(table, opts={})
119
+ def schema(table, opts=OPTS)
160
120
  raise(Error, 'schema parsing is not implemented on this database') unless supports_schema_parsing?
161
121
 
162
122
  opts = opts.dup
@@ -218,22 +178,6 @@ module Sequel
218
178
  false
219
179
  end
220
180
 
221
- # Return all tables in the database as an array of symbols.
222
- #
223
- # DB.tables # => [:albums, :artists]
224
- def tables(opts={})
225
- Sequel::Deprecation.deprecate('Database#tables default implementation and Sequel::NotImplemented', 'Use Database#supports_table_listing? to check for support')
226
- raise NotImplemented, "#tables should be overridden by adapters"
227
- end
228
-
229
- # Return all views in the database as an array of symbols.
230
- #
231
- # DB.views # => [:gold_albums, :artists_with_many_albums]
232
- def views(opts={})
233
- Sequel::Deprecation.deprecate('Database#views default implementation and Sequel::NotImplemented', 'Use Database#supports_view_listing? to check for support')
234
- raise NotImplemented, "#views should be overridden by adapters"
235
- end
236
-
237
181
  private
238
182
 
239
183
  # Should raise an error if the table doesn't not exist,
@@ -108,7 +108,7 @@ module Sequel
108
108
  # :unique :: Mark the column as unique, generally has the same effect as
109
109
  # creating a unique index on the column.
110
110
  # :unique_constraint_name :: The name to give the unique key constraint
111
- def column(name, type, opts = {})
111
+ def column(name, type, opts = OPTS)
112
112
  columns << {:name => name, :type => type}.merge(opts)
113
113
  if index_opts = opts[:index]
114
114
  index(name, index_opts.is_a?(Hash) ? index_opts : {})
@@ -142,7 +142,7 @@ module Sequel
142
142
  #
143
143
  # foreign_key([:artist_name, :artist_location], :artists, :name=>:artist_fk)
144
144
  # # ADD CONSTRAINT artist_fk FOREIGN KEY (artist_name, artist_location) REFERENCES artists
145
- def foreign_key(name, table=nil, opts = {})
145
+ def foreign_key(name, table=nil, opts = OPTS)
146
146
  opts = case table
147
147
  when Hash
148
148
  table.merge(opts)
@@ -160,11 +160,13 @@ module Sequel
160
160
  # Add a full text index on the given columns to the DDL.
161
161
  #
162
162
  # PostgreSQL specific options:
163
+ # :index_type :: Can be set to :gist to use a GIST index instead of the
164
+ # default GIN index.
163
165
  # :language :: Set a language to use for the index (default: simple).
164
166
  #
165
167
  # Microsoft SQL Server specific options:
166
168
  # :key_index :: The KEY INDEX to use for the full text index.
167
- def full_text_index(columns, opts = {})
169
+ def full_text_index(columns, opts = OPTS)
168
170
  index(columns, opts.merge(:type => :full_text))
169
171
  end
170
172
 
@@ -199,13 +201,13 @@ module Sequel
199
201
  #
200
202
  # index [:artist_id, :name]
201
203
  # # CREATE INDEX table_artist_id_name_index ON table (artist_id, name)
202
- def index(columns, opts = {})
204
+ def index(columns, opts = OPTS)
203
205
  indexes << {:columns => Array(columns)}.merge(opts)
204
206
  end
205
207
 
206
208
  # Add a column with the given type, name, and opts to the DDL. See +column+ for available
207
209
  # options.
208
- def method_missing(type, name = nil, opts = {})
210
+ def method_missing(type, name = nil, opts = OPTS)
209
211
  name ? column(name, type, opts) : super
210
212
  end
211
213
 
@@ -250,7 +252,7 @@ module Sequel
250
252
  end
251
253
 
252
254
  # Add a spatial index on the given columns to the DDL.
253
- def spatial_index(columns, opts = {})
255
+ def spatial_index(columns, opts = OPTS)
254
256
  index(columns, opts.merge(:type => :spatial))
255
257
  end
256
258
 
@@ -260,7 +262,7 @@ module Sequel
260
262
  #
261
263
  # Supports the same :deferrable option as #column. The :name option can be used
262
264
  # to name the constraint.
263
- def unique(columns, opts = {})
265
+ def unique(columns, opts = OPTS)
264
266
  constraints << {:type => :unique, :columns => Array(columns)}.merge(opts)
265
267
  end
266
268
 
@@ -308,7 +310,7 @@ module Sequel
308
310
  # See CreateTableGenerator#column for the available options.
309
311
  #
310
312
  # add_column(:name, String) # ADD COLUMN name varchar(255)
311
- def add_column(name, type, opts = {})
313
+ def add_column(name, type, opts = OPTS)
312
314
  @operations << {:op => :add_column, :name => name, :type => type}.merge(opts)
313
315
  end
314
316
 
@@ -327,7 +329,7 @@ module Sequel
327
329
  # add_unique_constraint(:name, :name=>:unique_name) # ADD CONSTRAINT unique_name UNIQUE (name)
328
330
  #
329
331
  # Supports the same :deferrable option as CreateTableGenerator#column.
330
- def add_unique_constraint(columns, opts = {})
332
+ def add_unique_constraint(columns, opts = OPTS)
331
333
  @operations << {:op => :add_constraint, :type => :unique, :columns => Array(columns)}.merge(opts)
332
334
  end
333
335
 
@@ -353,14 +355,14 @@ module Sequel
353
355
  # existing data has been cleaned up, validate_constraint can be used
354
356
  # to mark the constraint as valid. Note that this option only makes
355
357
  # sense when using an array of columns.
356
- def add_foreign_key(name, table, opts = {})
358
+ def add_foreign_key(name, table, opts = OPTS)
357
359
  return add_composite_foreign_key(name, table, opts) if name.is_a?(Array)
358
360
  add_column(name, Integer, {:table=>table}.merge(opts))
359
361
  end
360
362
 
361
363
  # Add a full text index on the given columns to the DDL for the table.
362
364
  # See CreateTableGenerator#index for available options.
363
- def add_full_text_index(columns, opts = {})
365
+ def add_full_text_index(columns, opts = OPTS)
364
366
  add_index(columns, {:type=>:full_text}.merge(opts))
365
367
  end
366
368
 
@@ -368,7 +370,7 @@ module Sequel
368
370
  # CreateTableGenerator#index for available options.
369
371
  #
370
372
  # add_index(:artist_id) # CREATE INDEX table_artist_id_index ON table (artist_id)
371
- def add_index(columns, opts = {})
373
+ def add_index(columns, opts = OPTS)
372
374
  @operations << {:op => :add_index, :columns => Array(columns)}.merge(opts)
373
375
  end
374
376
 
@@ -378,7 +380,7 @@ module Sequel
378
380
  #
379
381
  # add_primary_key(:id) # ADD COLUMN id serial PRIMARY KEY
380
382
  # add_primary_key([:artist_id, :name]) # ADD PRIMARY KEY (artist_id, name)
381
- def add_primary_key(name, opts = {})
383
+ def add_primary_key(name, opts = OPTS)
382
384
  return add_composite_primary_key(name, opts) if name.is_a?(Array)
383
385
  opts = @db.serial_primary_key_options.merge(opts)
384
386
  add_column(name, opts.delete(:type), opts)
@@ -386,7 +388,7 @@ module Sequel
386
388
 
387
389
  # Add a spatial index on the given columns to the DDL for the table.
388
390
  # See CreateTableGenerator#index for available options.
389
- def add_spatial_index(columns, opts = {})
391
+ def add_spatial_index(columns, opts = OPTS)
390
392
  add_index(columns, {:type=>:spatial}.merge(opts))
391
393
  end
392
394
 
@@ -394,7 +396,7 @@ module Sequel
394
396
  #
395
397
  # drop_column(:artist_id) # DROP COLUMN artist_id
396
398
  # drop_column(:artist_id, :cascade=>true) # DROP COLUMN artist_id CASCADE
397
- def drop_column(name, opts={})
399
+ def drop_column(name, opts=OPTS)
398
400
  @operations << {:op => :drop_column, :name => name}.merge(opts)
399
401
  end
400
402
 
@@ -405,7 +407,7 @@ module Sequel
405
407
  #
406
408
  # drop_constraint(:unique_name) # DROP CONSTRAINT unique_name
407
409
  # drop_constraint(:unique_name, :cascade=>true) # DROP CONSTRAINT unique_name CASCADE
408
- def drop_constraint(name, opts={})
410
+ def drop_constraint(name, opts=OPTS)
409
411
  @operations << {:op => :drop_constraint, :name => name}.merge(opts)
410
412
  end
411
413
 
@@ -419,7 +421,7 @@ module Sequel
419
421
  #
420
422
  # drop_foreign_key(:artist_id) # DROP CONSTRAINT table_artist_id_fkey, DROP COLUMN artist_id
421
423
  # drop_foreign_key([:name]) # DROP CONSTRAINT table_name_fkey
422
- def drop_foreign_key(name, opts={})
424
+ def drop_foreign_key(name, opts=OPTS)
423
425
  drop_composite_foreign_key(Array(name), opts)
424
426
  drop_column(name) unless name.is_a?(Array)
425
427
  end
@@ -439,14 +441,14 @@ module Sequel
439
441
  # drop_index(:artist_id) # DROP INDEX table_artist_id_index
440
442
  # drop_index([:a, :b]) # DROP INDEX table_a_b_index
441
443
  # drop_index([:a, :b], :name=>:foo) # DROP INDEX foo
442
- def drop_index(columns, options={})
444
+ def drop_index(columns, options=OPTS)
443
445
  @operations << {:op => :drop_index, :columns => Array(columns)}.merge(options)
444
446
  end
445
447
 
446
448
  # Modify a column's name in the DDL for the table.
447
449
  #
448
450
  # rename_column(:name, :artist_name) # RENAME COLUMN name TO artist_name
449
- def rename_column(name, new_name, opts = {})
451
+ def rename_column(name, new_name, opts = OPTS)
450
452
  @operations << {:op => :rename_column, :name => name, :new_name => new_name}.merge(opts)
451
453
  end
452
454
 
@@ -464,7 +466,7 @@ module Sequel
464
466
  # PostgreSQL specific options:
465
467
  #
466
468
  # :using :: Add a USING clause that specifies how to convert existing values to new values.
467
- def set_column_type(name, type, opts={})
469
+ def set_column_type(name, type, opts=OPTS)
468
470
  @operations << {:op => :set_column_type, :name => name, :type => type}.merge(opts)
469
471
  end
470
472