activerecord-jdbc-alt-adapter 51.7.0-java → 52.2.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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -3
  3. data/.travis.yml +24 -28
  4. data/Gemfile +2 -3
  5. data/README.md +27 -19
  6. data/Rakefile +4 -30
  7. data/activerecord-jdbc-adapter.gemspec +2 -2
  8. data/activerecord-jdbc-alt-adapter.gemspec +4 -4
  9. data/lib/arel/visitors/sqlserver.rb +2 -1
  10. data/lib/arjdbc/abstract/core.rb +12 -2
  11. data/lib/arjdbc/abstract/database_statements.rb +22 -8
  12. data/lib/arjdbc/abstract/statement_cache.rb +1 -0
  13. data/lib/arjdbc/db2/adapter.rb +77 -8
  14. data/lib/arjdbc/db2/as400.rb +12 -0
  15. data/lib/arjdbc/db2/column.rb +3 -0
  16. data/lib/arjdbc/db2/connection_methods.rb +4 -0
  17. data/lib/arjdbc/jdbc/adapter.rb +4 -6
  18. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  19. data/lib/arjdbc/jdbc/column.rb +14 -6
  20. data/lib/arjdbc/jdbc.rb +7 -0
  21. data/lib/arjdbc/mssql/adapter.rb +20 -32
  22. data/lib/arjdbc/mssql/connection_methods.rb +1 -5
  23. data/lib/arjdbc/mssql/database_limits.rb +29 -0
  24. data/lib/arjdbc/mssql/database_statements.rb +41 -1
  25. data/lib/arjdbc/mssql/explain_support.rb +6 -1
  26. data/lib/arjdbc/mssql/quoting.rb +9 -2
  27. data/lib/arjdbc/mssql/schema_creation.rb +2 -1
  28. data/lib/arjdbc/mssql/schema_dumper.rb +1 -1
  29. data/lib/arjdbc/mssql/schema_statements.rb +11 -3
  30. data/lib/arjdbc/mssql/transaction.rb +3 -3
  31. data/lib/arjdbc/mssql.rb +1 -1
  32. data/lib/arjdbc/mysql/adapter.rb +20 -4
  33. data/lib/arjdbc/mysql/connection_methods.rb +7 -13
  34. data/lib/arjdbc/postgresql/adapter.rb +23 -20
  35. data/lib/arjdbc/postgresql/column.rb +3 -6
  36. data/lib/arjdbc/postgresql/connection_methods.rb +1 -3
  37. data/lib/arjdbc/postgresql/oid_types.rb +6 -11
  38. data/lib/arjdbc/sqlite3/adapter.rb +86 -91
  39. data/lib/arjdbc/sqlite3/connection_methods.rb +0 -1
  40. data/lib/arjdbc/tasks/database_tasks.rb +1 -0
  41. data/lib/arjdbc/tasks/sqlite_database_tasks_patch.rb +17 -0
  42. data/lib/arjdbc/version.rb +1 -1
  43. data/rakelib/01-tomcat.rake +2 -2
  44. data/rakelib/02-test.rake +2 -0
  45. data/rakelib/rails.rake +1 -1
  46. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +10 -65
  47. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +38 -282
  48. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +69 -4
  49. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +69 -13
  50. data/src/java/arjdbc/util/DateTimeUtils.java +17 -28
  51. data/src/java/arjdbc/util/PG.java +8 -0
  52. metadata +15 -12
  53. data/lib/activerecord-jdbc-alt-adapter.rb +0 -1
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  ArJdbc::ConnectionMethods.module_eval do
3
3
  def postgresql_connection(config)
4
- config = config.deep_dup
5
4
  # NOTE: this isn't "really" necessary but Rails (in tests) assumes being able to :
6
5
  # ActiveRecord::Base.postgresql_connection ActiveRecord::Base.configurations['arunit'].merge(:insert_returning => false)
7
6
  # ... while using symbols by default but than configurations returning string keys ;(
