activerecord-jdbc-alt-adapter 61.2.0-java → 70.0.0.rc1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +273 -0
  3. data/.gitignore +1 -0
  4. data/.travis.yml +3 -4
  5. data/Gemfile +8 -6
  6. data/README.md +2 -1
  7. data/Rakefile +1 -1
  8. data/activerecord-jdbc-adapter.gemspec +2 -2
  9. data/activerecord-jdbc-alt-adapter.gemspec +2 -2
  10. data/lib/arel/visitors/compat.rb +5 -33
  11. data/lib/arel/visitors/h2.rb +1 -13
  12. data/lib/arel/visitors/hsqldb.rb +1 -21
  13. data/lib/arel/visitors/sql_server.rb +2 -103
  14. data/lib/arjdbc/abstract/core.rb +8 -9
  15. data/lib/arjdbc/abstract/database_statements.rb +4 -4
  16. data/lib/arjdbc/discover.rb +0 -67
  17. data/lib/arjdbc/hsqldb/adapter.rb +2 -2
  18. data/lib/arjdbc/jdbc/adapter.rb +3 -3
  19. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  20. data/lib/arjdbc/jdbc/adapter_require.rb +3 -1
  21. data/lib/arjdbc/jdbc/column.rb +1 -26
  22. data/lib/arjdbc/jdbc/type_cast.rb +2 -2
  23. data/lib/arjdbc/jdbc.rb +0 -7
  24. data/lib/arjdbc/mssql/adapter.rb +134 -105
  25. data/lib/arjdbc/mssql/connection_methods.rb +0 -3
  26. data/lib/arjdbc/mssql/quoting.rb +26 -27
  27. data/lib/arjdbc/mssql/schema_creation.rb +1 -1
  28. data/lib/arjdbc/mssql/schema_definitions.rb +32 -17
  29. data/lib/arjdbc/mssql/schema_dumper.rb +13 -1
  30. data/lib/arjdbc/mssql/schema_statements.rb +61 -36
  31. data/lib/arjdbc/mssql/transaction.rb +2 -2
  32. data/lib/arjdbc/mssql/types/date_and_time_types.rb +6 -6
  33. data/lib/arjdbc/mssql/types/numeric_types.rb +2 -2
  34. data/lib/arjdbc/mssql.rb +1 -1
  35. data/lib/arjdbc/mysql/adapter.rb +2 -1
  36. data/lib/arjdbc/oracle/adapter.rb +4 -23
  37. data/lib/arjdbc/postgresql/adapter.rb +64 -1
  38. data/lib/arjdbc/postgresql/oid_types.rb +68 -47
  39. data/lib/arjdbc/sqlite3/adapter.rb +132 -88
  40. data/lib/arjdbc/tasks/database_tasks.rb +0 -12
  41. data/lib/arjdbc/util/serialized_attributes.rb +0 -22
  42. data/lib/arjdbc/util/table_copier.rb +2 -1
  43. data/lib/arjdbc/version.rb +1 -1
  44. data/rakelib/02-test.rake +3 -18
  45. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +17 -2
  46. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +33 -0
  47. metadata +8 -40
  48. data/lib/active_record/connection_adapters/as400_adapter.rb +0 -2
  49. data/lib/active_record/connection_adapters/db2_adapter.rb +0 -1
  50. data/lib/active_record/connection_adapters/derby_adapter.rb +0 -1
  51. data/lib/active_record/connection_adapters/informix_adapter.rb +0 -1
  52. data/lib/arel/visitors/db2.rb +0 -137
  53. data/lib/arel/visitors/derby.rb +0 -112
  54. data/lib/arel/visitors/firebird.rb +0 -79
  55. data/lib/arjdbc/db2/adapter.rb +0 -808
  56. data/lib/arjdbc/db2/as400.rb +0 -142
  57. data/lib/arjdbc/db2/column.rb +0 -131
  58. data/lib/arjdbc/db2/connection_methods.rb +0 -48
  59. data/lib/arjdbc/db2.rb +0 -4
  60. data/lib/arjdbc/derby/active_record_patch.rb +0 -13
  61. data/lib/arjdbc/derby/adapter.rb +0 -521
  62. data/lib/arjdbc/derby/connection_methods.rb +0 -20
  63. data/lib/arjdbc/derby/schema_creation.rb +0 -15
  64. data/lib/arjdbc/derby.rb +0 -3
  65. data/lib/arjdbc/firebird/adapter.rb +0 -413
  66. data/lib/arjdbc/firebird/connection_methods.rb +0 -23
  67. data/lib/arjdbc/firebird.rb +0 -4
  68. data/lib/arjdbc/informix/adapter.rb +0 -139
  69. data/lib/arjdbc/informix/connection_methods.rb +0 -9
  70. data/lib/arjdbc/sybase/adapter.rb +0 -47
  71. data/lib/arjdbc/sybase.rb +0 -2
  72. data/lib/arjdbc/tasks/db2_database_tasks.rb +0 -104
  73. data/lib/arjdbc/tasks/derby_database_tasks.rb +0 -95
  74. data/src/java/arjdbc/derby/DerbyModule.java +0 -178
  75. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +0 -152
  76. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +0 -174
  77. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +0 -75
