activerecord-jdbc-adapter 1.3.25 → 5.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +57 -72
  3. data/Appraisals +7 -2
  4. data/Gemfile +3 -7
  5. data/History.md +0 -50
  6. data/RUNNING_TESTS.md +4 -0
  7. data/activerecord-jdbc-adapter.gemspec +2 -1
  8. data/lib/arjdbc/common_jdbc_methods.rb +89 -0
  9. data/lib/arjdbc/db2/adapter.rb +58 -69
  10. data/lib/arjdbc/db2/as400.rb +2 -13
  11. data/lib/arjdbc/db2/column.rb +1 -1
  12. data/lib/arjdbc/derby/adapter.rb +2 -6
  13. data/lib/arjdbc/firebird/adapter.rb +7 -16
  14. data/lib/arjdbc/h2/adapter.rb +4 -13
  15. data/lib/arjdbc/hsqldb/adapter.rb +5 -5
  16. data/lib/arjdbc/jdbc/adapter.rb +15 -76
  17. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  18. data/lib/arjdbc/jdbc/adapter_require.rb +12 -31
  19. data/lib/arjdbc/jdbc/base_ext.rb +6 -25
  20. data/lib/arjdbc/jdbc/column.rb +15 -1
  21. data/lib/arjdbc/jdbc/connection_methods.rb +7 -1
  22. data/lib/arjdbc/jdbc/type_cast.rb +16 -4
  23. data/lib/arjdbc/jdbc/type_converter.rb +0 -1
  24. data/lib/arjdbc/mssql/adapter.rb +9 -21
  25. data/lib/arjdbc/mysql/adapter.rb +14 -19
  26. data/lib/arjdbc/mysql/connection_methods.rb +3 -5
  27. data/lib/arjdbc/oracle/adapter.rb +4 -38
  28. data/lib/arjdbc/oracle/connection_methods.rb +0 -4
  29. data/lib/arjdbc/postgresql/adapter.rb +18 -22
  30. data/lib/arjdbc/postgresql/connection_methods.rb +2 -5
  31. data/lib/arjdbc/postgresql/oid/bytea.rb +0 -1
  32. data/lib/arjdbc/postgresql/oid_types.rb +6 -6
  33. data/lib/arjdbc/sqlite3/adapter.rb +493 -404
  34. data/lib/arjdbc/tasks/database_tasks.rb +1 -1
  35. data/lib/arjdbc/tasks/databases3.rake +1 -1
  36. data/lib/arjdbc/tasks/databases4.rake +3 -8
  37. data/lib/arjdbc/version.rb +1 -1
  38. data/rakelib/db.rake +5 -8
  39. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +102 -37
  40. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +0 -7
  41. metadata +10 -17
  42. data/lib/arjdbc/jdbc/arel_support.rb +0 -133
  43. data/lib/arjdbc/mssql/attributes_for_update.rb +0 -22
  44. data/lib/arjdbc/sqlite3/explain_support.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 281e8f3a4a07822db0e22d4ccddcab3cfac306df
4
- data.tar.gz: 6272c2231879854604d74b03720a6759f1e601ac
3
+ metadata.gz: 16bdeec72b7b2db4b9593138ae56a56cb52fd7d7
4
+ data.tar.gz: d3a6f0d4a0593326b598f9fda7ac77f0bb9266a2
5
5
  SHA512:
6
- metadata.gz: bb5752131090b67b4724e34ced5ce7ca04eab6b5f593e2b99d95d7b8914ec20b90a96d0e1820c09bcbea7ad145819cb3349155ef0986cf26d9943cfad080972f
7
- data.tar.gz: 8a9cc04265ff89f82356d99c8418a7203269146462aae805f302aefb2b799f810421f526dc1989b96d543a365e5f964f1d9ac444890053374f6725c22f6fc905
6
+ metadata.gz: 4e9df27017621984d70cc5a824a2d82775b8a6cd21b7307769557f7e154c1e1b95bead7c411aed5e16d9af85ab26a8ddba8cf58edce863ed5c0f1491b587101e
7
+ data.tar.gz: 6b5449e2e4e0f126046a68811acb030a0032b3f7b1f91e5a2a7a7a96fb83cd1d01f1c686e1266311a60a629ad9634bcf70ce63ea30776709b1f2cb59b011e047
@@ -1,8 +1,3 @@
1
- addons:
2
- apt:
3
- packages:
4
- - openjdk-6-jdk
5
-
6
1
  language: ruby
