sequel 2.9.0 → 2.10.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 (78) hide show
  1. data/CHANGELOG +56 -0
  2. data/{README → README.rdoc} +85 -57
  3. data/Rakefile +10 -5
  4. data/bin/sequel +7 -16
  5. data/doc/advanced_associations.rdoc +5 -17
  6. data/doc/cheat_sheet.rdoc +18 -20
  7. data/doc/dataset_filtering.rdoc +8 -32
  8. data/doc/schema.rdoc +20 -0
  9. data/lib/sequel_core.rb +35 -1
  10. data/lib/sequel_core/adapters/ado.rb +1 -1
  11. data/lib/sequel_core/adapters/db2.rb +2 -2
  12. data/lib/sequel_core/adapters/dbi.rb +2 -11
  13. data/lib/sequel_core/adapters/do.rb +205 -0
  14. data/lib/sequel_core/adapters/do/mysql.rb +38 -0
  15. data/lib/sequel_core/adapters/do/postgres.rb +92 -0
  16. data/lib/sequel_core/adapters/do/sqlite.rb +31 -0
  17. data/lib/sequel_core/adapters/firebird.rb +298 -0
  18. data/lib/sequel_core/adapters/informix.rb +10 -1
  19. data/lib/sequel_core/adapters/jdbc.rb +78 -19
  20. data/lib/sequel_core/adapters/jdbc/h2.rb +69 -0
  21. data/lib/sequel_core/adapters/jdbc/mysql.rb +10 -0
  22. data/lib/sequel_core/adapters/jdbc/postgresql.rb +7 -3
  23. data/lib/sequel_core/adapters/mysql.rb +53 -77
  24. data/lib/sequel_core/adapters/odbc.rb +1 -1
  25. data/lib/sequel_core/adapters/openbase.rb +1 -1
  26. data/lib/sequel_core/adapters/oracle.rb +2 -2
  27. data/lib/sequel_core/adapters/postgres.rb +16 -14
  28. data/lib/sequel_core/adapters/shared/mysql.rb +44 -9
  29. data/lib/sequel_core/adapters/shared/oracle.rb +4 -5
  30. data/lib/sequel_core/adapters/shared/postgres.rb +86 -82
  31. data/lib/sequel_core/adapters/shared/sqlite.rb +39 -24
  32. data/lib/sequel_core/adapters/sqlite.rb +11 -1
  33. data/lib/sequel_core/connection_pool.rb +10 -2
  34. data/lib/sequel_core/core_sql.rb +13 -3
  35. data/lib/sequel_core/database.rb +131 -30
  36. data/lib/sequel_core/database/schema.rb +5 -5
  37. data/lib/sequel_core/dataset.rb +31 -6
  38. data/lib/sequel_core/dataset/convenience.rb +11 -11
  39. data/lib/sequel_core/dataset/query.rb +2 -2
  40. data/lib/sequel_core/dataset/sql.rb +6 -6
  41. data/lib/sequel_core/exceptions.rb +4 -0
  42. data/lib/sequel_core/migration.rb +4 -4
  43. data/lib/sequel_core/schema/generator.rb +19 -3
  44. data/lib/sequel_core/schema/sql.rb +24 -20
  45. data/lib/sequel_core/sql.rb +13 -16
  46. data/lib/sequel_core/version.rb +11 -0
  47. data/lib/sequel_model.rb +2 -0
  48. data/lib/sequel_model/base.rb +2 -2
  49. data/lib/sequel_model/hooks.rb +46 -7
  50. data/lib/sequel_model/record.rb +11 -9
  51. data/lib/sequel_model/schema.rb +1 -1
  52. data/lib/sequel_model/validations.rb +72 -61
  53. data/spec/adapters/firebird_spec.rb +371 -0
  54. data/spec/adapters/mysql_spec.rb +118 -62
  55. data/spec/adapters/oracle_spec.rb +5 -5
  56. data/spec/adapters/postgres_spec.rb +33 -18
  57. data/spec/adapters/sqlite_spec.rb +2 -2
  58. data/spec/integration/dataset_test.rb +3 -3
  59. data/spec/integration/schema_test.rb +55 -5
  60. data/spec/integration/spec_helper.rb +11 -0
  61. data/spec/integration/type_test.rb +59 -16
  62. data/spec/sequel_core/connection_pool_spec.rb +14 -0
  63. data/spec/sequel_core/core_sql_spec.rb +24 -14
  64. data/spec/sequel_core/database_spec.rb +96 -11
  65. data/spec/sequel_core/dataset_spec.rb +97 -37
  66. data/spec/sequel_core/expression_filters_spec.rb +51 -40
  67. data/spec/sequel_core/object_graph_spec.rb +2 -2
  68. data/spec/sequel_core/schema_generator_spec.rb +31 -6
  69. data/spec/sequel_core/schema_spec.rb +25 -9
  70. data/spec/sequel_core/spec_helper.rb +4 -1
  71. data/spec/sequel_core/version_spec.rb +7 -0
  72. data/spec/sequel_model/associations_spec.rb +1 -1
  73. data/spec/sequel_model/hooks_spec.rb +68 -13
  74. data/spec/sequel_model/model_spec.rb +4 -4
  75. data/spec/sequel_model/record_spec.rb +22 -0
  76. data/spec/sequel_model/spec_helper.rb +2 -1
  77. data/spec/sequel_model/validations_spec.rb +107 -7
  78. metadata +15 -5
