activerecord-jdbc-alt-adapter 51.7.0-java → 52.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bac3f491bd6e25ce779db381c70f8de2bcfc566f7d7add71c73453d4b9d96da
4
- data.tar.gz: 5e3cdf41dde39ac86a39d6d21057ede60c0fa321aa9e1164cc5c13c1b6584800
3
+ metadata.gz: 7b4f2f45217c4f0c6288ef6375f304b68a243adfe3a436c06c101e24d50e1ec5
4
+ data.tar.gz: 2304823483354e2e1c2cd2d5eae14325e7980da104e0e3b717fd373daa8c01ad
5
5
  SHA512:
6
- metadata.gz: 28c69d682d31b0c159bf4fbc309699c0c362696e7edff789e1a51304284407dd09f4f63bf0d97bd460616378b3456cad4535c7fef4c19d607a92ccb962c8d80d
7
- data.tar.gz: d83167a275cc51a6715f9a019d8df7519c6bb35d531466fe2e0c61191150238f20c70f9ae233a85e5ad31f89ae61b2f28d9c1fb2b7a17e2591c2ca2ccf529b1b
6
+ metadata.gz: ad807e645ff8175d8822ab5ffd32ca5f80a67d7a056987e15297611efeec5161a4dae42cc1a40dbcba71ae09df169c16f7f5c3591d0eb068bb8d8e7bf80385f3
7
+ data.tar.gz: c16e63f118c4a4609516e6f43c7bf0fcf17521bde1ab0e7587a500049863473f59eeeeca9d3c4882da38b546a8387338c8ffd1bc210bfd7b28aad595bc1e2f10
data/.gitignore CHANGED
@@ -2,7 +2,6 @@
2
2
  *.tgz
3
3
  *~
4
4
  *.log
5
- /log/
6
5
  patches*
7
6
  *#
8
7
  TAGS
@@ -34,5 +33,3 @@ activerecord-jdbc.iml
34
33
  lib/arjdbc/jdbc/adapter_java.jar
35
34
  .jrubyrc
36
35
  tags
37
- .ruby-version
38
- pik.sh
data/.travis.yml CHANGED
@@ -1,27 +1,18 @@
1
+ language: ruby
1
2
  sudo: false
2
- dist: xenial
3
-
4
- services:
5
- - mysql
6
- addons:
7
- postgresql: 9.4
8
-
3
+ branches:
4
+ only:
5
+ - master
6
+ - /.*-stable$/
7
+ - /^test-.*/
8
+ - /maintenance|support/
9
+ - /.*dev$/
10
+ bundler_args: --without development
11
+ script: bundle exec rake ${TEST_PREFIX}test_$DB
9
12
  before_install:
10
13
  - unset _JAVA_OPTIONS
11
14
  - rvm @default,@global do gem uninstall bundler -a -x -I || true
12
15
  - gem install bundler -v "~>1.17.3"
13
- install:
14
- - bundle install --retry 3 --without development
15
- # to fix this issue: https://travis-ci.community/t/mariadb-10-1-fails-to-install-on-xenial/3151/3
16
- - mysql -u root -e 'CREATE USER IF NOT EXISTS travis@localhost; GRANT ALL ON *.* TO travis@localhost;' || true
17
-
18
- language: ruby
19
- rvm:
20
- - jruby-9.1.16.0
21
- jdk:
22
- - openjdk8
23
-
24
- script: bundle exec rake ${TEST_PREFIX}test_$DB
25
16
  before_script:
26
17
  - echo "JAVA_OPTS=$JAVA_OPTS"
27
18
  - export JRUBY_OPTS="-J-Xms64M -J-Xmx1024M"
@@ -47,7 +38,12 @@ before_script:
47
38
  psql -c "create database activerecord_unittest;" -U postgres && \
48
39
  psql -c "create database activerecord_unittest2;" -U postgres \
49
40
  || true