7
2
  sudo: false
8
3
  bundler_args: --without development
@@ -51,110 +46,104 @@ branches:
51
46
  - /^test-.*/
52
47
  matrix:
53
48
  allow_failures:
54
- # NOTE: failing HStore inserts for whatever reason - hopefully someone will investigate ...
55
- - env: JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true
56
- - env: JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true INSERT_RETURNING=true
57
- - env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true
49
+ # yet another BC timestamp issue: <Wed, 31 Dec -0001 22:58:59 +0000> expected but was <Fri, 02 Jan 0000 22:58:59 +0000>
50
+ - rvm: jruby-9.0.5.0
51
+ gemfile: gemfiles/rails41.gemfile
52
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql
53
+ jdk: oraclejdk7
54
+ # ``/system call symlink regression (since JRuby 1.7.19)
55
+ # + (postgres) database_tasks got updated on 4.2 : https://github.com/rails/rails/commit/07f8a96aa14b642a86
56
+ - rvm: jruby-1.7.24
57
+ gemfile: gemfiles/rails42.gemfile
58
+ env: JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=false INSERT_RETURNING=true
59
+ - rvm: jruby-1.7.24
60
+ gemfile: gemfiles/rails42.gemfile
61
+ env: JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true
62
+ - rvm: jruby-1.7.24
63
+ gemfile: gemfiles/rails42.gemfile
64
+ env: JRUBY_OPTS="--1.9 $JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true INSERT_RETURNING=true
65
+ - rvm: jruby-1.7.24
66
+ gemfile: gemfiles/rails42.gemfile
67
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql
58
68
  include:
59
69
  # testing against MariaDB
60
70
  - addons:
61
- mariadb: '10.0'
71
+ mariadb: '5.5'
62
72
  rvm: jruby-1.7.24
63
73
  gemfile: gemfiles/rails32.gemfile
64
74
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql
65
- jdk: openjdk8 # MariaDB 2.x assumes JDK 8
75
+ jdk: openjdk6
66
76
  - addons:
67
- mariadb: '10.1'
77
+ mariadb: '10.0'
68
78
  rvm: jruby-1.7.24
69
- gemfile: gemfiles/rails42.gemfile
70
- env: DB=mariadb
71
- jdk: openjdk8
79
+ gemfile: gemfiles/rails40.gemfile
80
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=mariadb
81
+ jdk: openjdk7
72
82
  - addons:
73
- mariadb: '10.2'
83
+ mariadb: '10.0'
74
84
  rvm: jruby-1.7.24
75
85
  gemfile: gemfiles/rails41.gemfile
76
- env: DB=mariadb PREPARED_STATEMENTS=true
86
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=mariadb PREPARED_STATEMENTS=true
77
87
  jdk: oraclejdk8
78
88
  # include some tests on JDK 6 :
79
- - rvm: jruby-1.7.27
89
+ - rvm: jruby-1.7.24
80
90
  gemfile: gemfiles/rails42.gemfile
81
- env: JRUBY_OPTS="--2.0 $JRUBY_OPTS" DB=mysql
91
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql
82
92
  jdk: openjdk6
83
- - rvm: jruby-1.7.27
93
+ - rvm: jruby-1.7.24
84
94
  gemfile: gemfiles/rails42.gemfile
85
- env: JRUBY_OPTS="--2.0 $JRUBY_OPTS" DB=postgresql
95
+ env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql
86
96
  jdk: openjdk6
87
- - rvm: jruby-1.7.27
97
+ - rvm: jruby-1.7.24
88
98
  gemfile: gemfiles/rails42.gemfile
89
99
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=sqlite3
90
100
  jdk: openjdk6
91
- - rvm: jruby-1.7.27
101
+ - rvm: jruby-1.7.24
92
102
  gemfile: gemfiles/rails42.gemfile
93
103
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=derby
94
104
  jdk: openjdk6