@@ -17,8 +16,7 @@ ArJdbc::ConnectionMethods.module_eval do
17
16
  ::Jdbc::Postgres.load_driver(:require) if defined?(::Jdbc::Postgres.load_driver)
18
17
  rescue LoadError # assuming driver.jar is on the class-path
19
18
  end
20
- driver = (config[:driver] ||=
21
- defined?(::Jdbc::Postgres.driver_name) ? ::Jdbc::Postgres.driver_name : 'org.postgresql.Driver')
19
+ driver = config[:driver] ||= 'org.postgresql.Driver'
22
20
 
23
21
  host = config[:host] ||= ( config[:hostaddr] || ENV['PGHOST'] || 'localhost' )
24
22
  port = config[:port] ||= ( ENV['PGPORT'] || 5432 )
@@ -88,12 +88,6 @@ module ArJdbc
88
88
  @extensions ||= super
89
89
  end
90
90
 
91
- # @override
92
- def lookup_cast_type(sql_type)
93
- oid = execute("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA")
94
- super oid.first['oid'].to_i
95
- end
96
-
97
91
  def get_oid_type(oid, fmod, column_name, sql_type = '') # :nodoc:
98
92
  if !type_map.key?(oid)
99
93
  load_additional_types(type_map, oid)
@@ -120,7 +114,7 @@ module ArJdbc
120
114
 
121
115
  private
122
116
 
123
- def initialize_type_map(m)
117
+ def initialize_type_map(m = type_map)
124
118
  register_class_with_limit m, 'int2', Type::Integer
125
119
  register_class_with_limit m, 'int4', Type::Integer
126
120
  register_class_with_limit m, 'int8', Type::Integer
@@ -136,13 +130,13 @@ module ArJdbc
136
130
  register_class_with_limit m, 'bit', OID::Bit
137
131
  register_class_with_limit m, 'varbit', OID::BitVarying
138
132
  m.alias_type 'timestamptz', 'timestamp'
139
- m.register_type 'date', Type::Date.new
133
+ m.register_type 'date', OID::Date.new
140
134
 
141
135
  m.register_type 'money', OID::Money.new
142
136
  m.register_type 'bytea', OID::Bytea.new
143
137
  m.register_type 'point', OID::Point.new
144
138
  m.register_type 'hstore', OID::Hstore.new
145
- m.register_type 'json', OID::Json.new
139
+ m.register_type 'json', Type::Json.new
146
140
  m.register_type 'jsonb', OID::Jsonb.new
147
141
  m.register_type 'cidr', OID::Cidr.new
148
142
  m.register_type 'inet', OID::Inet.new
@@ -228,7 +222,7 @@ module ArJdbc
228
222
  query += "WHERE t.typname = '%s' AND ns.nspname = ANY(current_schemas(true))" % oid
229
223
  end
230
224
  else
231
- query += initializer.query_conditions_for_initial_load(type_map)
225
+ query += initializer.query_conditions_for_initial_load
232
226
  end
233
227
 
234
228
  records = execute(query, 'SCHEMA')
@@ -242,12 +236,13 @@ module ArJdbc
242
236
  ActiveRecord::Type.register(:bit_varying, OID::BitVarying, adapter: :postgresql)
243
237
  ActiveRecord::Type.register(:binary, OID::Bytea, adapter: :postgresql)
244
238
  ActiveRecord::Type.register(:cidr, OID::Cidr, adapter: :postgresql)
239
+ ActiveRecord::Type.register(:date, OID::Date, adapter: :postgresql)
245
240
  ActiveRecord::Type.register(:datetime, OID::DateTime, adapter: :postgresql)
246
241
  ActiveRecord::Type.register(:decimal, OID::Decimal, adapter: :postgresql)
247
242
  ActiveRecord::Type.register(:enum, OID::Enum, adapter: :postgresql)
248
243
  ActiveRecord::Type.register(:hstore, OID::Hstore, adapter: :postgresql)
249
244
  ActiveRecord::Type.register(:inet, OID::Inet, adapter: :postgresql)