@@ -5,6 +5,7 @@ module Sequel
5
5
  SYNCHRONOUS = {'0' => :off, '1' => :normal, '2' => :full}.freeze
6
6
  TABLES_FILTER = "type = 'table' AND NOT name = 'sqlite_sequence'"
7
7
  TEMP_STORE = {'0' => :default, '1' => :file, '2' => :memory}.freeze
8
+ TYPES = Sequel::Schema::SQL::TYPES.merge(Bignum=>'integer')
8
9
 
9
10
  # Run all alter_table commands in a transaction. This is technically only
10
11
  # needed for drop column.
@@ -68,8 +69,15 @@ module Sequel
68
69
  end
69
70
 
70
71
  # Array of symbols specifying the table names in the current database.
71
- def tables
72
- self[:sqlite_master].filter(TABLES_FILTER).map {|r| r[:name].to_sym}
72
+ #
73
+ # Options:
74
+ # * :server - Set the server to use.
75
+ def tables(opts={})
76
+ ds = self[:sqlite_master].server(opts[:server]).filter(TABLES_FILTER)
77
+ ds.identifier_output_method = nil
78
+ ds.identifier_input_method = nil
79
+ ds2 = dataset
80
+ ds.map{|r| ds2.send(:output_identifier, r[:name])}
73
81
  end
74
82
 
75
83
  # A symbol signifying the value of the temp_store PRAGMA.
@@ -85,21 +93,22 @@ module Sequel
85
93
 
86
94
  private
87
95
 
88
- # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers by default.
89
- def upcase_identifiers_default
90
- false
96
+ # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on input.
97
+ def identifier_input_method_default
98
+ nil
91
99
  end
92
-
93
- # SQLite supports schema parsing using the table_info PRAGMA, so
94
- # parse the output of that into the format Sequel expects.
95
- def schema_parse_table(table_name, opts)
96
- parse_pragma(table_name, opts).map do |row|
97
- [row.delete(:name).to_sym, row]
98
- end
100
+
101
+ # SQLite folds unquoted identifiers to lowercase, so it shouldn't need to upcase identifiers on output.
102
+ def identifier_output_method_default
103
+ nil
99
104
  end
100
105
 
106
+ # Parse the output of the table_info pragma
101
107
  def parse_pragma(table_name, opts)
102
- self["PRAGMA table_info(?)", table_name].map do |row|
108
+ ds2 = dataset
109
+ ds = self["PRAGMA table_info(?)", ds2.send(:input_identifier, table_name)]
110
+ ds.identifier_output_method = nil
111
+ ds.map do |row|
103
112
  row.delete(:cid)
104
113
  row[:allow_null] = row.delete(:notnull).to_i == 0
105
114
  row[:default] = row.delete(:dflt_value)
@@ -110,6 +119,20 @@ module Sequel
110
119
  row
111
120
  end
112
121
  end
122
+
123
+ # SQLite supports schema parsing using the table_info PRAGMA, so
124
+ # parse the output of that into the format Sequel expects.
125
+ def schema_parse_table(table_name, opts)
126
+ ds = dataset
127
+ parse_pragma(table_name, opts).map do |row|
128
+ [ds.send(:output_identifier, row.delete(:name)), row]
129
+ end
130
+ end
131
+
132
+ # Override the standard type conversions with SQLite specific ones
133
+ def type_literal_base(column)
134
+ TYPES[column[:type]]
135
+ end
113
136
  end