95
- - rvm: jruby-1.7.26
105
+ - rvm: jruby-1.7.24
96
106
  gemfile: gemfiles/rails42.gemfile
97
107
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=h2
98
108
  jdk: openjdk6
99
- - rvm: jruby-1.7.26
109
+ - rvm: jruby-1.7.24
100
110
  gemfile: gemfiles/rails42.gemfile
101
111
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=hsqldb
102
112
  jdk: openjdk6
103
- # include some (more) --2.0 testing :
104
- - rvm: jruby-1.7.27
105
- gemfile: gemfiles/rails41.gemfile
106
- env: JRUBY_OPTS="--2.0 $JRUBY_OPTS" DB=mysql
107
- jdk: openjdk8
108
- - rvm: jruby-1.7.27
109
- gemfile: gemfiles/rails41.gemfile
110
- env: JRUBY_OPTS="--2.0 $JRUBY_OPTS" DB=postgresql
111
- jdk: openjdk7
112
- - rvm: jruby-1.7.27
113
- gemfile: gemfiles/rails41.gemfile
114
- env: JRUBY_OPTS="--2.0 $JRUBY_OPTS" DB=sqlite3
115
- jdk: openjdk7
116
113
  # include testing with JRuby 9K (4.2) :
117
- - rvm: jruby-9.1.12.0
114
+ - rvm: jruby-9.0.5.0
118
115
  gemfile: gemfiles/rails42.gemfile
119
116
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql PREPARED_STATEMENTS=true
120
- jdk: openjdk7
121
- - rvm: jruby-9.1.13.0
122
- gemfile: gemfiles/rails42.gemfile
123
- env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql DRIVER=MariaDB PREPARED_STATEMENTS=true
124
- jdk: openjdk8
125
- - rvm: jruby-9.1.12.0
117
+ jdk: oraclejdk7
118
+ - rvm: jruby-9.0.5.0
126
119
  gemfile: gemfiles/rails42.gemfile
127
120
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql PREPARED_STATEMENTS=true
128
- jdk: openjdk7
129
- - rvm: jruby-9.1.13.0
121
+ jdk: oraclejdk7
122
+ - rvm: jruby-9.0.5.0
130
123
  gemfile: gemfiles/rails42.gemfile
131
124
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=sqlite3
132
- jdk: openjdk7
133
- - rvm: jruby-9.1.13.0
125
+ jdk: oraclejdk7
126
+ - rvm: jruby-9.0.5.0
134
127
  gemfile: gemfiles/rails42.gemfile
135
128
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql
136
129
  jdk: oraclejdk8
137
- - rvm: jruby-9.1.12.0
138
- gemfile: gemfiles/rails42.gemfile
139
- env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql DRIVER=MariaDB
140
- jdk: oraclejdk8
141
- - rvm: jruby-9.1.13.0
130
+ - rvm: jruby-9.0.5.0
142
131
  gemfile: gemfiles/rails42.gemfile
143
132
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql
144
133
  jdk: oraclejdk8
145
- - rvm: jruby-9.1.8.0
134
+ - rvm: jruby-9.0.5.0
146
135
  gemfile: gemfiles/rails42.gemfile
147
136
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=sqlite3
148
137
  jdk: oraclejdk8
149
- - rvm: jruby-9.1.13.0
138
+ - rvm: jruby-9.0.5.0
150
139
  gemfile: gemfiles/rails42.gemfile
151
140
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=derby
152
141
  jdk: oraclejdk8
153
- - rvm: jruby-9.1.13.0
142
+ - rvm: jruby-9.0.5.0
154
143
  gemfile: gemfiles/rails42.gemfile
155
144
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=h2
156
145
  jdk: oraclejdk8
157
- - rvm: jruby-9.1.13.0
146
+ - rvm: jruby-9.0.5.0
158
147
  gemfile: gemfiles/rails42.gemfile
159
148
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=hsqldb
160
149
  jdk: oraclejdk8
@@ -171,31 +160,27 @@ matrix:
171
160
  gemfile: gemfiles/rails41.gemfile
172
161
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=sqlite3
173
162
  jdk: oraclejdk8
