activerecord-jdbc-alt-adapter 50.7.0-java → 51.3.0-java

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -3
  3. data/.travis.yml +24 -28
  4. data/Gemfile +5 -2
  5. data/README.md +26 -20
  6. data/Rakefile +4 -30
  7. data/activerecord-jdbc-adapter.gemspec +2 -2
  8. data/activerecord-jdbc-alt-adapter.gemspec +4 -3
  9. data/lib/arel/visitors/sqlserver.rb +17 -3
  10. data/lib/arjdbc/abstract/core.rb +4 -2
  11. data/lib/arjdbc/abstract/database_statements.rb +2 -8
  12. data/lib/arjdbc/abstract/transaction_support.rb +2 -9
  13. data/lib/arjdbc/db2/adapter.rb +2 -52
  14. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  15. data/lib/arjdbc/jdbc/column.rb +11 -5
  16. data/lib/arjdbc/jdbc/error.rb +1 -1
  17. data/lib/arjdbc/jdbc.rb +4 -0
  18. data/lib/arjdbc/mssql/adapter.rb +33 -39
  19. data/lib/arjdbc/mssql/connection_methods.rb +0 -5
  20. data/lib/arjdbc/mssql/database_statements.rb +1 -1
  21. data/lib/arjdbc/mssql/explain_support.rb +1 -1
  22. data/lib/arjdbc/mssql/{extensions.rb → extensions/attribute_methods.rb} +0 -0
  23. data/lib/arjdbc/mssql/extensions/calculations.rb +29 -0
  24. data/lib/arjdbc/mssql/schema_creation.rb +12 -0
  25. data/lib/arjdbc/mssql/schema_definitions.rb +17 -0
  26. data/lib/arjdbc/mssql/schema_dumper.rb +37 -0
  27. data/lib/arjdbc/mssql/schema_statements.rb +73 -44
  28. data/lib/arjdbc/mssql/types/date_and_time_types.rb +9 -9
  29. data/lib/arjdbc/mssql/utils.rb +1 -0
  30. data/lib/arjdbc/mssql.rb +1 -1
  31. data/lib/arjdbc/mysql/adapter.rb +12 -1
  32. data/lib/arjdbc/mysql/connection_methods.rb +7 -13
  33. data/lib/arjdbc/postgresql/adapter.rb +29 -12
  34. data/lib/arjdbc/postgresql/column.rb +3 -6
  35. data/lib/arjdbc/postgresql/connection_methods.rb +1 -3
  36. data/lib/arjdbc/postgresql/oid_types.rb +7 -12
  37. data/lib/arjdbc/sqlite3/adapter.rb +169 -139
  38. data/lib/arjdbc/sqlite3/connection_methods.rb +1 -2
  39. data/lib/arjdbc/version.rb +1 -1
  40. data/rakelib/01-tomcat.rake +2 -2
  41. data/rakelib/02-test.rake +2 -0
  42. data/rakelib/rails.rake +1 -1
  43. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +17 -68
  44. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +38 -282
  45. data/src/java/arjdbc/postgresql/ByteaUtils.java +1 -0
  46. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +3 -3
  47. data/src/java/arjdbc/util/DateTimeUtils.java +5 -22
  48. metadata +20 -12
  49. data/lib/activerecord-jdbc-alt-adapter.rb +0 -1
@@ -4,11 +4,14 @@ require "arjdbc/abstract/core"
4
4
  require "arjdbc/abstract/database_statements"
5
5
  require 'arjdbc/abstract/statement_cache'
6
6
  require "arjdbc/abstract/transaction_support"
7
+ require "active_record/connection_adapters/abstract_adapter"
7
8
  require "active_record/connection_adapters/statement_pool"
8
- require "active_record/connection_adapters/abstract/database_statements"
9
9
  require "active_record/connection_adapters/sqlite3/explain_pretty_printer"
10
10
  require "active_record/connection_adapters/sqlite3/quoting"
11
11
  require "active_record/connection_adapters/sqlite3/schema_creation"