50
-
41
+ rvm:
42
+ - jruby-9.1.16.0
43
+ jdk:
44
+ - openjdk8
45
+ addons:
46
+ postgresql: "9.4"
51
47
  env:
52
48
  - DB=mysql2 PREPARED_STATEMENTS=false
53
49
  - DB=mysql2 PREPARED_STATEMENTS=true
@@ -90,15 +86,15 @@ matrix:
90
86
  env: DB=sqlite3
91
87
  # testing against MariaDB
92
88
  - addons:
93
- mariadb: 10.2
89
+ mariadb: '10.0'
94
90
  env: DB=mariadb PREPARED_STATEMENTS=false
95
91
  - addons:
96
- mariadb: 10.3
92
+ mariadb: '10.1'
97
93
  env: DB=mariadb PREPARED_STATEMENTS=true
98
94
  # Rails test-suite :
99
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.1.7" # PS off by default
100
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.1.7" PREPARED_STATEMENTS=true
101
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.1.7" DRIVER=MariaDB
102
- - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.1.7" # PS on by default
103
- - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.1.7" PREPARED_STATEMENTS=false
104
- - env: DB=sqlite3 TEST_PREFIX="rails:" AR_VERSION="v5.1.7"
95
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.2.3" # PS off by default
96
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.2.3" PREPARED_STATEMENTS=true
97
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.2.3" DRIVER=MariaDB
98
+ - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.2.3" # PS on by default
99
+ - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.2.3" PREPARED_STATEMENTS=false
100
+ - env: DB=sqlite3 TEST_PREFIX="rails:" AR_VERSION="v5.2.3"
data/Gemfile CHANGED
@@ -48,14 +48,13 @@ group :test do
48
48
  gem 'mocha', '~> 1.2', require: false # Rails has '~> 0.14'
49
49
 
50
50
  gem 'bcrypt', '~> 3.1.11', require: false
51
- gem 'jdbc-mssql', '~> 0.7.0', require: nil
51
+ gem 'jdbc-mssql', '~> 0.6.0', require: nil
52
52
  # gem 'pry-debugger-jruby', platform: :jruby
53
53
  end
54
54
 
55
55
  group :rails do
56
56
  group :test do
57
- # FIX: Our test suite isn't ready to run in random order yet.
58
- gem 'minitest', '< 5.3.4', require: nil
57
+ gem 'minitest', '~> 5.11.3', require: nil
59
58
  gem 'minitest-excludes', '~> 2.0.1', require: nil
60
59
  gem 'minitest-rg', require: nil
61
60
 