250
- ActiveRecord::Type.register(:json, OID::Json, adapter: :postgresql)
245
+ ActiveRecord::Type.register(:json, Type::Json, adapter: :postgresql)
251
246
  ActiveRecord::Type.register(:jsonb, OID::Jsonb, adapter: :postgresql)
252
247
  ActiveRecord::Type.register(:money, OID::Money, adapter: :postgresql)
253
248
  ActiveRecord::Type.register(:point, OID::Point, adapter: :postgresql)
@@ -12,6 +12,7 @@ require "active_record/connection_adapters/sqlite3/schema_creation"
12
12
  require "active_record/connection_adapters/sqlite3/schema_definitions"
13
13
  require "active_record/connection_adapters/sqlite3/schema_dumper"
14
14
  require "active_record/connection_adapters/sqlite3/schema_statements"
15
+ require "active_support/core_ext/class/attribute"
15
16
 
16
17
  module ArJdbc
17
18
  # All the code in this module is a copy of ConnectionAdapters::SQLite3Adapter from active_record 5.
@@ -33,11 +34,10 @@ module ArJdbc
33
34
 
34
35
  # DIFFERENCE: FQN
35
36
  include ::ActiveRecord::ConnectionAdapters::SQLite3::Quoting
36
- include ::ActiveRecord::ConnectionAdapters::SQLite3::ColumnDumper
37
37
  include ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaStatements
38
38
 
39
39
  NATIVE_DATABASE_TYPES = {
40
- primary_key: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL",
40
+ primary_key: "integer PRIMARY KEY AUTOINCREMENT NOT NULL",
41
41
  string: { name: "varchar" },
42
42
  text: { name: "text" },
43
43
  integer: { name: "integer" },
@@ -47,9 +47,13 @@ module ArJdbc
47
47
  time: { name: "time" },
48
48
  date: { name: "date" },
49
49
  binary: { name: "blob" },
50
- boolean: { name: "boolean" }
50
+ boolean: { name: "boolean" },
51
+ json: { name: "json" },
51
52
  }
52
53
 
54
+ # DIFFERENCE: class_attribute in original adapter is moved down to our section which is a class
55
+ # since we cannot define it here in the module (original source this is a class).
56
+
53
57
  class StatementPool < ConnectionAdapters::StatementPool
54
58
  private
55
59
 
@@ -58,24 +62,10 @@ module ArJdbc
58
62
  end
59
63
  end
60
64
 
61
- def update_table_definition(table_name, base) # :nodoc:
62
- # DIFFERENCE: FQN
63
- ::ActiveRecord::ConnectionAdapters::SQLite3::Table.new(table_name, base)
64
- end
65
-
66
- def schema_creation # :nodoc:
67
- # DIFFERENCE: FQN
68
- ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaCreation.new self
69
- end
70
-
71
- def arel_visitor # :nodoc:
72
- Arel::Visitors::SQLite.new(self)
73
- end
74
-
75
65
  def initialize(connection, logger, connection_options, config)
76
66
  super(connection, logger, config)
77
67
 
78
- @active = nil
68
+ @active = true
79
69
  @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))
80
70
 
81
71
  configure_connection
@@ -93,12 +83,6 @@ module ArJdbc
93
83
  sqlite_version >= "3.8.0"
94
84
  end
95
85
 
96
- # Returns true, since this connection adapter supports prepared statement
97
- # caching.
98
- def supports_statement_cache?
99
- true
100
- end
101
-
102
86
  def requires_reloading?
103
87
  true
104
88
  end
@@ -120,7 +104,7 @@ module ArJdbc
120
104
  end
121
105
 
122
106
  def active?
123
- @active != false
107
+ @active
124
108
  end
125
109
 
126
110
  # Disconnects from the database if already connected. Otherwise, this
@@ -248,53 +232,6 @@ module ArJdbc
248
232
 
249
233
  # SCHEMA STATEMENTS ========================================