12
+ require "active_record/connection_adapters/sqlite3/schema_definitions"
13
+ require "active_record/connection_adapters/sqlite3/schema_dumper"
14
+ require "active_record/connection_adapters/sqlite3/schema_statements"
12
15
 
13
16
  module ArJdbc
14
17
  # All the code in this module is a copy of ConnectionAdapters::SQLite3Adapter from active_record 5.
@@ -28,7 +31,10 @@ module ArJdbc
28
31
 
29
32
  ADAPTER_NAME = 'SQLite'.freeze
30
33
 
31
- include Quoting
34
+ # DIFFERENCE: FQN
35
+ include ::ActiveRecord::ConnectionAdapters::SQLite3::Quoting
36
+ include ::ActiveRecord::ConnectionAdapters::SQLite3::ColumnDumper
37
+ include ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaStatements
32
38
 
33
39
  NATIVE_DATABASE_TYPES = {
34
40
  primary_key: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL",
@@ -52,8 +58,14 @@ module ArJdbc
52
58
  end
53
59
  end
54
60
 
61
+ def update_table_definition(table_name, base) # :nodoc:
62
+ # DIFFERENCE: FQN
63
+ ::ActiveRecord::ConnectionAdapters::SQLite3::Table.new(table_name, base)
64
+ end
65
+
55
66
  def schema_creation # :nodoc:
56
- SQLite3::SchemaCreation.new self
67
+ # DIFFERENCE: FQN
68
+ ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaCreation.new self
57
69
  end
58
70
 
59
71
  def arel_visitor # :nodoc:
@@ -65,6 +77,8 @@ module ArJdbc
65
77
 
66
78
  @active = nil
67
79
  @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))
80
+
81
+ configure_connection
68
82
  end
69
83
 
70
84
  def supports_ddl_transactions?
@@ -85,17 +99,12 @@ module ArJdbc
85
99
  true
86
100
  end
87
101
 
88
- # Returns true, since this connection adapter supports migrations.
89
- def supports_migrations? #:nodoc:
90
- true
91
- end
92
-
93
- def supports_primary_key? #:nodoc:
102
+ def requires_reloading?
94
103
  true
95
104
  end
96
105
 
97
- def requires_reloading?
98
- true
106
+ def supports_foreign_keys_in_create?
107
+ sqlite_version >= "3.6.19"
99
108
  end
100
109
 
101
110
  def supports_views?
@@ -131,10 +140,6 @@ module ArJdbc
131
140
  true
132
141
  end
133
142
 
134
- def valid_type?(type)
135
- true
136
- end
137
-
138
143
  # Returns 62. SQLite supports index names up to 64
139
144
  # characters. The rest is used by Rails internally to perform
140
145
  # temporary rename operations
@@ -155,43 +160,59 @@ module ArJdbc
155
160
  true
156
161
  end
157
162
 
163
+ # REFERENTIAL INTEGRITY ====================================
164
+
165
+ def disable_referential_integrity # :nodoc:
166
+ old = query_value("PRAGMA foreign_keys")
167
+
168
+ begin
169
+ execute("PRAGMA foreign_keys = OFF")
170
+ yield
171
+ ensure
172
+ execute("PRAGMA foreign_keys = #{old}")
173
+ end
174
+ end
175
+
158
176
  #--
159
177
  # DATABASE STATEMENTS ======================================
160
178
  #++
161
179
 
162
180
  def explain(arel, binds = [])
163
181
  sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
182
+ # DIFFERENCE: FQN
164
183
  ::ActiveRecord::ConnectionAdapters::SQLite3::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", []))
165
184
  end
166
185
 
167
186
  def exec_query(sql, name = nil, binds = [], prepare: false)