114
137
 
115
138
  # Instance methods for datasets that connect to an SQLite database
@@ -132,20 +155,12 @@ module Sequel
132
155
  end
133
156
 
134
157
  # SQLite performs a TRUNCATE style DELETE if no filter is specified.
135
- # Since we want to always return the count of records, do a specific
136
- # count in the case of no filter.
158
+ # Since we want to always return the count of records, add a condition
159
+ # that is always true and then delete.
137
160
  def delete(opts = {})
138
161
  # check if no filter is specified
139
162
  opts = @opts.merge(opts)
140
- unless opts[:where]
141
- @db.transaction(opts[:server]) do
142
- unfiltered_count = count
143
- execute_dui(delete_sql(opts))
144
- unfiltered_count
145
- end
146
- else
147
- execute_dui(delete_sql(opts))
148
- end
163
+ super(opts[:where] ? opts : opts.merge(:where=>{1=>1}))
149
164
  end
150
165
 
151
166
  # Insert the values into the database.
@@ -46,6 +46,12 @@ module Sequel
46
46
  db.translator.add_translator("decimal", &prok)
47
47
  db.translator.add_translator("money", &prok)
48
48
 
49
+ # Handle floating point values with Float
50
+ prok = proc{|t,v| Float(v) rescue v}
51
+ db.translator.add_translator("float", &prok)
52
+ db.translator.add_translator("real", &prok)
53
+ db.translator.add_translator("double precision", &prok)
54
+
49
55
  db
50
56
  end
51
57
 
@@ -82,10 +88,14 @@ module Sequel
82
88
  return yield(conn) if conn.transaction_active?
83
89
  begin
84
90
  result = nil
91
+ log_info('Transaction.begin')
85
92
  conn.transaction{result = yield(conn)}
86
93
  result
87
94
  rescue ::Exception => e
95
+ log_info('Transaction.rollback')
88
96
  transaction_error(e, SQLite3::Exception)
97
+ ensure
98
+ log_info('Transaction.commit') unless e
89
99
  end
90
100
  end
91
101
  end
@@ -191,7 +201,7 @@ module Sequel
191
201
  # Yield a hash for each row in the dataset.
192
202
  def fetch_rows(sql)
193
203
  execute(sql) do |result|
194
- @columns = result.columns.map {|c| c.to_sym}
204
+ @columns = result.columns.map{|c| output_identifier(c)}
195
205
  column_count = @columns.size
196
206
  result.each do |values|
197
207
  row = {}
@@ -156,9 +156,17 @@ class Sequel::ConnectionPool
156
156
  # the server is less than the maximum size of the pool.
157
157
  def make_new(server)
158
158
  if @created_count[server] < @max_size
159
+ raise(Sequel::Error, "No connection proc specified") unless @connection_proc
160
+ begin
161
+ conn = @connection_proc.call(server)
162
+ rescue Exception=>exception
163
+ e = Sequel::DatabaseConnectionError.new("#{exception.class} #{exception.message}")
164
+ e.set_backtrace(exception.backtrace)
165
+ raise e
166
+ end
167
+ raise(Sequel::DatabaseConnectionError, "Connection parameters not valid") unless conn
159
168
  set_created_count(server, @created_count[server] + 1)
160
- @connection_proc ? @connection_proc.call(server) : \
161
- (raise Error, "No connection proc specified")
169
+ conn
162
170
  end
163
171
  end
164
172
 
@@ -157,7 +157,14 @@ end
157
157
  class Symbol
158
158
  include Sequel::SQL::QualifyingMethods
159
159
  include Sequel::SQL::IdentifierMethods
160
- include Sequel::SQL::GenericExpressionMethods
160
+ include Sequel::SQL::AliasMethods
161
+ include Sequel::SQL::CastMethods
162
+ include Sequel::SQL::OrderMethods
163
+ include Sequel::SQL::BooleanMethods
164
+ include Sequel::SQL::NumericMethods
165
+ include Sequel::SQL::StringMethods
166
+ include Sequel::SQL::ComplexExpressionMethods
167
+ include Sequel::SQL::InequalityMethods if RUBY_VERSION < '1.9.0'
161
168
 
162
169
  # If no argument is given, returns a Sequel::SQL::ColumnAll object specifying all
163
170
  # columns for this table.
@@ -169,10 +176,13 @@ class Symbol
169
176
  end
170
177
 