@@ -1,413 +0,0 @@
1
- ArJdbc.load_java_part :Firebird
2
-
3
- require 'arel/visitors/firebird'
4
-
5
- module ArJdbc
6
- module Firebird
7
-
8
- # @private
9
- def self.extended(adapter); initialize!; end
10
-
11
- # @private
12
- @@_initialized = nil
13
-
14
- # @private
15
- def self.initialize!
16
- return if @@_initialized; @@_initialized = true
17
-
18
- require 'arjdbc/util/serialized_attributes'
19
- Util::SerializedAttributes.setup /blob/i
20
- end
21
-
22
- # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
23
- def self.jdbc_connection_class
24
- ::ActiveRecord::ConnectionAdapters::FirebirdJdbcConnection
25
- end
26
-
27
- # @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
28
- def self.column_selector
29
- [ /firebird/i, lambda { |cfg, column| column.extend(Column) } ]
30
- end
31
-
32
- # @see ActiveRecord::ConnectionAdapters::JdbcColumn
33
- module Column
34
-
35
- def default_value(value)
36
- return nil unless value
37
- if value =~ /^\s*DEFAULT\s+(.*)\s*$/i
38
- return $1 unless $1.upcase == 'NULL'
39
- end
40
- end
41
- end
42
-
43
- # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
44
- def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::FirebirdColumn end
45
-
46
- # @private
47
- @@emulate_booleans = true
48
-
49
- # Boolean emulation can be disabled using :
50
- #
51
- # ArJdbc::Firebird.emulate_booleans = false
52
- #
53
- def self.emulate_booleans?; @@emulate_booleans; end
54
- # @deprecated Use {#emulate_booleans?} instead.
55
- def self.emulate_booleans; @@emulate_booleans; end
56
- # @see #emulate_booleans?
57
- def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
58
-
59
-
60
- @@update_lob_values = true
61
-
62
- # Updating records with LOB values (binary/text columns) in a separate
63
- # statement can be disabled using :
64
- #
65
- # ArJdbc::Firebird.update_lob_values = false
66
- def self.update_lob_values?; @@update_lob_values; end
67
- # @see #update_lob_values?
68
- def self.update_lob_values=(update); @@update_lob_values = update; end
69
-
70
- # @see #update_lob_values?
71
- def update_lob_values?; Firebird.update_lob_values?; end
72
-
73
- # @see #quote
74
- # @private
75
- BLOB_VALUE_MARKER = "''"
76
-
77
- ADAPTER_NAME = 'Firebird'.freeze
78
-
79
- def adapter_name
80
- ADAPTER_NAME
81
- end
82
-
83
- NATIVE_DATABASE_TYPES = {
84
- :primary_key => "integer not null primary key",
85
- :string => { :name => "varchar", :limit => 255 },
86
- :text => { :name => "blob sub_type text" },
87
- :integer => { :name => "integer" },
88
- :float => { :name => "float" },
89
- :datetime => { :name => "timestamp" },
90
- :timestamp => { :name => "timestamp" },
91
- :time => { :name => "time" },
92
- :date => { :name => "date" },
93
- :binary => { :name => "blob" },
94
- :boolean => { :name => 'char', :limit => 1 },
95
- :numeric => { :name => "numeric" },
96
- :decimal => { :name => "decimal" },
97
- :char => { :name => "char" },
98
- }
99
-
100
- def native_database_types
101
- NATIVE_DATABASE_TYPES
102
- end
103
-
104
- def initialize_type_map(m)
105
- register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary
106
- register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text
107
-
108
- register_class_with_limit m, %r(date(?:\(.*?\))?$)i, DateType
109
- register_class_with_limit m, %r(time(?:\(.*?\))?$)i, ActiveRecord::Type::Time
110
-
111
- register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float
112
- register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer
113
-
114
- m.alias_type %r(blob)i, 'binary'
115
- m.alias_type %r(clob)i, 'text'
116
- m.alias_type %r(double)i, 'float'
117
-
118
- m.register_type(%r(decimal)i) do |sql_type|
119
- scale = extract_scale(sql_type)
120
- precision = extract_precision(sql_type)
121
- if scale == 0
122
- ActiveRecord::Type::Integer.new(precision: precision)
123
- else
124
- ActiveRecord::Type::Decimal.new(precision: precision, scale: scale)
125
- end
126
- end
127
- m.alias_type %r(numeric)i, 'decimal'
128
-
129
- register_class_with_limit m, %r(varchar)i, ActiveRecord::Type::String
130
-
131
- m.register_type(%r(^char)i) do |sql_type|
132
- precision = extract_precision(sql_type)
133
- if Firebird.emulate_booleans? && precision == 1
134
- ActiveRecord::Type::Boolean.new
135
- else
136
- ActiveRecord::Type::String.new(:precision => precision)
137
- end
138
- end
139
-
140
- register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime
141
- register_class_with_limit m, %r(timestamp)i, TimestampType
142
- end if AR42
143
-
144
- def clear_cache!
145
- super
146
- reload_type_map
147
- end if AR42
148
-
149
- # @private
150
- class DateType < ActiveRecord::Type::Date
151
- # NOTE: quote still gets called ...
152
- #def type_cast_for_database(value)
153
- # if value.acts_like?(:date)
154
- # "'#{value.strftime("%Y-%m-%d")}'"
155
- # else
156
- # super
157
- # end
158
- #end
159
- end if AR42
160
-
161
- # @private
162
- class TimestampType < ActiveRecord::Type::DateTime
163
- def type; :timestamp end
164
- end if AR42
165
-
166
- def type_to_sql(type, limit = nil, precision = nil, scale = nil)
167
- case type
168
- when :integer
169
- case limit
170
- when nil then 'integer'
171
- when 1..2 then 'smallint'
172
- when 3..4 then 'integer'
173
- when 5..8 then 'bigint'
174
- else raise(ActiveRecordError, "No integer type has byte size #{limit}. "<<
175
- "Use a NUMERIC with PRECISION 0 instead.")
176
- end
177
- when :float
178
- if limit.nil? || limit <= 4
179
- 'float'
180
- else
181
- 'double precision'
182
- end
183
- else super
184
- end
185
- end
186
-
187
- # Does this adapter support migrations?
188
- def supports_migrations?
189
- true
190
- end
191
-
192
- # Can this adapter determine the primary key for tables not attached
193
- # to an Active Record class, such as join tables?
194
- def supports_primary_key?
195
- true
196
- end
197
-
198
- # Does this adapter support DDL rollbacks in transactions? That is, would
199
- # CREATE TABLE or ALTER TABLE get rolled back by a transaction? PostgreSQL,
200
- # SQL Server, and others support this. MySQL and others do not.
201
- def supports_ddl_transactions?
202
- false
203
- end
204
-
205
- # Does this adapter restrict the number of IDs you can use in a list.
206
- # Oracle has a limit of 1000.
207
- def ids_in_list_limit
208
- 1499
209
- end
210
-
211
- def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
212
- execute(sql, name, binds)
213
- id_value
214
- end
215
-
216
- def add_limit_offset!(sql, options)
217
- if limit = options[:limit]
218
- insert_limit_offset!(sql, limit, options[:offset])
219
- end
220
- end
221
-
222
- # @private
223
- SELECT_RE = /\A(\s*SELECT\s)/i
224
-
225
- def insert_limit_offset!(sql, limit, offset)
226
- lim_off = ''
227
- lim_off << "FIRST #{limit}" if limit
228
- lim_off << " SKIP #{offset}" if offset
229
- lim_off.strip!
230
-
231
- sql.sub!(SELECT_RE, "\\&#{lim_off} ") unless lim_off.empty?
232
- end
233
-
234
- # Should primary key values be selected from their corresponding
235
- # sequence before the insert statement?
236
- # @see #next_sequence_value
237
- # @override
238
- def prefetch_primary_key?(table_name = nil)
239
- return true if table_name.nil?
240
- primary_keys(table_name.to_s).size == 1
241
- # columns(table_name).count { |column| column.primary } == 1
242
- end
243
-
244
- IDENTIFIER_LENGTH = 31 # usual DB meta-identifier: 31 chars maximum
245
-
246
- def table_alias_length; IDENTIFIER_LENGTH; end
247
- def table_name_length; IDENTIFIER_LENGTH; end
248
- def index_name_length; IDENTIFIER_LENGTH; end
249
- def column_name_length; IDENTIFIER_LENGTH; end
250
-
251
- def default_sequence_name(table_name, column = nil)
252
- len = IDENTIFIER_LENGTH - 4
253
- table_name.to_s.gsub (/(^|\.)([\w$-]{1,#{len}})([\w$-]*)$/), '\1\2_seq'
254
- end
255
-
256
- # Set the sequence to the max value of the table's column.
257
- def reset_sequence!(table, column, sequence = nil)
258
- max_id = select_value("SELECT max(#{column}) FROM #{table}")
259
- execute("ALTER SEQUENCE #{default_sequence_name(table, column)} RESTART WITH #{max_id}")
260
- end
261
-
262
- def next_sequence_value(sequence_name)
263
- select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"]
264
- end
265
-
266
- def create_table(name, options = {})
267
- super(name, options)
268
- execute "CREATE GENERATOR #{default_sequence_name(name)}"
269
- end
270
-
271
- def rename_table(name, new_name)
272
- execute "RENAME #{name} TO #{new_name}"
273
- name_seq, new_name_seq = default_sequence_name(name), default_sequence_name(new_name)
274
- execute_quietly "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name_seq}' WHERE RDB$GENERATOR_NAME='#{name_seq}'"
275
- end
276
-
277
- def drop_table(name, options = {})
278
- super(name)
279
- execute_quietly "DROP GENERATOR #{default_sequence_name(name)}"
280
- end
281
-
282
- def change_column(table_name, column_name, type, options = {})
283
- execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
284
- end
285
-
286
- def rename_column(table_name, column_name, new_column_name)
287
- execute "ALTER TABLE #{table_name} ALTER #{column_name} TO #{new_column_name}"
288
- end
289
-
290
- def remove_index(table_name, options)
291
- execute "DROP INDEX #{index_name(table_name, options)}"
292
- end
293
-
294
- # @override
295
- def quote(value, column = nil)
296
- return value.quoted_id if value.respond_to?(:quoted_id)
297
- return value if sql_literal?(value)
298
-
299
- type = column && column.type
300
-
301
- # BLOBs are updated separately by an after_save trigger.
302
- if type == :binary || type == :text
303
- if update_lob_values?
304
- return value.nil? ? "NULL" : BLOB_VALUE_MARKER
305
- else
306
- return "'#{quote_string(value)}'"
307
- end
308
- end
309
-
310
- case value
311
- when String, ActiveSupport::Multibyte::Chars
312
- value = value.to_s
313
- if type == :integer
314
- value.to_i.to_s
315
- elsif type == :float
316
- value.to_f.to_s
317
- else
318
- "'#{quote_string(value)}'"
319
- end
320
- when NilClass then 'NULL'
321
- when TrueClass then (type == :integer ? '1' : quoted_true)
322
- when FalseClass then (type == :integer ? '0' : quoted_false)
323
- when Float, Fixnum, Bignum then value.to_s
324
- # BigDecimals need to be output in a non-normalized form and quoted.
325
- when BigDecimal then value.to_s('F')
326
- when Symbol then "'#{quote_string(value.to_s)}'"
327
- else
328
- if type == :time && value.acts_like?(:time)
329
- return "'#{get_time(value).strftime("%H:%M:%S")}'"
330
- end
331
- if type == :date && value.acts_like?(:date)
332
- return "'#{value.strftime("%Y-%m-%d")}'"
333
- end
334
- super
335
- end
336
- end
337
-
338
- # @override
339
- def quoted_date(value)
340
- if value.acts_like?(:time) && value.respond_to?(:usec)
341
- usec = sprintf "%04d", (value.usec / 100.0).round
342
- value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal
343
- "#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}"
344
- else
345
- super
346
- end
347
- end if ::ActiveRecord::VERSION::MAJOR >= 3
348
-
349
- # @override
350
- def quote_string(string)
351
- string.gsub(/'/, "''")
352
- end
353
-
354
- # @override
355
- def quoted_true
356
- quote(1)
357
- end
358
-
359
- # @override
360
- def quoted_false
361
- quote(0)
362
- end
363
-
364
- # @override
365
- def quote_table_name_for_assignment(table, attr)
366
- quote_column_name(attr)
367
- end if ::ActiveRecord::VERSION::MAJOR >= 4
368
-
369
- # @override
370
- def quote_column_name(column_name)
371
- column_name = column_name.to_s
372
- %Q("#{column_name =~ /[[:upper:]]/ ? column_name : column_name.upcase}")
373
- end
374
-
375
- end
376
- FireBird = Firebird
377
- end
378
-
379
- require 'arjdbc/util/quoted_cache'
380
-
381
- module ActiveRecord::ConnectionAdapters
382
-
383
- remove_const(:FirebirdAdapter) if const_defined?(:FirebirdAdapter)
384
-
385
- class FirebirdAdapter < JdbcAdapter
386
- include ::ArJdbc::Firebird
387
- include ::ArJdbc::Util::QuotedCache
388
-
389
- # By default, the FirebirdAdapter will consider all columns of type
390
- # <tt>char(1)</tt> as boolean. If you wish to disable this :
391
- #
392
- # ActiveRecord::ConnectionAdapters::FirebirdAdapter.emulate_booleans = false
393
- #
394
- def self.emulate_booleans?; ::ArJdbc::Firebird.emulate_booleans?; end
395
- def self.emulate_booleans; ::ArJdbc::Firebird.emulate_booleans?; end
396
- def self.emulate_booleans=(emulate); ::ArJdbc::Firebird.emulate_booleans = emulate; end
397
-
398
- def initialize(*args)
399
- ::ArJdbc::Firebird.initialize!
400
- super
401
- end
402
-
403
- def arel_visitor
404
- Arel::Visitors::Firebird.new(self)
405
- end
406
-
407
- end
408
-
409
- class FirebirdColumn < JdbcColumn
410
- include ::ArJdbc::Firebird::Column
411
- end
412
-
413
- end
@@ -1,23 +0,0 @@
1
- ArJdbc::ConnectionMethods.module_eval do
2
- def firebird_connection(config)
3
- config[:adapter_spec] ||= ::ArJdbc::Firebird
4
-
5
- return jndi_connection(config) if jndi_config?(config)
6
-
7
- begin
8
- require 'jdbc/firebird'
9
- ::Jdbc::Firebird.load_driver(:require)
10
- rescue LoadError # assuming driver.jar is on the class-path
11
- end
12
-
13
- config[:host] ||= 'localhost'
14
- config[:port] ||= 3050
15
- config[:url] ||= begin
16
- "jdbc:firebirdsql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
17
- end
18
- config[:driver] ||= ::Jdbc::Firebird.driver_name
19
-
20
- jdbc_connection(config)
21
- end
22
- # alias_method :jdbcfirebird_connection, :firebird_connection
23
- end
@@ -1,4 +0,0 @@
1
- require 'arjdbc'
2
- require 'arjdbc/firebird/adapter'
3
- require 'arjdbc/firebird/connection_methods'
4
- ArJdbc.warn_unsupported_adapter 'firebird', [4, 2] # warns on AR >= 4.2
@@ -1,139 +0,0 @@
1
- require 'arjdbc/util/serialized_attributes'
2
-
3
- module ArJdbc
4
- module Informix
5
-
6
- @@_lob_callback_added = nil
7
-
8
- def self.extended(base)
9
- unless @@_lob_callback_added
10
- ActiveRecord::Base.class_eval do
11
- def after_save_with_informix_lob
12
- lob_columns = self.class.columns.select { |c| [:text, :binary].include?(c.type) }
13
- lob_columns.each do |column|
14
- value = ::ArJdbc::SerializedAttributesHelper.dump_column_value(self, column)
15
- next if value.nil? || (value == '')
16
-
17
- connection.write_large_object(
18
- column.type == :binary, column.name,
19
- self.class.table_name, self.class.primary_key,
20
- quote_value(id), value
21
- )
22
- end
23
- end
24
- end
25
-
26
- ActiveRecord::Base.after_save :after_save_with_informix_lob
27
- @@_lob_callback_added = true
28
- end
29
- end
30
-
31
- JdbcConnection = ::ActiveRecord::ConnectionAdapters::InformixJdbcConnection
32
-
33
- # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
34
- def self.jdbc_connection_class
35
- ::ActiveRecord::ConnectionAdapters::InformixJdbcConnection
36
- end
37
-
38
- # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
39
- def jdbc_column_class
40
- ::ActiveRecord::ConnectionAdapters::InformixColumn
41
- end
42
-
43
- def modify_types(types)
44
- super(types)
45
- types[:primary_key] = "SERIAL PRIMARY KEY"
46
- types[:string] = { :name => "VARCHAR", :limit => 255 }
47
- types[:integer] = { :name => "INTEGER" }
48
- types[:float] = { :name => "FLOAT" }
49
- types[:decimal] = { :name => "DECIMAL" }
50
- types[:datetime] = { :name => "DATETIME YEAR TO FRACTION(5)" }
51
- types[:timestamp] = { :name => "DATETIME YEAR TO FRACTION(5)" }
52
- types[:time] = { :name => "DATETIME HOUR TO FRACTION(5)" }
53
- types[:date] = { :name => "DATE" }
54
- types[:binary] = { :name => "BYTE" }
55
- types[:boolean] = { :name => "BOOLEAN" }
56
- types
57
- end
58
-
59
- def prefetch_primary_key?(table_name = nil)
60
- true
61
- end
62
-
63
- def supports_migrations?
64
- true
65
- end
66
-
67
- def default_sequence_name(table, column)
68
- "#{table}_seq"
69
- end
70
-
71
- def add_limit_offset!(sql, options)
72
- if options[:limit]
73
- limit = "FIRST #{options[:limit]}" # SKIP available only in IDS >= 10 :
74
- offset = (db_major_version >= 10 && options[:offset] ? "SKIP #{options[:offset]}" : "")
75
- sql.sub!(/^\s*?select /i, "SELECT #{offset} #{limit} ")
76
- end
77
- sql
78
- end
79
-
80
- def next_sequence_value(sequence_name)
81
- select_one("SELECT #{sequence_name}.nextval id FROM systables WHERE tabid=1")['id']
82
- end
83
-
84
- # TODO: Add some smart quoting for newlines in string and text fields.
85
- def quote_string(string)
86
- string.gsub(/\'/, "''")
87
- end
88
-
89
- def quote(value, column = nil)
90
- column_type = column && column.type
91
- if column_type == :binary || column_type == :text
92
- # LOBs are updated separately by an after_save trigger.
93
- "NULL"
94
- elsif column_type == :date
95
- "'#{value.mon}/#{value.day}/#{value.year}'"
96
- else
97
- super
98
- end
99
- end
100
-
101
- def create_table(name, options = {})
102
- super(name, options)
103
- execute("CREATE SEQUENCE #{name}_seq")
104
- end
105
-
106
- def rename_table(name, new_name)
107
- execute("RENAME TABLE #{name} TO #{new_name}")
108
- execute("RENAME SEQUENCE #{name}_seq TO #{new_name}_seq")
109
- end
110
-
111
- def drop_table(name)
112
- super(name)
113
- execute("DROP SEQUENCE #{name}_seq")
114
- end
115
-
116
- def remove_index(table_name, options = {})
117
- @connection.execute_update("DROP INDEX #{index_name(table_name, options)}")
118
- end
119
-
120
- def select(sql, *rest)
121
- # Informix does not like "= NULL", "!= NULL", or "<> NULL".
122
- super(sql.gsub(/(!=|<>)\s*null/i, "IS NOT NULL").gsub(/=\s*null/i, "IS NULL"), *rest)
123
- end
124
-
125
- private
126
-
127
- def db_major_version
128
- @@db_major_version ||=
129
- select_one("SELECT dbinfo('version', 'major') version FROM systables WHERE tabid = 1")['version'].to_i
130
- end
131
-
132
- end # module Informix
133
- end # module ::ArJdbc
134
-
135
- module ActiveRecord::ConnectionAdapters
136
- class InformixAdapter < JdbcAdapter
137
- include ::ArJdbc::Informix
138
- end
139
- end
@@ -1,9 +0,0 @@
1
- ArJdbc::ConnectionMethods.module_eval do
2
- def informix_connection(config)
3
- config[:port] ||= 9088
4
- config[:url] ||= "jdbc:informix-sqli://#{config[:host]}:#{config[:port]}/#{config[:database]}:INFORMIXSERVER=#{config[:servername]}"
5
- config[:driver] = 'com.informix.jdbc.IfxDriver'
6
- config[:adapter_spec] = ::ArJdbc::Informix
7
- jdbc_connection(config)
8
- end
9
- end
@@ -1,47 +0,0 @@
1
- module ArJdbc
2
- module Sybase
3
- def add_limit_offset!(sql, options) # :nodoc:
4
- @limit = options[:limit]
5
- @offset = options[:offset]
6
- if use_temp_table?
7
- # Use temp table to hack offset with Sybase
8
- sql.sub!(/ FROM /i, ' INTO #artemp FROM ')
9
- elsif zero_limit?
10
- # "SET ROWCOUNT 0" turns off limits, so we havesy
11
- # to use a cheap trick.
12
- if sql =~ /WHERE/i
13
- sql.sub!(/WHERE/i, 'WHERE 1 = 2 AND ')
14
- elsif sql =~ /ORDER\s+BY/i
15
- sql.sub!(/ORDER\s+BY/i, 'WHERE 1 = 2 ORDER BY')
16
- else
17
- sql << 'WHERE 1 = 2'
18
- end
19
- end
20
- end
21
-
22
- # If limit is not set at all, we can ignore offset;
23
- # if limit *is* set but offset is zero, use normal select
24
- # with simple SET ROWCOUNT. Thus, only use the temp table
25
- # if limit is set and offset > 0.
26
- def use_temp_table?
27
- !@limit.nil? && !@offset.nil? && @offset > 0
28
- end
29
-
30
- def zero_limit?
31
- !@limit.nil? && @limit == 0
32
- end
33
-
34
- def modify_types(types) # :nodoc:
35
- super(types)
36
- types[:primary_key] = "NUMERIC(22,0) IDENTITY PRIMARY KEY"
37
- types[:integer][:limit] = nil
38
- types[:boolean] = {:name => "bit"}
39
- types[:binary] = {:name => "image"}
40
- types
41
- end
42
-
43
- def remove_index(table_name, options = {})
44
- execute "DROP INDEX #{table_name}.#{index_name(table_name, options)}"
45
- end
46
- end
47
- end
data/lib/arjdbc/sybase.rb DELETED
@@ -1,2 +0,0 @@
1
- require 'arjdbc'
2
- require 'arjdbc/sybase/adapter'