168
- type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }
169
-
170
- log(sql, name, binds) do
171
- # Don't cache statements if they are not prepared
172
- unless prepare
173
- stmt = @connection.prepare(sql)
174
- begin
175
- cols = stmt.columns
176
- unless without_prepared_statement?(binds)
177
- stmt.bind_params(type_casted_binds)
187
+ type_casted_binds = type_casted_binds(binds)
188
+
189
+ log(sql, name, binds, type_casted_binds) do
190
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
191
+ # Don't cache statements if they are not prepared
192
+ unless prepare
193
+ stmt = @connection.prepare(sql)
194
+ begin
195
+ cols = stmt.columns
196
+ unless without_prepared_statement?(binds)
197
+ stmt.bind_params(type_casted_binds)
198
+ end
199
+ records = stmt.to_a
200
+ ensure
201
+ stmt.close
178
202
  end
203
+ else
204
+ cache = @statements[sql] ||= {
205
+ stmt: @connection.prepare(sql)
206
+ }
207
+ stmt = cache[:stmt]
208
+ cols = cache[:cols] ||= stmt.columns
209
+ stmt.reset!
210
+ stmt.bind_params(type_casted_binds)
179
211
  records = stmt.to_a
180
- ensure
181
- stmt.close
182
212
  end
183
- stmt = records
184
- else
185
- cache = @statements[sql] ||= {
186
- :stmt => @connection.prepare(sql)
187
- }
188
- stmt = cache[:stmt]
189
- cols = cache[:cols] ||= stmt.columns
190
- stmt.reset!
191
- stmt.bind_params(type_casted_binds)
192
- end
193
213
 
194
- ActiveRecord::Result.new(cols, stmt.to_a)
214
+ ActiveRecord::Result.new(cols, records)
215
+ end
195
216
  end
196
217
  end
197
218
 
@@ -206,7 +227,11 @@ module ArJdbc
206
227
  end
207
228
 
208
229
  def execute(sql, name = nil) #:nodoc:
209
- log(sql, name) { @connection.execute(sql) }
230
+ log(sql, name) do
231
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
232
+ @connection.execute(sql)
233
+ end
234
+ end
210
235
  end
211
236
 
212
237
  def begin_db_transaction #:nodoc:
@@ -223,80 +248,30 @@ module ArJdbc
223
248
 
224
249
  # SCHEMA STATEMENTS ========================================
225
250
 
226
- def tables(name = nil) # :nodoc:
227
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
228
- #tables currently returns both tables and views.
229
- This behavior is deprecated and will be changed with Rails 5.1 to only return tables.
230
- Use #data_sources instead.
231
- MSG
232
-
233
- if name
234
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
235
- Passing arguments to #tables is deprecated without replacement.
236
- MSG
251
+ def new_column_from_field(table_name, field) # :nondoc:
252
+ case field["dflt_value"]
253
+ when /^null$/i
254
+ field["dflt_value"] = nil
255
+ when /^'(.*)'$/m
256
+ field["dflt_value"] = $1.gsub("''", "'")
257
+ when /^"(.*)"$/m
258
+ field["dflt_value"] = $1.gsub('""', '"')
237
259
  end
238
260
 