171
178
  # Returns a Sequel::SQL::Function with this as the function name,
172
- # and the given arguments.
173
- def [](*args)
179
+ # and the given arguments. This is aliased as Symbol#[] if ruby 1.9
180
+ # is not being used. ruby 1.9 includes Symbol#[], and Sequel
181
+ # doesn't override methods defined by ruby itself.
182
+ def sql_function(*args)
174
183
  Sequel::SQL::Function.new(self, *args)
175
184
  end
185
+ alias_method(:[], :sql_function) if RUBY_VERSION < '1.9.0'
176
186
 
177
187
  # If the given argument is an Integer or an array containing an Integer, returns
178
188
  # a Sequel::SQL::Subscript with this column and the given arg.
@@ -14,7 +14,7 @@ module Sequel
14
14
  include Schema::SQL
15
15
 
16
16
  # Array of supported database adapters
17
- ADAPTERS = %w'ado db2 dbi informix jdbc mysql odbc openbase oracle postgres sqlite'.collect{|x| x.to_sym}
17
+ ADAPTERS = %w'ado db2 dbi do firebird informix jdbc mysql odbc openbase oracle postgres sqlite'.collect{|x| x.to_sym}
18
18
 
19
19
  SQL_BEGIN = 'BEGIN'.freeze
20
20
  SQL_COMMIT = 'COMMIT'.freeze
@@ -22,22 +22,25 @@ module Sequel
22
22
 
23
23
  # Hash of adapters that have been used
24
24
  @@adapters = Hash.new
25
+
26
+ # The identifier input method to use by default
27
+ @@identifier_input_method = nil
28
+
29
+ # The identifier output method to use by default
30
+ @@identifier_output_method = nil
25
31
 
26
32
  # Whether to use the single threaded connection pool by default
27
33
  @@single_threaded = false
28
34
 
29
35
  # Whether to quote identifiers (columns and tables) by default
30
- @@quote_identifiers = true
31
-
32
- # Whether to upcase identifiers (columns and tables) by default
33
- @@upcase_identifiers = nil
36
+ @@quote_identifiers = nil
34
37
 
35
38
  # The default schema to use
36
39
  attr_accessor :default_schema
37
40
 
38
41
  # Array of SQL loggers to use for this database
39
42
  attr_accessor :loggers
40
-
43
+
41
44
  # The options for this database
42
45
  attr_reader :opts
43
46
 
@@ -46,12 +49,6 @@ module Sequel
46
49
 
47
50
  # The prepared statement objects for this database, keyed by name
48
51
  attr_reader :prepared_statements
49
-
50
- # Whether to quote identifiers (columns and tables) for this database
51
- attr_writer :quote_identifiers
52
-
53
- # Whether to upcase identifiers (columns and tables) for this database
54
- attr_writer :upcase_identifiers
55
52
 
56
53
  # Constructs a new instance of a database connection with the specified
57
54
  # options hash.
@@ -61,21 +58,26 @@ module Sequel
61
58
  # Takes the following options:
62
59
  # * :default_schema : The default schema to use, should generally be nil
63
60
  # * :disconnection_proc: A proc used to disconnect the connection.
61
+ # * :identifier_input_method: A string method symbol to call on identifiers going into the database
62
+ # * :identifier_output_method: A string method symbol to call on identifiers coming from the database
64
63
  # * :loggers : An array of loggers to use.
65
64
  # * :quote_identifiers : Whether to quote identifiers
66
65
  # * :single_threaded : Whether to use a single-threaded connection pool
66
+ # * :upcase_identifiers : Whether to upcase identifiers going into the database
67
67
  #
68
68
  # All options given are also passed to the ConnectionPool. If a block
69
69
  # is given, it is used as the connection_proc for the ConnectionPool.
70
70
  def initialize(opts = {}, &block)
71
- @opts = opts
71
+ @opts ||= opts
72
72
 
73
- @quote_identifiers = opts.include?(:quote_identifiers) ? opts[:quote_identifiers] : @@quote_identifiers
74
73
  @single_threaded = opts.include?(:single_threaded) ? opts[:single_threaded] : @@single_threaded
75
74
  @schemas = nil
76
- @default_schema = opts[:default_schema]
75
+ @default_schema = opts.include?(:default_schema) ? opts[:default_schema] : default_schema_default
77
76
  @prepared_statements = {}
78
77
  @transactions = []