174
- - rvm: jruby-9.1.12.0
163
+ - rvm: jruby-9.0.5.0
175
164
  gemfile: gemfiles/rails41.gemfile
176
165
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql
177
- jdk: openjdk7
178
- - rvm: jruby-9.1.13.0
179
- gemfile: gemfiles/rails41.gemfile
180
- env: JRUBY_OPTS="$JRUBY_OPTS" DB=mysql DRIVER=MariaDB
181
- jdk: openjdk8 # MariaDB 2.x assumes JDK 8
182
- - rvm: jruby-9.1.13.0
166
+ jdk: oraclejdk7
167
+ - rvm: jruby-9.0.5.0
183
168
  gemfile: gemfiles/rails41.gemfile
184
169
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=postgresql
185
- jdk: openjdk7
186
- - rvm: jruby-9.1.13.0
170
+ jdk: oraclejdk7
171
+ - rvm: jruby-9.0.5.0
187
172
  gemfile: gemfiles/rails41.gemfile
188
173
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=sqlite3
189
174
  jdk: oraclejdk8
190
- - rvm: jruby-9.1.13.0
175
+ - rvm: jruby-9.0.5.0
191
176
  gemfile: gemfiles/rails41.gemfile
192
177
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=derby
193
- jdk: openjdk7
194
- - rvm: jruby-9.1.13.0
178
+ jdk: oraclejdk7
179
+ - rvm: jruby-9.0.5.0
195
180
  gemfile: gemfiles/rails41.gemfile
196
181
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=h2
197
- jdk: openjdk7
198
- - rvm: jruby-9.1.13.0
182
+ jdk: oraclejdk7
183
+ - rvm: jruby-9.0.5.0
199
184
  gemfile: gemfiles/rails41.gemfile
200
185
  env: JRUBY_OPTS="$JRUBY_OPTS" DB=hsqldb
201
186
  jdk: oraclejdk8
data/Appraisals CHANGED
@@ -21,13 +21,18 @@ appraise "rails40" do
21
21
  end
22
22
 
23
23
  appraise "rails41" do
24
- gem "activerecord", "~> 4.1.11", :require => false
24
+ gem "activerecord", "~> 4.1.8", :require => false
25
25
  end
26
26
 
27
27
  appraise "rails42" do
28
- gem "activerecord", "~> 4.2.6", :require => false
28
+ gem "activerecord", "~> 4.2.0", :require => false
29
29
  end
30
30
 
31
+ appraise "rails50" do
32
+ gem "activerecord", "~> 5.0.0.beta4", :require => false
33
+ end
34
+
35
+
31
36
  appraise "railsNG" do
32
37
  branch = ( ENV['rails_branch'] || 'master' )
33
38
  gem "activerecord", :github => 'rails/rails', :branch => branch, :require => false
data/Gemfile CHANGED
@@ -14,17 +14,13 @@ else
14
14
  gem 'activerecord', :require => nil
15
15
  end
16
16
 
17
- # NOTE: gem overrides AR internals and assumes it can safely patch adapter classes ...
18
- # thus it is to be used (in tests) as an optional - tests should roll fine without it!
19
- gem 'composite_primary_keys', :require => nil unless ENV['COMPOSITE_PK'].eql?('false')
20
-
21
17
  gem 'thread_safe', :require => nil # "optional" - we can roll without it
22
18
 
23
19
  if defined?(JRUBY_VERSION) && JRUBY_VERSION < '1.7.0'
24
20
  gem 'jruby-openssl', :platform => :jruby
25
21
  end
26
22
 
27
- gem 'rake', '~> 10.4.2', :require => nil
23
+ gem 'rake', :require => nil
28
24
  gem 'appraisal', '~> 0.5.2', :require => nil
29
25
 
30
26
  # appraisal ignores group block declarations :
@@ -38,10 +34,10 @@ gem 'bcrypt-ruby', '~> 3.0.0', :require => nil, :group => :test
38
34
  #gem 'trinidad_dbpool', :require => nil, :group => :test
39
35
 
40
36
  group :development do
41
- gem 'ruby-debug', :require => nil if ENV['DEBUG']
37
+ gem 'ruby-debug', :require => nil # if ENV['DEBUG']
42
38
  group :doc do