239
- data_sources
240
- end
241
-
242
- def data_sources
243
- select_values("SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name <> 'sqlite_sequence'", "SCHEMA")
244
- end
245
-
246
- def table_exists?(table_name)
247
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
248
- #table_exists? currently checks both tables and views.
249
- This behavior is deprecated and will be changed with Rails 5.1 to only check tables.
250
- Use #data_source_exists? instead.
251
- MSG
252
-
253
- data_source_exists?(table_name)
254
- end
255
-
256
- def data_source_exists?(table_name)
257
- return false unless table_name.present?
258
-
259
- sql = "SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name <> 'sqlite_sequence'"
260
- sql << " AND name = #{quote(table_name)}"
261
-
262
- select_values(sql, "SCHEMA").any?
263
- end
264
-
265
- def views # :nodoc:
266
- select_values("SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'", "SCHEMA")
267
- end
268
-
269
- def view_exists?(view_name) # :nodoc:
270
- return false unless view_name.present?
271
-
272
- sql = "SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'"
273
- sql << " AND name = #{quote(view_name)}"
274
-
275
- select_values(sql, "SCHEMA").any?
276
- end
277
-
278
- # Returns an array of +Column+ objects for the table specified by +table_name+.
279
- def columns(table_name) # :nodoc:
280
- table_name = table_name.to_s
281
- table_structure(table_name).map do |field|
282
- case field["dflt_value"]
283
- when /^null$/i
284
- field["dflt_value"] = nil
285
- when /^'(.*)'$/m
286
- field["dflt_value"] = $1.gsub("''", "'")
287
- when /^"(.*)"$/m
288
- field["dflt_value"] = $1.gsub('""', '"')
289
- end
290
-
291
- collation = field["collation"]
292
- sql_type = field["type"]
293
- type_metadata = fetch_type_metadata(sql_type)
294
- new_column(field["name"], field["dflt_value"], type_metadata, field["notnull"].to_i == 0, table_name, nil, collation)
295
- end
261
+ collation = field["collation"]
262
+ sql_type = field["type"]
263
+ type_metadata = fetch_type_metadata(sql_type)
264
+ new_column(field["name"], field["dflt_value"], type_metadata, field["notnull"].to_i == 0, table_name, nil, collation)
296
265
  end
297
266
 
298
267
  # Returns an array of indexes for the given table.
299
268
  def indexes(table_name, name = nil) #:nodoc:
269
+ if name
270
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
271
+ Passing name to #indexes is deprecated without replacement.
272
+ MSG
273
+ end
274
+
300
275
  exec_query("PRAGMA index_list(#{quote_table_name(table_name)})", "SCHEMA").map do |row|
301
276
  sql = <<-SQL
302
277
  SELECT sql
@@ -306,17 +281,17 @@ module ArJdbc
306
281
  SELECT sql
307
282
  FROM sqlite_temp_master
308
283
  WHERE name=#{quote(row['name'])} AND type='index'
309
- SQL
284
+ SQL
310
285
  index_sql = exec_query(sql).first["sql"]
311
286
  match = /\sWHERE\s+(.+)$/i.match(index_sql)
312
287
  where = match[1] if match
313
288
  IndexDefinition.new(
314
- table_name,
315
- row["name"],
316
- row["unique"] != 0,
317
- exec_query("PRAGMA index_info('#{row['name']}')", "SCHEMA").map { |col|
318
- col["name"]
319
- }, nil, nil, where)
289
+ table_name,
290
+ row["name"],
291
+ row["unique"] != 0,
292
+ exec_query("PRAGMA index_info('#{row['name']}')", "SCHEMA").map { |col|
293
+ col["name"]
294
+ }, nil, nil, where)
320
295
  end
321
296
  end
322
297
 
@@ -346,7 +321,7 @@ module ArJdbc
346
321
  end
347
322
 
348
323
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
349
- if valid_alter_table_type?(type)
324
+ if valid_alter_table_type?(type) && !options[:primary_key]
350
325
  super(table_name, column_name, type, options)
351
326
  else
352
327
  alter_table(table_name) do |definition|
@@ -380,11 +355,10 @@ module ArJdbc
380
355
 
381
356
  def change_column(table_name, column_name, type, options = {}) #:nodoc:
382
357
  alter_table(table_name) do |definition|
383
- include_default = options_include_default?(options)
384
358
  definition[column_name].instance_eval do
385
359
  self.type = type
386
360
  self.limit = options[:limit] if options.include?(:limit)
387
- self.default = options[:default] if include_default
361
+ self.default = options[:default] if options.include?(:default)
388
362
  self.null = options[:null] if options.include?(:null)
389
363
  self.precision = options[:precision] if options.include?(:precision)
390
364
  self.scale = options[:scale] if options.include?(:scale)
@@ -399,14 +373,34 @@ module ArJdbc
399
373
  rename_column_indexes(table_name, column.name, new_column_name)
400
374
  end
401
375
 