78
+ if opts.include?(:upcase_identifiers)
79
+ @identifier_input_method = opts[:upcase_identifiers] ? :upcase : ""
80
+ end
79
81
  @pool = (@single_threaded ? SingleThreadedPool : ConnectionPool).new(connection_pool_default_options.merge(opts), &block)
80
82
  @pool.connection_proc = proc{|server| connect(server)} unless block
81
83
  @pool.disconnection_proc = proc{|conn| disconnect_connection(conn)} unless opts[:disconnection_proc]
@@ -119,6 +121,9 @@ module Sequel
119
121
  if conn_string =~ /\Ajdbc:/
120
122
  c = adapter_class(:jdbc)
121
123
  opts = {:uri=>conn_string}.merge(opts)
124
+ elsif conn_string =~ /\Ado:/
125
+ c = adapter_class(:do)
126
+ opts = {:uri=>conn_string}.merge(opts)
122
127
  else
123
128
  uri = URI.parse(conn_string)
124
129
  scheme = uri.scheme
@@ -150,6 +155,26 @@ module Sequel
150
155
  c.new(opts)
151
156
  end
152
157
  end
158
+
159
+ # The method to call on identifiers going into the database
160
+ def self.identifier_input_method
161
+ @@identifier_input_method
162
+ end
163
+
164
+ # Set the method to call on identifiers going into the database
165
+ def self.identifier_input_method=(v)
166
+ @@identifier_input_method = v || ""
167
+ end
168
+
169
+ # The method to call on identifiers coming from the database
170
+ def self.identifier_output_method
171
+ @@identifier_output_method
172
+ end
173
+
174
+ # Set the method to call on identifiers coming from the database
175
+ def self.identifier_output_method=(v)
176
+ @@identifier_output_method = v || ""
177
+ end
153
178
 
154
179
  # Sets the default quote_identifiers mode for new databases.
155
180
  # See Sequel.quote_identifiers=.
@@ -166,7 +191,7 @@ module Sequel
166
191
  # Sets the default quote_identifiers mode for new databases.
167
192
  # See Sequel.quote_identifiers=.
168
193
  def self.upcase_identifiers=(value)
169
- @@upcase_identifiers = value
194
+ self.identifier_input_method = value ? :upcase : nil
170
195
  end
171
196
 
172
197
  ### Private Class Methods ###
@@ -262,6 +287,12 @@ module Sequel
262
287
  execute(sql, opts, &block)
263
288
  end
264
289
 
290
+ # Method that should be used when issuing a INSERT
291
+ # statement. By default, calls execute_dui.
292
+ def execute_insert(sql, opts={}, &block)
293
+ execute_dui(sql, opts, &block)
294
+ end
295
+
265
296
  # Fetches records for an arbitrary SQL statement. If a block is given,
266
297
  # it is used to iterate over the records:
267
298
  #
@@ -296,11 +327,49 @@ module Sequel
296
327
  # DB.get(1) #=> 1
297
328
  #
298
329
  # # SELECT version()
299
- # DB.get(:version[]) #=> ...
330
+ # DB.get(:version.sql_function) #=> ...
300
331
  def get(expr)
301
332
  dataset.get(expr)
302
333
  end
303
334
 
335
+ # The method to call on identifiers going into the database
336
+ def identifier_input_method
337
+ case @identifier_input_method
338
+ when nil
339
+ @identifier_input_method = @opts.include?(:identifier_input_method) ? @opts[:identifier_input_method] : (@@identifier_input_method.nil? ? identifier_input_method_default : @@identifier_input_method)
340
+ @identifier_input_method == "" ? nil : @identifier_input_method
341
+ when ""
342
+ nil
343
+ else
344
+ @identifier_input_method
345
+ end
346
+ end
347
+
348
+ # Set the method to call on identifiers going into the database
349
+ def identifier_input_method=(v)
350
+ reset_schema_utility_dataset
351
+ @identifier_input_method = v || ""
352
+ end
353
+
354
+ # The method to call on identifiers coming from the database
355
+ def identifier_output_method
356
+ case @identifier_output_method
357
+ when nil
358
+ @identifier_output_method = @opts.include?(:identifier_output_method) ? @opts[:identifier_output_method] : (@@identifier_output_method.nil? ? identifier_output_method_default : @@identifier_output_method)
359
+ @identifier_output_method == "" ? nil : @identifier_output_method
360
+ when ""
361
+ nil
362
+ else
363
+ @identifier_output_method
364
+ end
365
+ end
366
+
367
+ # Set the method to call on identifiers coming from the database
368
+ def identifier_output_method=(v)
369
+ reset_schema_utility_dataset
370
+ @identifier_output_method = v || ""
371
+ end
372
+
304
373
  # Returns a string representation of the database object including the