250
234
 
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('""', '"')
259
- end
260
-
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)
265
- end
266
-
267
- # Returns an array of indexes for the given table.
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
-
275
- exec_query("PRAGMA index_list(#{quote_table_name(table_name)})", "SCHEMA").map do |row|
276
- sql = <<-SQL
277
- SELECT sql
278
- FROM sqlite_master
279
- WHERE name=#{quote(row['name'])} AND type='index'
280
- UNION ALL
281
- SELECT sql
282
- FROM sqlite_temp_master
283
- WHERE name=#{quote(row['name'])} AND type='index'
284
- SQL
285
- index_sql = exec_query(sql).first["sql"]
286
- match = /\sWHERE\s+(.+)$/i.match(index_sql)
287
- where = match[1] if match
288
- IndexDefinition.new(
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)
295
- end
296
- end
297
-
298
235
  def primary_keys(table_name) # :nodoc:
299
236
  pks = table_structure(table_name).select { |f| f["pk"] > 0 }
300
237
  pks.sort_by { |f| f["pk"] }.map { |f| f["name"] }
@@ -314,19 +251,20 @@ module ArJdbc
314
251
  rename_table_indexes(table_name, new_name)
315
252
  end
316
253
 
317
- # See: http://www.sqlite.org/lang_altertable.html
318
- # SQLite has an additional restriction on the ALTER TABLE statement
319
- def valid_alter_table_type?(type)
320
- type.to_sym != :primary_key
254
+ # DIFFERENCE: deprecated causes a JRuby 9.1 bug where "super" calls itself -> do inline
255
+ def valid_alter_table_type?(type, options = {})
256
+ ActiveSupport::Deprecation.deprecation_warning(__method__)
257
+ !invalid_alter_table_type?(type, options)
321
258
  end
259
+ #deprecate :valid_alter_table_type?
322
260
 
323
261
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
324
- if valid_alter_table_type?(type) && !options[:primary_key]
325
- super(table_name, column_name, type, options)
326
- else
262
+ if invalid_alter_table_type?(type, options)
327
263
  alter_table(table_name) do |definition|
328
264
  definition.column(column_name, type, options)
329
265
  end
266
+ else
267
+ super
330
268
  end
331
269
  end
332
270
 
@@ -391,8 +329,32 @@ module ArJdbc
391
329
  ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row["table"], options)
392
330
  end
393
331
  end
332
+
333
+ def insert_fixtures(rows, table_name)
334
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
335
+ `insert_fixtures` is deprecated and will be removed in the next version of Rails.
336
+ Consider using `insert_fixtures_set` for performance improvement.
337
+ MSG
338
+ insert_fixtures_set(table_name => rows)
339
+ end
340
+
341
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
342
+ disable_referential_integrity do
343
+ transaction(requires_new: true) do
344
+ tables_to_delete.each { |table| delete "DELETE FROM #{quote_table_name(table)}", "Fixture Delete" }
345
+
346
+ fixture_set.each do |table_name, rows|
347
+ rows.each { |row| insert_fixture(row, table_name) }
348
+ end
349
+ end
350
+ end
351
+ end
394
352
 
395
353
  private
354
+ def initialize_type_map(m = type_map)
355
+ super
356
+ register_class_with_limit m, %r(int)i, SQLite3Integer
357
+ end
396
358
 
397
359
  def table_structure(table_name)
398
360
  structure = exec_query("PRAGMA table_info(#{quote_table_name(table_name)})", "SCHEMA")
@@ -400,7 +362,13 @@ module ArJdbc
400
362
  table_structure_with_collation(table_name, structure)
401
363
  end
402
364
  alias column_definitions table_structure
403
-
365
+
366
+ # See: https://www.sqlite.org/lang_altertable.html
367
+ # SQLite has an additional restriction on the ALTER TABLE statement
368
+ def invalid_alter_table_type?(type, options)
369
+ type.to_sym == :primary_key || options[:primary_key]
370
+ end
371
+
404
372
  def alter_table(table_name, options = {}) #:nodoc:
405
373
  altered_table_name = "a#{table_name}"
406
374
  caller = lambda { |definition| yield definition if block_given? }
@@ -551,23 +519,28 @@ module ArJdbc
551
519
  end
552
520
  end
553
521
 
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
522
+ def arel_visitor
523
+ Arel::Visitors::SQLite.new(self)
565
524
  end
566
525
 
567
526
  def configure_connection
568
527
  execute("PRAGMA foreign_keys = ON", "SCHEMA")
569
528
  end
529
+
530
+ # DIFFERENCE: FQN
531
+ class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
532
+ private
533
+ def _limit
534
+ # INTEGER storage class can be stored 8 bytes value.
535
+ # See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
536
+ limit || 8
537
+ end
538
+ end
539
+
540
+ # DIFFERENCE: FQN
541
+ ::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
570
542
  end
543
+ # DIFFERENCE: A registration here is moved down to concrete class so we are not registering part of an adapter.
571
544
  end
572
545
 
573
546
  module ActiveRecord::ConnectionAdapters
@@ -677,6 +650,25 @@ module ActiveRecord::ConnectionAdapters
677
650
  include ArJdbc::Abstract::StatementCache
678
651
  include ArJdbc::Abstract::TransactionSupport
679
652
 
653
+ # Note: This is part of original AR sqlite3_adapter.rb and not an override by us. This is to just
654
+ # work around our copy of Sqlite3Adapter being a module above and not a class.
655
+ ##
656
+ # :singleton-method:
657
+ # Indicates whether boolean values are stored in sqlite3 databases as 1
658
+ # and 0 or 't' and 'f'. Leaving <tt>ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer</tt>
659
+ # set to false is deprecated. SQLite databases have used 't' and 'f' to
660
+ # serialize boolean values and must have old data converted to 1 and 0
661
+ # (its native boolean serialization) before setting this flag to true.
662
+ # Conversion can be accomplished by setting up a rake task which runs
663
+ #
664
+ # ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1)
665
+ # ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)
666
+ # for all models and all boolean columns, after which the flag must be set
667
+ # to true by adding the following to your <tt>application.rb</tt> file:
668
+ #
669
+ # Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
670
+ class_attribute :represent_boolean_as_integer, default: false
671
+
680
672
  def supports_transaction_isolation?
681
673
  false
682
674
  end
@@ -704,5 +696,8 @@ module ActiveRecord::ConnectionAdapters
704
696
  def self.jdbc_connection_class
705
697
  ::ActiveRecord::ConnectionAdapters::SQLite3JdbcConnection
706
698
  end
699
+
700
+ # Note: This is not an override of ours but a moved line from AR Sqlite3Adapter to register ours vs our copied module (which would be their class).
701
+ # ActiveSupport.run_load_hooks(:active_record_sqlite3adapter, SQLite3Adapter)
707
702
  end
708
703
  end
@@ -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
 
@@ -9,6 +9,7 @@ module ArJdbc
9
9
  register_tasks(/mariadb/, ActiveRecord::Tasks::MySQLDatabaseTasks)
10
10
 
11
11
  require 'arjdbc/tasks/jdbc_database_tasks'
12
+ require 'arjdbc/tasks/sqlite_database_tasks_patch'
12
13
  require 'arjdbc/tasks/mssql_database_tasks'
13
14
  #require 'arjdbc/tasks/db2_database_tasks'
14
15
  #require 'arjdbc/tasks/derby_database_tasks'
@@ -0,0 +1,17 @@
1
+ # patch SQLiteDatabaseTasks for JRuby
2
+ # The problem is that JRuby does not yet support the "out:" option for
3
+ # Kernel.system(). Uses plain output redirection as a workaround.
4
+
5
+ require 'active_record/tasks/sqlite_database_tasks'
6
+ require 'shellwords'
7
+
8
+ module ActiveRecord
9
+ module Tasks
10
+ class SQLiteDatabaseTasks
11
+ private
12
+ def run_cmd(cmd, args, out)
13
+ `#{cmd} #{Shellwords.join(args)} > "#{out}"`
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module ArJdbc
2
- VERSION = '51.7.0'
2
+ VERSION = '52.2.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"] || '' )
@@ -487,7 +487,7 @@ public class RubyJdbcConnection extends RubyObject {
487
487
  savepoint = ((IRubyObject) savepoint).toJava(Savepoint.class);
488
488
  }