402
- protected
376
+ def add_reference(table_name, ref_name, **options) # :nodoc:
377
+ super(table_name, ref_name, type: :integer, **options)
378
+ end
379
+ alias :add_belongs_to :add_reference
380
+
381
+ def foreign_keys(table_name)
382
+ fk_info = exec_query("PRAGMA foreign_key_list(#{quote(table_name)})", "SCHEMA")
383
+ fk_info.map do |row|
384
+ options = {
385
+ column: row["from"],
386
+ primary_key: row["to"],
387
+ on_delete: extract_foreign_key_action(row["on_delete"]),
388
+ on_update: extract_foreign_key_action(row["on_update"])
389
+ }
390
+ # DIFFERENCE: FQN
391
+ ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row["table"], options)
392
+ end
393
+ end
394
+
395
+ private
403
396
 
404
397
  def table_structure(table_name)
405
398
  structure = exec_query("PRAGMA table_info(#{quote_table_name(table_name)})", "SCHEMA")
406
399
  raise(ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'") if structure.empty?
407
400
  table_structure_with_collation(table_name, structure)
408
401
  end
409
-
402
+ alias column_definitions table_structure
403
+
410
404
  def alter_table(table_name, options = {}) #:nodoc:
411
405
  altered_table_name = "a#{table_name}"
412
406
  caller = lambda { |definition| yield definition if block_given? }
@@ -418,28 +412,31 @@ module ArJdbc
418
412
  end
419
413
  end
420
414
 
421
- def move_table(from, to, options = {}, &block) #:nodoc:
415
+ def move_table(from, to, options = {}, &block)
422
416
  copy_table(from, to, options, &block)
423
417
  drop_table(from)
424
418
  end
425
419
 
426
- def copy_table(from, to, options = {}) #:nodoc:
420
+ def copy_table(from, to, options = {})
427
421
  from_primary_key = primary_key(from)
428
422
  options[:id] = false
429
423
  create_table(to, options) do |definition|
430
424
  @definition = definition
431
- @definition.primary_key(from_primary_key) if from_primary_key.present?
425
+ if from_primary_key.is_a?(Array)
426
+ @definition.primary_keys from_primary_key
427
+ end
432
428
  columns(from).each do |column|
433
429
  column_name = options[:rename] ?
434
430
  (options[:rename][column.name] ||
435
431
  options[:rename][column.name.to_sym] ||
436
432
  column.name) : column.name
437
- next if column_name == from_primary_key
438
433
 
439
434
  @definition.column(column_name, column.type,
440
435
  limit: column.limit, default: column.default,
441
436
  precision: column.precision, scale: column.scale,
442
- null: column.null, collation: column.collation)
437
+ null: column.null, collation: column.collation,
438
+ primary_key: column_name == from_primary_key
439
+ )
443
440
  end
444
441
  yield @definition if block_given?
445
442
  end
@@ -449,9 +446,12 @@ module ArJdbc
449
446
  options[:rename] || {})
450
447
  end
451
448
 
452
- def copy_table_indexes(from, to, rename = {}) #:nodoc:
449
+ def copy_table_indexes(from, to, rename = {})
453
450
  indexes(from).each do |index|
454
451
  name = index.name
452
+ # indexes sqlite creates for internal use start with `sqlite_` and
453
+ # don't need to be copied
454
+ next if name.starts_with?("sqlite_")
455
455
  if to == "a#{from}"
456
456
  name = "t#{name}"
457
457
  elsif from == "a#{to}"
@@ -467,12 +467,13 @@ module ArJdbc
467
467
  # index name can't be the same