43
39
  gem 'yard', :require => nil
44
- gem 'yard-method-overrides', :github => 'kares/yard-method-overrides', :require => nil
40
+ gem 'yard-method-overrides', :git => 'https://github.com/kares/yard-method-overrides.git', :require => nil
45
41
  gem 'kramdown', :require => nil
46
42
  end
47
43
  end
data/History.md CHANGED
@@ -1,53 +1,3 @@
1
- ## 1.3.25 (08/22/18)
2
-
3
- - [mysql] get rid of official driver < 5 checking on conn initialization
4
- - [oracle] fix Oracle adapter not suing schema config properly (#869)
5
- - [db2] refactor db2 quote (to avoid SQL injection) (#861)
6
- - [db2] Fix a TypeError that happens when offset is used without limit (#873)
7
- - [mssql] automatically remove identity columns from AR generated UPDATE (#872)
8
- - [db2] Errors when dealing with blobs in jruby 9.2k (#902)
9
-
10
- ## 1.3.24 (09/24/17)
11
-
12
- - [as400] Fixed ordering when limit and offset present (#789)
13
- - [postgres] limit driver version correctly since > 9.4.1206 might break
14
- - [db2] fixed issue with serialization not happening (#795)
15
- resolves #725 (serialize with custom class not working on AR 4.2)
16
- - reconnect!/disconnect! shall call super to reset cache/transaction state
17
- - [oracle] some ~ enhanced adapter compatibility with configuration
18
- - [mysql] support setting collation: xxx with config[:encoding] like AR 4.2
19
- - [as400] Check if the exception thrown is a false-positive (#792)
20
- - [as400] Added truncate functionality for DB2/AS400 (#793)
21
- - [as400] Added DatabaseTasks for the as400 (#791)
22
-
23
- ## 1.3.23 (05/14/17)
24
-
25
- - specify gem 'activerecord' < 5 since 5.x is not supported in 1.3.x
26
- - [postgres] get non-seq id inserts working when insert_returning: false (#716)
27
- - [postgres] previously-deprecated -i switch to pg_dump is no longer supported
28
- (in PostgreSQL 9.5) (#729)
29
- - [postgres] Assume that primary key can be multiple values (#773)
30
- - prevent multiple pushes of the adapter file onto $LOADED_FEATURES
31
-
32
- ## 1.3.22 (12/23/16)
33
-
34
- - [postgres] Fix incorrect postgresql_version when running RC (#717)
35
- - [postgres] fixed insert into partitioned table (#723)
36
- - [postgres] add ssl support from environment vars (#760)
37
- - [postgres] Adds citext to AR42 Native database types (#746)
38
- - [mysql] handle db:create failure compatibly with AR's MySQL tasks
39
- - [mssql] Changed selects from information schema to uppercase
40
- in case SQLServer database has case sensitive collation
41
- - Added long varchar to type converter for legacy sybase DB (#757)
42
- - [mysql] Don't read mysql binary column as stream (#742)
43
-
44
- ## 1.3.21 (08/18/16)
45
-
46
- - check for instanceof RubyArray when extracting binds with stmnts
47
- (for JRuby 9.1 packed array feature compatibility)
48
- - default to useSSL=false for MariaDB driver
49
- - [db2] allow to force zos: true using database config
50
-
51
1
  ## 1.3.20 (03/09/16)
52
2
 
53
3
  - Retrieve AM::Type::Boolean::FALSE_VALUES for Rails 5 (#705)
@@ -1,6 +1,10 @@
1
1
 
2
2
  ## Running AR-JDBC's Tests
3
3
 
4
+ After you have built arjdbc (run rake), then you can try testing it (if you
5
+ do not build then adapter_java.jar is not put into the lib dir). If you
6
+ change any of the .java files you will need to rebuild.
7
+
4
8
  Most DB specific unit tests hide under the **test/db** directory, the files
5
9
  included in the *test* directory are mostly shared test modules and helpers.
6
10
 
@@ -29,7 +29,8 @@ Gem::Specification.new do |gem|
29
29
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
30
30
  gem.test_files = gem.files.grep(%r{^test/})
31
31
 
32
- gem.add_dependency 'activerecord', '>= 2.2', '< 5.0'
32
+ # NOTE: 1.3.0 only supports >= 2.3 but users report it works with 2.2 :
33
+ gem.add_dependency 'activerecord', '>= 2.2'
33
34
 
34
35
  #gem.add_development_dependency 'test-unit', '2.5.4'
35
36
  #gem.add_development_dependency 'test-unit-context', '>= 0.3.0'
@@ -0,0 +1,89 @@
1
+ module ArJdbc
2
+ # This is minimum amount of code neede from base JDBC Adapter class to make common adapters
3
+ # work. This replaces using jdbc/adapter as a base class for all adapters.
4
+ module CommonJdbcMethods
5
+ def initialize(connection, logger = nil, config = {})
6
+ config[:adapter_spec] = adapter_spec(config) unless config.key?(:adapter_spec)
7
+
8
+ connection ||= jdbc_connection_class(config[:adapter_spec]).new(config, self)
9
+
10
+ super(connection, logger, config)
11
+ end
12
+
13
+ # Starts a database transaction.
14
+ # @override
15
+ def begin_db_transaction
16
+ @connection.begin
17
+ end
18
+
19
+ # Starts a database transaction.
20
+ # @param isolation the transaction isolation to use
21
+ def begin_isolated_db_transaction(isolation)
22
+ @connection.begin(isolation)
23
+ end
24
+
25
+ # Commits the current database transaction.
26
+ # @override
27
+ def commit_db_transaction
28
+ @connection.commit
29
+ end
30
+
31
+ # Rolls back the current database transaction.
32
+ # @override
33
+ def exec_rollback_db_transaction
34
+ @connection.rollback
35
+ end
36
+
37
+
38
+ def execute(sql, name = nil)
39
+ # FIXME: Can we kill :skip_logging?
40
+ if name == :skip_logging
41
+ @connection.execute(sql)
42
+ else
43
+ log(sql, name) { @connection.execute(sql) }
44
+ end
45
+ end
46
+
47
+ # Take an id from the result of an INSERT query.
48
+ # @return [Integer, NilClass]
49
+ def last_inserted_id(result)
50
+ if result.is_a?(Hash) || result.is_a?(ActiveRecord::Result)
51
+ result.first.first[1] # .first = { "id"=>1 } .first = [ "id", 1 ]
52
+ else
53
+ result
54
+ end
55
+ end
56
+
57
+ # Creates a (transactional) save-point one can rollback to.
58
+ # Unlike 'plain' `ActiveRecord` it is allowed to pass a save-point name.
59
+ # @param name the save-point name
60
+ # @return save-point name (even if nil passed will be generated)
61
+ # @since 1.3.0
62
+ # @extension added optional name parameter
63
+ def create_savepoint(name = current_savepoint_name(true))
64
+ @connection.create_savepoint(name)
65
+ end
66
+
67
+ # Transaction rollback to a given (previously created) save-point.
68
+ # If no save-point name given rollback to the last created one.
69
+ # @param name the save-point name
70
+ # @extension added optional name parameter
71
+ def rollback_to_savepoint(name = current_savepoint_name(true))
72
+ @connection.rollback_savepoint(name)
73
+ end
74
+
75
+ # Release a previously created save-point.
76
+ # @note Save-points are auto-released with the transaction they're created
77
+ # in (on transaction commit or roll-back).
78
+ # @param name the save-point name
79
+ # @extension added optional name parameter
80
+ def release_savepoint(name = current_savepoint_name(false))
81
+ @connection.release_savepoint(name)
82
+ end
83
+
84
+ # @private
85
+ def current_savepoint_name(compat = nil)
86
+ current_transaction.savepoint_name # unlike AR 3.2-4.1 might be nil
87
+ end
88
+ end
89
+ end
@@ -54,17 +54,6 @@ module ArJdbc
54
54
  ::ActiveRecord::ConnectionAdapters::DB2Column
55
55
  end
56
56
 
57
- # @see ActiveRecord::ConnectionAdapters::Jdbc::ArelSupport
58
- def self.arel_visitor_type(config = nil)
59
- require 'arel/visitors/db2'; ::Arel::Visitors::DB2
60
- end
61
-
62
- # @deprecated no longer used
63
- # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#arel2_visitors
64
- def self.arel2_visitors(config)
65
- { 'db2' => arel_visitor_type }
66
- end
67
-
68
57
  # @private
69
58
  @@emulate_booleans = true
70
59
 
@@ -356,49 +345,57 @@ module ArJdbc
356
345
  # @param column (optional) contains info on the field
357
346
  # @override
358
347
  def quote(value, column = nil)
348
+ return value.quoted_id if value.respond_to?(:quoted_id)
359
349
  return value if sql_literal?(value)
360
350
 
361
- # Can anyone explain what this is for?
362
- if column && column.respond_to?(:primary) && column.primary && column.klass != String
363
- return value.to_i.to_s
351
+ if column
352
+ if column.respond_to?(:primary) && column.primary && column.klass != String
353
+ return value.to_i.to_s
354
+ end
355
+ if value && (column.type.to_sym == :decimal || column.type.to_sym == :integer)
356
+ return value.to_s
357
+ end
364
358
  end
365
359
 
366
360
  column_type = column && column.type.to_sym
367
361
 
368
362
  case value
369
- when Numeric # IBM_DB doesn't accept quotes on numeric types
370
- # if the column type is text or string, return the quote value
371
- if column_type == :text || column_type == :string
372
- "'#{value}'"
373
- else
374
- super
375
- end
376
-
377
- when String, ActiveSupport::Multibyte::Chars
378
- if column_type == :binary && column.sql_type !~ /for bit data/i
379
- if update_lob_value?(value, column)
380
- BLOB_VALUE_MARKER # '@@@IBMBINARY@@@'"
381
- else
382
- "BLOB('#{super}')"
383
- end
384
- elsif column && column.sql_type =~ /clob/ # :text
385
- CLOB_VALUE_MARKER if update_lob_value?(value, column)# "'@@@IBMTEXT@@@'"
363
+ when nil then 'NULL'
364
+ when Numeric # IBM_DB doesn't accept quotes on numeric types
365
+ # if the column type is text or string, return the quote value
366
+ if column_type == :text || column_type == :string
367
+ "'#{value}'"
368
+ else
369
+ value.to_s
370
+ end
371
+ when String, ActiveSupport::Multibyte::Chars
372
+ if column_type == :binary && column.sql_type !~ /for bit data/i
373
+ if update_lob_value?(value, column)
374
+ value.nil? ? 'NULL' : BLOB_VALUE_MARKER # '@@@IBMBINARY@@@'"
386
375
  else
387
- super
376
+ "BLOB('#{quote_string(value)}')"
388
377
  end
389
-
390
- when Time
391
- # AS400 doesn't support date in time column
392
- if column_type == :time
393
- quote_time(value)
378
+ elsif column && column.sql_type =~ /clob/ # :text
379
+ if update_lob_value?(value, column)
380
+ value.nil? ? 'NULL' : CLOB_VALUE_MARKER # "'@@@IBMTEXT@@@'"
394
381
  else
395
- super
382
+ "'#{quote_string(value)}'"
396
383
  end
397
-
384
+ elsif column_type == :xml
385
+ value.nil? ? 'NULL' : "'#{quote_string(value)}'" # "'<ibm>@@@IBMXML@@@</ibm>'"
386
+ else
387
+ "'#{quote_string(value)}'"
388
+ end
389
+ when Symbol then "'#{quote_string(value.to_s)}'"
390
+ when Time
391
+ # AS400 doesn't support date in time column
392
+ if column_type == :time
393
+ quote_time(value)
398
394
  else
399
395
  super
396
+ end
397
+ else super
400
398
  end
401
-
402
399
  end
403
400
 
404
401
  # @override
@@ -484,26 +481,29 @@ module ArJdbc
484
481
 
485
482
  # @private shared with {Arel::Visitors::DB2}
486
483
  def replace_limit_offset!(sql, limit, offset, orders = nil)
487
- # Ordering is done somewhere before this method gets called
484
+ limit = limit.to_i
485
+
486
+ if offset # && limit
487
+ over_order_by = nil # NOTE: orders matching got reverted as it was not complete and there were no case covering it ...
488
488
 
489
- # Create the limit and offset sql
490
- param_sql = ''
489
+ start_sql = "SELECT B.* FROM (SELECT A.*, row_number() OVER (#{over_order_by}) AS internal$rownum FROM (SELECT"
490
+ end_sql = ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset.to_i}"
491
491
 
492
- if offset.present? && limit.present?
493
- param_sql << " LIMIT #{limit} OFFSET #{offset} "
492
+ if sql.is_a?(String)
493
+ sql.sub!(/SELECT/i, start_sql)
494
+ sql << end_sql
495
+ else # AR 4.2 sql.class ... Arel::Collectors::Bind
496
+ sql.parts[0] = start_sql # sql.sub! /SELECT/i
497
+ sql.parts[ sql.parts.length ] = end_sql
498
+ end
494
499
  else
495
- param_sql << " OFFSET #{offset}" if offset.present?
496
- if limit.present?
497
- param_sql << (limit == 1 ? ' FETCH FIRST ROW ONLY' : " FETCH FIRST #{limit} ROWS ONLY")
500
+ limit_sql = limit == 1 ? " FETCH FIRST ROW ONLY" : " FETCH FIRST #{limit} ROWS ONLY"
501
+ if sql.is_a?(String)
502
+ sql << limit_sql
503
+ else # AR 4.2 sql.class ... Arel::Collectors::Bind
504
+ sql.parts[ sql.parts.length ] = limit_sql
498
505
  end
499
506
  end
500
-
501
- if sql.is_a?(String)
502
- sql << param_sql
503
- else # AR 4.2 sql.class ... Arel::Collectors::Bind
504
- sql.parts[sql.parts.length] = param_sql
505
- end
506
-
507
507
  sql
508
508
  end
509
509
 
@@ -568,7 +568,6 @@ module ArJdbc
568
568
  end
569
569
 
570
570
  def change_column_null(table_name, column_name, null)
571
- raise NotImplementedError, "DB2 for zOS does not support changing the column's nullability" if zos?
572
571
  if null
573
572
  sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP NOT NULL"
574
573
  else
@@ -579,7 +578,6 @@ module ArJdbc
579
578
 
580
579
  def change_column_default(table_name, column_name, default)
581
580
  if default.nil?
582
- raise NotImplementedError, "DB2 for zOS does not support changing the column default to NULL" if zos?
583
581
  sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP DEFAULT"
584
582
  else
585
583
  sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET WITH DEFAULT #{quote(default)}"
@@ -682,12 +680,6 @@ module ArJdbc
682
680
  # @override
683
681
  def supports_views?; true end
684
682
 
685
- # @override
686
- def supports_foreign_keys?; true end
687
-
688
- # @override
689
- def supports_ddl_transactions?; true end
690
-
691
683
  def execute_table_change(sql, table_name, name = nil)
692
684
  outcome = execute(sql, name)
693
685
  reorg_table(table_name, name)
@@ -705,7 +697,7 @@ module ArJdbc
705
697
  # Returns the value of an identity column of the last *INSERT* statement
706
698
  # made over this connection.
707
699
  # @note Check the *IDENTITY_VAL_LOCAL* function for documentation.
708
- # @return [Integer]
700
+ # @return [Fixnum]
709
701
  def last_insert_id
710
702
  @connection.identity_val_local
711
703
  end
@@ -734,14 +726,11 @@ module ArJdbc
734
726
 
735
727
  # @private
736
728
  def zos?
737
- @zos = config[:zos] unless defined? @zos
729
+ @zos = nil unless defined? @zos
738
730
  return @zos unless @zos.nil?
739
- # jdbc:db2: - connection to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows
740
- # jdbc:db2j:net: - connection is to a remote IBM Cloudscape server
741
- # jdbc:ids: - informix (not supported)
742
731
  @zos =
743
732
  if url = config[:url]
744
- !!( config[:driver] == DRIVER_NAME && url =~ /^jdbc:db2j:net:/ )
733
+ !!( url =~ /^jdbc:db2j:net:/ && config[:driver] == DRIVER_NAME )
745
734
  else
746
735
  nil
747
736
  end