489
489
 
490
- releaseSavepoint(connection, (Savepoint) savepoint);
490
+ connection.releaseSavepoint((Savepoint) savepoint);
491
491
  return context.nil;
492
492
  }
493
493
  catch (SQLException e) {
@@ -495,11 +495,6 @@ public class RubyJdbcConnection extends RubyObject {
495
495
  }
496
496
  }
497
497
 
498
- // MSSQL doesn't support releasing savepoints so we make it possible to override the actual release action
499
- protected void releaseSavepoint(final Connection connection, final Savepoint savepoint) throws SQLException {
500
- connection.releaseSavepoint(savepoint);
501
- }
502
-
503
498
  protected static RuntimeException newSavepointNotSetError(final ThreadContext context, final IRubyObject name, final String op) {
504
499
  RubyClass StatementInvalid = ActiveRecord(context).getClass("StatementInvalid");
505
500
  return context.runtime.newRaiseException(StatementInvalid, "could not " + op + " savepoint: '" + name + "' (not set)");
@@ -727,10 +722,7 @@ public class RubyJdbcConnection extends RubyObject {
727
722
 
728
723
  private void connectImpl(final boolean forceConnection) throws SQLException {
729
724
  setConnection( forceConnection ? newConnection() : null );
730
- if (forceConnection) {
731
- if (getConnectionImpl() == null) throw new SQLException("Didn't get a connection. Wrong URL?");
732
- configureConnection();
733
- }
725
+ if ( forceConnection ) configureConnection();
734
726
  }
735
727
 
736
728
  @JRubyMethod(name = "read_only?")
@@ -888,31 +880,15 @@ public class RubyJdbcConnection extends RubyObject {
888
880
  return mapQueryResult(context, connection, resultSet);
889
881
  }
890
882
 
891
- private static String[] createStatementPk(IRubyObject pk) {
892
- String[] statementPk;
893
- if (pk instanceof RubyArray) {
894
- RubyArray ary = (RubyArray) pk;
895
- int size = ary.size();
896
- statementPk = new String[size];
897
- for (int i = 0; i < size; i++) {
898
- statementPk[i] = sqlString(ary.eltInternal(i));
899
- }
900
- } else {
901
- statementPk = new String[] { sqlString(pk) };
902
- }
903
- return statementPk;
904
- }
905
-
906
883
  /**
907
884
  * Executes an INSERT SQL statement
908
885
  * @param context
909
886
  * @param sql
910
- * @param pk Rails PK
911
887
  * @return ActiveRecord::Result
912
888
  * @throws SQLException
913
889
  */
914
- @JRubyMethod(name = "execute_insert_pk", required = 2)
915
- public IRubyObject execute_insert_pk(final ThreadContext context, final IRubyObject sql, final IRubyObject pk) {
890
+ @JRubyMethod(name = "execute_insert", required = 1)
891
+ public IRubyObject execute_insert(final ThreadContext context, final IRubyObject sql) {
916
892
  return withConnection(context, new Callable<IRubyObject>() {
917
893
  public IRubyObject call(final Connection connection) throws SQLException {
918
894
  Statement statement = null;
@@ -920,13 +896,7 @@ public class RubyJdbcConnection extends RubyObject {
920
896
  try {
921
897
 
922
898
  statement = createStatement(context, connection);
923
-
924
- if (pk == context.nil || pk == context.fals || !supportsGeneratedKeys(connection)) {
925
- statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
926
- } else {
927
- statement.executeUpdate(query, createStatementPk(pk));
928
- }
929
-
899
+ statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
930
900
  return mapGeneratedKeys(context, connection, statement);
931
901
 
932
902
  } catch (final SQLException e) {
@@ -939,35 +909,23 @@ public class RubyJdbcConnection extends RubyObject {
939
909
  });
940
910
  }
941
911
 
942
- @Deprecated
943
- @JRubyMethod(name = "execute_insert", required = 1)
944
- public IRubyObject execute_insert(final ThreadContext context, final IRubyObject sql) {
945
- return execute_insert_pk(context, sql, context.nil);
946
- }
947
-
948
912
  /**
949
913
  * Executes an INSERT SQL statement using a prepared statement
950
914
  * @param context
951
915
  * @param sql
952
916
  * @param binds RubyArray of values to be bound to the query
953
- * @param pk Rails PK
954
917
  * @return ActiveRecord::Result
955
918
  * @throws SQLException
956
919
  */
957
- @JRubyMethod(name = "execute_insert_pk", required = 3)
958
- public IRubyObject execute_insert_pk(final ThreadContext context, final IRubyObject sql, final IRubyObject binds,
959
- final IRubyObject pk) {
920
+ @JRubyMethod(name = "execute_insert", required = 2)
921
+ public IRubyObject execute_insert(final ThreadContext context, final IRubyObject sql, final IRubyObject binds) {
960
922
  return withConnection(context, new Callable<IRubyObject>() {
961
923
  public IRubyObject call(final Connection connection) throws SQLException {
962
924
  PreparedStatement statement = null;
963
925
  final String query = sqlString(sql);
964
926
  try {
965
- if (pk == context.nil || pk == context.fals || !supportsGeneratedKeys(connection)) {
966
- statement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
967
- } else {
968
- statement = connection.prepareStatement(query, createStatementPk(pk));
969
- }
970
927
 
928
+ statement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
971
929
  setStatementParameters(context, connection, statement, (RubyArray) binds);
972
930
  statement.executeUpdate();
973
931
  return mapGeneratedKeys(context, connection, statement);
@@ -982,12 +940,6 @@ public class RubyJdbcConnection extends RubyObject {
982
940
  });
983
941
  }
984
942
 
985
- @Deprecated
986
- @JRubyMethod(name = "execute_insert", required = 2)
987
- public IRubyObject execute_insert(final ThreadContext context, final IRubyObject binds, final IRubyObject sql) {
988
- return execute_insert_pk(context, sql, binds, context.nil);
989
- }
990
-
991
943
  /**
992
944
  * Executes an UPDATE (DELETE) SQL statement
993
945
  * @param context
@@ -2947,9 +2899,8 @@ public class RubyJdbcConnection extends RubyObject {
2947
2899
  value = value.callMethod(context, "to_date");
2948
2900
  }
2949
2901
 
2950
- // NOTE: Here we rely in ActiveRecord (ActiveSupport) to get
2951
- // the date as a string in the database format.
2952
- statement.setDate(index, Date.valueOf(value.callMethod(context, "to_s", context.runtime.newSymbol("db")).toString()));
2902
+ // NOTE: assuming Date#to_s does right ...
2903
+ statement.setDate(index, Date.valueOf(value.toString()));
2953
2904
  }
2954
2905
 
2955
2906
  protected void setBooleanParameter(final ThreadContext context,
@@ -3976,12 +3927,6 @@ public class RubyJdbcConnection extends RubyObject {
3976
3927
  }
3977
3928
  }
3978
3929
 
3979
- public static void debugMessage(final ThreadContext context, final IRubyObject obj) {
3980
- if ( isDebug(context.runtime) ) {
3981
- debugMessage(context.runtime, obj.callMethod(context, "inspect"));
3982
- }
3983
- }
3984
-
3985
3930
  public static void debugMessage(final Ruby runtime, final String msg, final Object e) {
3986
3931
  if ( isDebug(runtime) ) {
3987
3932
  final PrintStream out = runtime != null ? runtime.getOut() : System.out;