data/README.md CHANGED
@@ -6,13 +6,16 @@ supported by the original adapter such as PostgreSQL but it is advised to
6
6
  use the [original adapter](https://github.com/jruby/active)
7
7
 
8
8
  This adapter only works with JRuby and it is advised to install the latest
9
- stable versins of Rails
9
+ stable versions of Rails
10
10
 
11
11
  - For Rails `5.0.7.2` install the `50.3.1` version of this adapter
12
12
  - For Rails `5.1.7` install the `51.3.0` version of this adapter
13
+ - For Rails `5.2.3` install the `52.2.0` version of this adapter
13
14
 
14
- Support for Rails 5.2 is planned in the near future.
15
+ Support for Rails 6.0 is planned in the future.
15
16
 
17
+ This adapter passes most of the Rails tests (ActiveRecord tests) with the
18
+ exception of some test that are not compatible with the SQL Server
16
19
 
17
20
  ### How to use it:
18
21
 
@@ -99,7 +102,7 @@ production:
99
102
  ```
100
103
 
101
104
 
102
- ### WARNING
105
+ ### NOTE
103
106
 
104
107
  Keep one eye in the Rails connection pool, we have not thoroughly tested that
105
108
  part since we don't use the default Rails connection pool, other than that
@@ -114,20 +117,26 @@ this adapter should just work.
114
117
  ActiveRecord-JDBC-Adapter (AR-JDBC) is the main database adapter for Rails'
115
118
  *ActiveRecord* component that can be used with [JRuby][0].
116
119
  ActiveRecord-JDBC-Adapter provides full or nearly full support for:
117
- **MySQL**, **PostgreSQL**, **SQLite3** and **MSSQL*** (SQLServer).
118
-
119
- Unless we get more contributions we will not be supporting more adapters.
120
- Note that the amount of work needed to get another adapter is not huge but
121
- the amount of testing required to make sure that adapter continues to work
122
- is not something we can do with the resources we currently have.
123
-
124
- - for **Oracle** database users you are encouraged to use
125
- https://github.com/rsim/oracle-enhanced
126
- - **MSSQL** adapter's gem parts reside in a [separate repository][8]
127
-
128
- Version **50.x** supports Rails version 5.0.x and it lives on branch 50-stable.
129
- Version **51.x** supports Rails version 5.1.x and is currently on master until
130
- its first release. The minimum version of JRuby for 50+ is JRuby **9.1.x** and
120
+ **MySQL**, **PostgreSQL**, **SQLite3**. In the near future there are plans to
121
+ add support **MSSQL**. Unless we get more contributions we will not be going
122
+ beyond these four adapters. Note that the amount of work needed to get
123
+ another adapter is not huge but the amount of testing required to make sure
124
+ that adapter continues to work is not something we can do with the resources
125
+ we currently have.
126
+
127
+ For Oracle database users you are encouraged to use
128
+ https://github.com/rsim/oracle-enhanced.
129
+
130
+ Versions are targeted at certain versions of Rails and live on their own branches.
131
+
132
+ | Gem Version | Rails Version | Branch |
133
+ | ----------- | ------------- | ------ |
134
+ | 50.x | 5.0.x | 50-stable |
135
+ | 51.x | 5.1.x | 51-stable |
136
+ | 52.x | 5.2.x | 52-stable |
137
+ | future | latest | master |
138
+
139
+ The minimum version of JRuby for 50+ is JRuby **9.1.x** and
131
140
  JRuby 9.1+ requires Java 7 or newer (we recommend Java 8 at minimum).
132
141
 
133
142
  ## Using ActiveRecord JDBC
@@ -142,7 +151,6 @@ adapters are available:
142
151
  - MySQL (`activerecord-jdbcmysql-adapter`)
143
152
  - PostgreSQL (`activerecord-jdbcpostgresql-adapter`)
144
153
  - SQLite3 (`activerecord-jdbcsqlite3-adapter`)
145
- - MSSQL (`activerecord-jdbcsqlserver-adapter`)
146
154
 
147
155
  2. If you're generating a new Rails application, use the following command:
148
156
 
@@ -277,4 +285,4 @@ license the database's drivers are licensed. See each driver gem's LICENSE.txt.
277
285
  [5]: https://github.com/jruby/activerecord-jdbc-adapter/wiki
278
286
  [6]: https://webchat.freenode.net/?channels=#jruby
279
287
  [7]: http://badge.fury.io/rb/activerecord-jdbc-adapter
280
- [8]: https://github.com/jruby/activerecord-jdbcsqlserver-adapter
288
+ [8]: https://github.com/jruby/activerecord-jdbc-adapter/wiki/Migrating-from-1.2.x-to-1.3.0
data/Rakefile CHANGED
@@ -1,29 +1,3 @@
1
- # Common usage
2
- #
3
- # rake build:adapters - to build all specific adapter gems and the base gem
4
- # rake release:do - build:adapters + git tag + push gems
5
- #
6
- # Environment variables used by this Rakefile:
7
- #
8
- # INCLUDE_JAR_IN_GEM [default task - false, other taks - true]:
9
- # Note: This is something you should not normally have to set.
10
- # For local development we always will end up including the jar file
11
- # in any task which generates our main gem. The wrinkle to this
12
- # is when we do a custom github link in bundler:
13
- #
14
- # gem 'ar-jdbc', github: '...'
15
- #
16
- # Because we stopped committing a .jar file for every change and so when
17
- # we include a gem like this it clones the repository and does a default
18
- # build in rake. This in turn will end up forcing a compile to generate
19
- # that jar (similar to how c-extensions compile at the time of install).
20
- # For shipped gems we do include the jar so that people do not require
21
- # this compile step.
22
- #
23
- # NOOP [release:do - false]
24
- #
25
- # No commands or gem pushing during a release.
26
-
27
1
  require 'rake/clean'
28
2
 
29
3
  CLEAN.include 'derby*', 'test.db.*', '*test.sqlite3', 'test/reports'
@@ -64,8 +38,7 @@ rake = lambda { |task| ruby "-S", "rake", task }
64
38
 
65
39
  desc "Build #{gem_name} gem into the pkg directory."
66
40
  task :build => :jar do
67
- include_jar = ENV['INCLUDE_JAR_IN_GEM'] || 'true'
68
- sh("INCLUDE_JAR_IN_GEM=#{include_jar} gem build -V '#{gemspec_path}'") do
41
+ sh("RELEASE=#{ENV['RELEASE']} gem build -V '#{gemspec_path}'") do
69
42
  gem_path = built_gem_path.call
70
43
  file_name = File.basename(gem_path)
71
44
  FileUtils.mkdir_p(File.join(base_dir, 'pkg'))
@@ -85,6 +58,7 @@ end
85
58
 
86
59
  desc "Releasing AR-JDBC gems (use NOOP=true to disable gem pushing)"
87
60
  task 'release:do' do
61
+ ENV['RELEASE'] = 'true' # so that .gemspec is built with adapter_java.jar
88
62
  Rake::Task['build'].invoke
89
63
  # Rake::Task['build:adapters'].invoke
90
64
 
@@ -283,7 +257,7 @@ if defined? JRUBY_VERSION
283
257
  begin
284
258
  require 'arjdbc/version'
285
259
  rescue LoadError
286
- path = File.expand_path('lib', File.dirname(__FILE__))
260
+ path = File.expand_path('../lib', File.dirname(__FILE__))
287
261
  unless $LOAD_PATH.include?(path)
288
262
  $LOAD_PATH << path; retry
289
263
  end
@@ -323,7 +297,7 @@ if defined? JRUBY_VERSION
323
297
  # class_files.gsub!('$', '\$') unless windows?
324
298
  # args = class_files.map { |path| [ "-C #{classes_dir}", path ] }.flatten
325
299
 
326
- if ENV['INCLUDE_JAR_IN_GEM'] == 'true'; require 'tempfile'
300
+ if ENV['RELEASE'] == 'true'; require 'tempfile'
327
301
  manifest = "Built-Time: #{Time.now.utc.strftime('%Y-%m-%d %H:%M:%S')}\n"
328
302
  manifest += "Built-JRuby: #{JRUBY_VERSION}\n"
329
303
  manifest += "Specification-Title: ActiveRecord-JDBC\n"
@@ -27,7 +27,7 @@ Gem::Specification.new do |gem|
27
27
  reject { |f| f =~ /^(gemfiles)/ } # no tests - no Gemfile_s appraised ...
28
28
  gem.files += ['lib/arjdbc/jdbc/adapter_java.jar'] #if ENV['RELEASE'].eql?('true')
29
29
 
30
- if ENV['INCLUDE_JAR_IN_GEM'] != 'true' # @see Rakefile
30
+ if ENV['RELEASE'] != 'true' # @see Rakefile
31
31
  gem.extensions << 'Rakefile' # to support auto-building .jar with :git paths
32
32
 
33
33
  #gem.add_runtime_dependency 'jar-dependencies', '~> 0.1' # development not enough!
@@ -44,7 +44,7 @@ Gem::Specification.new do |gem|
44
44
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
45
45
  gem.test_files = gem.files.grep(%r{^test/})
46
46
 
47
- gem.add_dependency 'activerecord', '~> 5.1.0'
47
+ gem.add_dependency 'activerecord', '~> 5.2.0'
48
48
 
49
49
  #gem.add_development_dependency 'test-unit', '2.5.4'
50
50
  #gem.add_development_dependency 'test-unit-context', '>= 0.3.0'
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.license = 'BSD-2-Clause'
12
12
  gem.summary = 'ActiveRecord JDBC adapter, for use within JRuby on Rails and SQL Server'
13
13
  gem.description = "" <<
14
- "Fork of the ActiveRecord JDBC adapter with support for SQL Server and Azure SQL, " <<
14
+ "Fork of the ActiveRecord JDBC adapter with support for SQL Server/Azure SQL, " <<
15
15
  "for more information and help look at the README file in the github repository. " <<
16
16
  "AR-JDBC is a database adapter for Rails' ActiveRecord component designed " <<
17
17
  "to be used with JRuby built upon Java's JDBC API for database access. " <<
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
19
19
  "as well as adapters for popular databases such as Oracle, SQLServer, " <<
20
20
  "DB2, FireBird and even Java (embed) databases: Derby, HSQLDB and H2. " <<
21
21
  "It allows to connect to virtually any JDBC-compliant database with your " <<
22
- "JRuby on Rails application. This fork supports SQL Server/Azure SQL."
22
+ "JRuby on Rails application."
23
23
 
24
24
  gem.require_paths = ["lib"]
25
25
 
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
29
29
  reject { |f| f =~ /^(gemfiles)/ } # no tests - no Gemfile_s appraised ...
30
30
  gem.files += ['lib/arjdbc/jdbc/adapter_java.jar'] #if ENV['RELEASE'].eql?('true')
31
31
 
32
- if ENV['INCLUDE_JAR_IN_GEM'] != 'true' # @see Rakefile
32
+ if ENV['RELEASE'] != 'true' # @see Rakefile
33
33
  gem.extensions << 'Rakefile' # to support auto-building .jar with :git paths
34
34
 
35
35
  #gem.add_runtime_dependency 'jar-dependencies', '~> 0.1' # development not enough!
@@ -46,7 +46,7 @@ Gem::Specification.new do |gem|
46
46
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
47
47
  gem.test_files = gem.files.grep(%r{^test/})
48
48
 
49
- gem.add_dependency 'activerecord', '~> 5.1.0', '>= 5.1.7'
49
+ gem.add_dependency 'activerecord', '~> 5.2.0', '>= 5.2.3'
50
50
 
51
51
  #gem.add_development_dependency 'test-unit', '2.5.4'
52
52
  #gem.add_development_dependency 'test-unit-context', '>= 0.3.0'
@@ -18,7 +18,7 @@ module Arel
18
18
 
19
19
  def visit_Arel_Nodes_BindParam o, collector
20
20
  # collector.add_bind(o) { |i| "@#{i-1}" }
21
- collector.add_bind(o) { |i| '?' }
21
+ collector.add_bind(o.value) { |i| '?' }
22
22
  end
23
23
 
24
24
  def visit_Arel_Nodes_Bin o, collector
@@ -212,6 +212,7 @@ module Arel
212
212
  def primary_Key_From_Table t
213
213
  return unless t
214
214
  # column_name = schema_cache.primary_keys(t.name) || column_cache(t.name).first.try(:second).try(:name)
215
+ # NOTE: for table name aliases columns_hash('table_alias') requires to return an empty hash.
215
216
  column_name = @connection.schema_cache.primary_keys(t.name) ||
216
217
  @connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
217
218
  column_name ? t[column_name] : nil
@@ -56,7 +56,7 @@ module ArJdbc
56
56
  case e
57
57
  when SystemExit, SignalException, NoMemoryError then e
58
58
  when ActiveModel::RangeError, TypeError, RuntimeError then e
59
- else super
59
+ else ActiveRecord::StatementInvalid.new(message)
60
60
  end
61
61
  end
62
62
 
@@ -73,4 +73,14 @@ module ArJdbc
73
73
  end
74
74
  end
75
75
  end
76
- end
76
+
77
+ module LogSubscriber
78
+ JDBC_GEM_ROOT = File.expand_path("../../../..", __FILE__) + "/"
79
+
80
+ # Remove this gem from log trace so that query shows where it was called in application
81
+ def ignored_callstack(path)
82
+ super || path.start_with?(JDBC_GEM_ROOT)
83
+ end
84
+ end
85
+ ActiveRecord::LogSubscriber.prepend(ArJdbc::LogSubscriber)
86
+ end
@@ -10,13 +10,11 @@ module ArJdbc
10
10
  NO_BINDS = [].freeze
11
11
 
12
12
  def exec_insert(sql, name = nil, binds = NO_BINDS, pk = nil, sequence_name = nil)
13
- binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
14
-
15
13
  if without_prepared_statement?(binds)
16
- log(sql, name) { @connection.execute_insert_pk(sql, pk) }
14
+ log(sql, name) { @connection.execute_insert(sql) }
17
15
  else
18
16
  log(sql, name, binds) do
19
- @connection.execute_insert_pk(sql, binds, pk)
17
+ @connection.execute_insert(sql, binds)
20
18
  end
21
19
  end
22
20
  end
@@ -24,8 +22,6 @@ module ArJdbc
24
22
  # It appears that at this point (AR 5.0) "prepare" should only ever be true
25
23
  # if prepared statements are enabled
26
24
  def exec_query(sql, name = nil, binds = NO_BINDS, prepare: false)
27
- binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
28
-
29
25
  if without_prepared_statement?(binds)
30
26
  log(sql, name) { @connection.execute_query(sql) }
31
27
  else
@@ -38,8 +34,6 @@ module ArJdbc
38
34
  end
39
35
 
40
36
  def exec_update(sql, name = nil, binds = NO_BINDS)
41
- binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
42
-
43
37
  if without_prepared_statement?(binds)
44
38
  log(sql, name) { @connection.execute_update(sql) }
45
39
  else
@@ -48,10 +42,30 @@ module ArJdbc
48
42
  end
49
43
  alias :exec_delete :exec_update
50
44
 
45
+ # overridden to support legacy binds
46
+ def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
47
+ binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
48
+ super
49
+ end
50
+ alias create insert
51
+
52
+ # overridden to support legacy binds
53
+ def update(arel, name = nil, binds = [])
54
+ binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
55
+ super
56
+ end
57
+
58
+ # overridden to support legacy binds
59
+ def delete(arel, name = nil, binds = [])
60
+ binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
61
+ super
62
+ end
63
+
51
64
  def execute(sql, name = nil)
52
65
  log(sql, name) { @connection.execute(sql) }
53
66
  end
54
67
 
68
+ # overridden to support legacy binds
55
69
  def select_all(arel, name = nil, binds = NO_BINDS, preparable: nil)
56
70
  binds = convert_legacy_binds_to_attributes(binds) if binds.first.is_a?(Array)
57
71
  super
@@ -42,6 +42,7 @@ module ArJdbc
42
42
  end
43
43
 
44
44
  def supports_statement_cache?
45
+ ActiveSupport::Deprecation.deprecation_warning(__method__)
45
46
  @jdbc_statement_cache_enabled
46
47
  end
47
48
 
@@ -30,6 +30,65 @@ module ArJdbc
30
30
  # @note This adapter doesn't support explain `config.active_record.auto_explain_threshold_in_seconds` should be commented (Rails < 4.0)
31
31
  module DB2
32
32
 
33
+
34
+ module ActiveRecord::ConnectionAdapters
35
+
36
+ remove_const(:DB2Adapter) if const_defined?(:DB2Adapter)
37
+
38
+ class DB2Adapter < JdbcAdapter
39
+
40
+ include ArJdbc::DB2
41
+ include ArJdbc::DB2::Column
42
+
43
+ # AR 5.2 Fix
44
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
45
+ super(connection, logger, config) # configure_connection happens in super
46
+ end
47
+
48
+ def jdbc_connection_class(spec)
49
+ ArJdbc::DB2.jdbc_connection_class
50
+ end
51
+
52
+ def data_source_sql(name = nil, type: nil)
53
+ scope = quoted_scope(name, type: type)
54
+
55
+ sql = if scope[:type] == "'T'"
56
+ "select table_name from sysibm.tables".dup
57
+ else
58
+ "select table_name from sysibm.views".dup
59
+ end
60
+
61
+ wheres = []
62
+
63
+ wheres << " table_type = #{scope[:type]}" if scope[:type]
64
+ wheres << " table_schema = #{scope[:schema]}" if scope[:schema]
65
+ wheres << " UPPER(table_name) = UPPER(#{scope[:name]})" if scope[:name]
66
+
67
+ if wheres.present?
68
+ sql << ' WHERE '
69
+ sql << wheres.join(' AND ')
70
+ end
71
+ sql
72
+ end
73
+
74
+ def quoted_scope(name = nil, type: nil)
75
+ type = \
76
+ case type
77
+ when "BASE TABLE"
78
+ "'T'"
79
+ when "VIEW"
80
+ "'V'"
81
+ end
82
+ scope = {}
83
+ scope[:name] = quote(name) if name
84
+ scope[:type] = type if type
85
+ scope[:schema] = quote(scope[:schema] || schema)
86
+ scope
87
+ end
88
+
89
+ end
90
+ end
91
+
33
92
  # @private
34
93
  def self.extended(adapter); initialize!; end
35
94
 
@@ -269,6 +328,17 @@ module ArJdbc
269
328
  select_one(sql).nil?
270
329
  end
271
330
 
331
+ # @override
332
+ def primary_keys(table)
333
+ # If no schema in table name is given but present in URL parameter. Use the URL parameter one
334
+ # This avoids issues if the table is present in multiple schemas
335
+ if table.split(".").size == 1 && schema
336
+ table = "#{schema}.#{table}"
337
+ end
338
+
339
+ super
340
+ end
341
+
272
342
  def next_sequence_value(sequence_name)
273
343
  select_value("SELECT NEXT VALUE FOR #{sequence_name} FROM sysibm.sysdummy1")
274
344
  end
@@ -378,9 +448,9 @@ module ArJdbc
378
448
  types
379
449
  end
380
450
 
381
- def type_to_sql(type, limit = nil, precision = nil, scale = nil)
451
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **)
382
452
  limit = nil if type.to_sym == :integer
383
- super(type, limit, precision, scale)
453
+ super
384
454
  end
385
455
 
386
456
  # @private
@@ -393,7 +463,7 @@ module ArJdbc
393
463
 
394
464
  def add_column(table_name, column_name, type, options = {})
395
465
  # The keyword COLUMN allows to use reserved names for columns (ex: date)
396
- add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
466
+ add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options)}"
397
467
  add_column_options!(add_column_sql, options)
398
468
  execute(add_column_sql)
399
469
  end
@@ -536,7 +606,7 @@ module ArJdbc
536
606
  end
537
607
 
538
608
  def change_column(table_name, column_name, type, options = {})
539
- data_type = type_to_sql(type, options[:limit], options[:precision], options[:scale])
609
+ data_type = type_to_sql(type, options)
540
610
  sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DATA TYPE #{data_type}"
541
611
  execute_table_change(sql, table_name, 'Change Column')
542
612
 
@@ -644,11 +714,10 @@ module ArJdbc
644
714
 
645
715
  # alias_method :execute_and_auto_confirm, :execute
646
716
 
647
- # Returns the value of an identity column of the last *INSERT* statement
648
- # made over this connection.
717
+ # Returns the value of an identity column of the last *INSERT* statement made over this connection.
649
718
  # @note Check the *IDENTITY_VAL_LOCAL* function for documentation.
650
- # @return [Fixnum]
651
- def last_insert_id
719
+ # @return [Integer, NilClass]
720
+ def last_inserted_id(result)
652
721
  @connection.identity_val_local
653
722
  end
654
723
 
@@ -4,6 +4,18 @@ module ArJdbc
4
4
  module AS400
5
5
  include DB2
6
6
 
7
+ module ActiveRecord::ConnectionAdapters
8
+ remove_const(:AS400Adapter) if const_defined?(:AS400Adapter)
9
+ class AS400Adapter < DB2Adapter
10
+
11
+ include ::ArJdbc::AS400
12
+
13
+ def jdbc_connection_class(spec)
14
+ ArJdbc::AS400.jdbc_connection_class
15
+ end
16
+ end
17
+ end
18
+
7
19
  # @private
8
20
  def self.extended(adapter); DB2.extended(adapter); end
9
21
 
@@ -47,6 +47,9 @@ module ArJdbc
47
47
 
48
48
  # @override
49
49
  def type_cast(value)
50
+ # AR5.2
51
+ return super unless respond_to?(:type)
52
+
50
53
  return nil if value.nil? || value == 'NULL' || value =~ /^\s*NULL\s*$/i
51
54
  case type
52
55
  when :string then value
@@ -15,6 +15,8 @@ ArJdbc::ConnectionMethods.module_eval do
15
15
  end
16
16
  config[:driver] ||= ::ArJdbc::DB2::DRIVER_NAME
17
17
  config[:connection_alive_sql] ||= 'SELECT 1 FROM syscat.tables FETCH FIRST 1 ROWS ONLY'
18
+ config[:adapter_class] = ActiveRecord::ConnectionAdapters::DB2Adapter unless config.key?(:adapter_class)
19
+
18
20
  jdbc_connection(config)
19
21
  end
20
22
  alias_method :jdbcdb2_connection, :db2_connection
@@ -38,6 +40,8 @@ ArJdbc::ConnectionMethods.module_eval do
38
40
  require 'arjdbc/db2/as400'
39
41
  config[:driver] ||= ::ArJdbc::AS400::DRIVER_NAME
40
42
  config[:connection_alive_sql] ||= 'SELECT 1 FROM sysibm.tables FETCH FIRST 1 ROWS ONLY'
43
+ config[:adapter_class] = ActiveRecord::ConnectionAdapters::AS400Adapter unless config.key?(:adapter_class)
44
+
41
45
  jdbc_connection(config)
42
46
  end
43
47
  alias_method :jdbcas400_connection, :as400_connection
@@ -250,12 +250,6 @@ module ActiveRecord
250
250
  end
251
251
  end
252
252
 
253
- # @private
254
- # @override
255
- def select_rows(sql, name = nil, binds = [])
256
- exec_query_raw(sql, name, binds).map!(&:values)
257
- end
258
-
259
253
  # Executes the SQL statement in the context of this connection.
260
254
  # The return value from this method depends on the SQL type (whether
261
255
  # it's a SELECT, INSERT etc.). For INSERTs a generated id might get
@@ -364,6 +358,10 @@ module ActiveRecord
364
358
  # @return [Integer, NilClass]
365
359
  def last_inserted_id(result)
366
360
  if result.is_a?(Hash) || result.is_a?(ActiveRecord::Result)
361
+ # If table does not have primary key defined
362
+ return nil if result.first.blank?
363
+
364
+
367
365
  result.first.first[1] # .first = { "id"=>1 } .first = [ "id", 1 ]
368
366
  else
369
367
  result
Binary file