305
374
  # class name and the connection URI (or the opts if the URI
306
375
  # cannot be constructed).
@@ -336,9 +405,16 @@ module Sequel
336
405
  dataset.query(&block)
337
406
  end
338
407
 
408
+ # Whether to quote identifiers (columns and tables) for this database
409
+ def quote_identifiers=(v)
410
+ reset_schema_utility_dataset
411
+ @quote_identifiers = v
412
+ end
413
+
339
414
  # Returns true if the database quotes identifiers.
340
415
  def quote_identifiers?
341
- @quote_identifiers
416
+ return @quote_identifiers unless @quote_identifiers.nil?
417
+ @quote_identifiers = @opts.include?(:quote_identifiers) ? @opts[:quote_identifiers] : (@@quote_identifiers.nil? ? quote_identifiers_default : @@quote_identifiers)
342
418
  end
343
419
 
344
420
  # Returns a new dataset with the select method invoked.
@@ -348,7 +424,7 @@ module Sequel
348
424
 
349
425
  # Default serial primary key options.
350
426
  def serial_primary_key_options
351
- {:primary_key => true, :type => :integer, :auto_increment => true}
427
+ {:primary_key => true, :type => Integer, :auto_increment => true}
352
428
  end
353
429
 
354
430
  # Returns true if the database is using a single-threaded connection pool.
@@ -485,11 +561,15 @@ module Sequel
485
561
  value
486
562
  end
487
563
  end
564
+
565
+ # Set whether to upcase identifiers going into the database.
566
+ def upcase_identifiers=(v)
567
+ self.identifier_input_method = v ? :upcase : nil
568
+ end
488
569
 
489
570
  # Returns true if the database upcases identifiers.
490
571
  def upcase_identifiers?
491
- return @upcase_identifiers unless @upcase_identifiers.nil?
492
- @upcase_identifiers = @opts.include?(:upcase_identifiers) ? @opts[:upcase_identifiers] : (@@upcase_identifiers.nil? ? upcase_identifiers_default : @@upcase_identifiers)
572
+ identifier_input_method == :upcase
493
573
  end
494
574
 
495
575
  # Returns the URI identifying the database.
@@ -511,7 +591,11 @@ module Sequel
511
591
  uri.password = @opts[:password] if uri.user
512
592
  uri.to_s
513
593
  end
514
- alias_method :url, :uri
594
+
595
+ # Explicit alias of uri for easier subclassing.
596
+ def url
597
+ uri
598
+ end
515
599
 
516
600
  private
517
601
 
@@ -530,6 +614,31 @@ module Sequel
530
614
  {}
531
615
  end
532
616
 
617
+ # The default value for default_schema.
618
+ def default_schema_default
619
+ nil
620
+ end
621
+
622
+ # The method to apply to identifiers going into the database by default.
623
+ # Should be overridden in subclasses for databases that fold unquoted
624
+ # identifiers to lower case instead of uppercase, such as
625
+ # MySQL, PostgreSQL, and SQLite.
626
+ def identifier_input_method_default
627
+ :upcase
628
+ end
629
+
630
+ # The method to apply to identifiers coming the database by default.
631
+ # Should be overridden in subclasses for databases that fold unquoted
632
+ # identifiers to lower case instead of uppercase, such as
633
+ # MySQL, PostgreSQL, and SQLite.
634
+ def identifier_output_method_default
635
+ :downcase
636
+ end
637
+
638
+ def quote_identifiers_default
639
+ true
640
+ end
641
+
533
642
  # SQL to ROLLBACK a transaction.
534
643
  def rollback_transaction_sql
535
644
  SQL_ROLLBACK
@@ -576,14 +685,6 @@ module Sequel
576
685
  def transaction_error(e, *classes)
577
686
  raise_error(e, :classes=>classes) unless Error::Rollback === e
578
687
  end
579
-
580
- # Sets whether to upcase identifiers by default. Should be
581
- # overridden in subclasses for databases that fold unquoted
582
- # identifiers to lower case instead of uppercase, such as
583
- # MySQL, PostgreSQL, and SQLite.
584
- def upcase_identifiers_default
585
- true
586
- end
587
688
  end
588
689
  end
589
690