468
468
  opts = { name: name.gsub(/(^|_)(#{from})_/, "\\1#{to}_"), internal: true }
469
469
  opts[:unique] = true if index.unique
470
+ opts[:where] = index.where if index.where
470
471
  add_index(to, columns, opts)
471
472
  end
472
473
  end
473
474
  end
474
475
 
475
- def copy_table_contents(from, to, columns, rename = {}) #:nodoc:
476
+ def copy_table_contents(from, to, columns, rename = {})
476
477
  column_mappings = Hash[columns.map { |name| [name, name] }]
477
478
  rename.each { |a| column_mappings[a.last] = a.first }
478
479
  from_columns = columns(from).collect(&:name)
@@ -496,43 +497,51 @@ module ArJdbc
496
497
  # Older versions of SQLite return:
497
498
  # column *column_name* is not unique
498
499
  when /column(s)? .* (is|are) not unique/, /UNIQUE constraint failed: .*/
499
- RecordNotUnique.new(message)
500
+ # DIFFERENCE: FQN
501
+ ::ActiveRecord::RecordNotUnique.new(message)
502
+ when /.* may not be NULL/, /NOT NULL constraint failed: .*/
503
+ # DIFFERENCE: FQN
504
+ ::ActiveRecord::NotNullViolation.new(message)
505
+ when /FOREIGN KEY constraint failed/i
506
+ # DIFFERENCE: FQN
507
+ ::ActiveRecord::InvalidForeignKey.new(message)
500
508
  else
501
509
  super
502
510
  end
503
511
  end
504
512
 
505
- private
506
513
  COLLATE_REGEX = /.*\"(\w+)\".*collate\s+\"(\w+)\".*/i.freeze
507
514
 
508
515
  def table_structure_with_collation(table_name, basic_structure)
509
516
  collation_hash = {}
510
- sql = "SELECT sql FROM
511
- (SELECT * FROM sqlite_master UNION ALL
512
- SELECT * FROM sqlite_temp_master)
513
- WHERE type='table' and name='#{ table_name }' \;"
517
+ sql = <<-SQL
518
+ SELECT sql FROM
519
+ (SELECT * FROM sqlite_master UNION ALL
520
+ SELECT * FROM sqlite_temp_master)
521
+ WHERE type = 'table' AND name = #{quote(table_name)}
522
+ SQL
514
523
 
515
524
  # Result will have following sample string
516
525
  # CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
517
526
  # "password_digest" varchar COLLATE "NOCASE");
518
- result = exec_query(sql, 'SCHEMA').first
527
+ result = exec_query(sql, "SCHEMA").first
519
528
 
520
529
  if result
521
530
  # Splitting with left parentheses and picking up last will return all
522
531
  # columns separated with comma(,).
523
- columns_string = result["sql"].split('(').last
532
+ columns_string = result["sql"].split("(").last
524
533
 
525
- columns_string.split(',').each do |column_string|
534
+ columns_string.split(",").each do |column_string|
526
535
  # This regex will match the column name and collation type and will save
527
536
  # the value in $1 and $2 respectively.
528
- collation_hash[$1] = $2 if (COLLATE_REGEX =~ column_string)
537
+ collation_hash[$1] = $2 if COLLATE_REGEX =~ column_string
529
538
  end
530
539
 
531
540
  basic_structure.map! do |column|
532
- column_name = column['name']
541
+ column_name = column["name"]
533
542
 
534
543
  if collation_hash.has_key? column_name
535
- column['collation'] = collation_hash[column_name]
544
+ column["collation"] = collation_hash[column_name]
536
545
  end
537
546
 
538
547
  column
@@ -541,6 +550,23 @@ module ArJdbc
541
550
  basic_structure.to_hash
542
551
  end
543
552
  end
553
+
554
+ def create_table_definition(*args)
555
+ # DIFFERENCE: FQN
556
+ ::ActiveRecord::ConnectionAdapters::SQLite3::TableDefinition.new(*args)
557
+ end
558
+
559
+ def extract_foreign_key_action(specifier)
560
+ case specifier
561
+ when "CASCADE"; :cascade
562
+ when "SET NULL"; :nullify
563
+ when "RESTRICT"; :restrict
564
+ end
565
+ end
566
+
567
+ def configure_connection
568
+ execute("PRAGMA foreign_keys = ON", "SCHEMA")
569
+ end
544
570
  end
545
571
  end
546
572
 
@@ -651,10 +677,14 @@ module ActiveRecord::ConnectionAdapters
651
677
  include ArJdbc::Abstract::StatementCache
652
678
  include ArJdbc::Abstract::TransactionSupport
653
679
 
680
+ def supports_transaction_isolation?
681
+ false
682
+ end
683
+
654
684
  def begin_isolated_db_transaction(isolation)
655
685
  raise ActiveRecord::TransactionIsolationError, 'adapter does not support setting transaction isolation'
656
686
  end
657
-
687
+
658
688
  # SQLite driver doesn't support all types of insert statements with executeUpdate so
659
689
  # make it act like a regular query and the ids will be returned from #last_inserted_id
660
690
  # example: INSERT INTO "aircraft" DEFAULT VALUES
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  ArJdbc::ConnectionMethods.module_eval do
3
3
  def sqlite3_connection(config)
4
- config = config.deep_dup
5
4
  config[:adapter_spec] ||= ::ArJdbc::SQLite3
6
5
  config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter unless config.key?(:adapter_class)
7
6
 
@@ -23,7 +22,7 @@ ArJdbc::ConnectionMethods.module_eval do
23
22
  raise
24
23
  end
25
24
  end
26
-
25
+
27
26
  database = config[:database] # NOTE: "jdbc:sqlite::memory:" syntax is supported
28
27
  config[:url] ||= "jdbc:sqlite:#{database == ':memory:' ? '' : database}"
29
28
  config[:connection_alive_sql] ||= 'SELECT 1'
@@ -1,3 +1,3 @@
1
1
  module ArJdbc
2
- VERSION = '50.7.0'
2
+ VERSION = '51.3.0'
3
3
  end
@@ -1,6 +1,6 @@
1
1
  namespace :'tomcat-jndi' do # contains a FS JNDI impl (for tests)
2
2
 
3
- TOMCAT_MAVEN_REPO = 'https://repo1.maven.org/maven2/org/apache/tomcat'
3
+ TOMCAT_MAVEN_REPO = 'http://repo2.maven.org/maven2/org/apache/tomcat'
4
4
  TOMCAT_VERSION = '7.0.54'
5
5
 
6
6
  DOWNLOAD_DIR = File.expand_path('../test/jars', File.dirname(__FILE__))
@@ -48,4 +48,4 @@ namespace :'tomcat-jndi' do # contains a FS JNDI impl (for tests)
48
48
  rm jar_path if File.exist?(jar_path)
49
49
  end
50
50
 
51
- end
51
+ end
data/rakelib/02-test.rake CHANGED
@@ -76,6 +76,8 @@ end
76
76
  test_task_for adapter, :desc => "Run tests against #{adapter} (ensure driver is on class-path)"
77
77
  end
78
78
 
79
+ #test_task_for :MSSQL, :name => 'test_sqlserver', :driver => nil, :database_name => 'MS-SQL using SQLJDBC'
80
+
79
81
  test_task_for :AS400, :desc => "Run tests against AS400 (DB2) (ensure driver is on class-path)",
80
82
  :files => FileList["test/db2*_test.rb"] + FileList["test/db/db2/*_test.rb"]
81
83
 
data/rakelib/rails.rake CHANGED
@@ -57,7 +57,7 @@ namespace :rails do
57
57
  ruby_opts_string += " -C \"#{ar_path}\""
58
58
  ruby_opts_string += " -rbundler/setup"
59
59
  ruby_opts_string += " -rminitest -rminitest/excludes" unless ENV['NO_EXCLUDES'].eql?('true')
60
- file_list = ENV["TEST"] ? FileList[ ENV["TEST"].split(',') ] : test_files_finder.call
60
+ file_list = ENV["TEST"] ? FileList[ ENV["TEST"] ] : test_files_finder.call
61
61
  file_list_string = file_list.map { |fn| "\"#{fn}\"" }.join(' ')
62
62
  # test_loader_code = "-e \"ARGV.each{|f| require f}\"" # :direct
63
63
  option_list = ( ENV["TESTOPTS"] || ENV["TESTOPT"] || ENV["TEST_OPTS"] || '' )