activerecord-jdbc-alt-adapter 60.0.0-java → 60.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4018232c43fd8cfccb8349f8c9a1be1ebd8addf9aaa8f96f3830df20ceb33c96
4
- data.tar.gz: 0a4971a64e52dbd5e3623777593d596511d96da7217ef8bcc83472a7638fd9d5
3
+ metadata.gz: f83a5e387ec9999cc730027498dec97428cfee7b3c3edcc6845a779c01c4272a
4
+ data.tar.gz: 3a7e9ce2b8e6e968bdb21f4ac72a9f498e3226c414ec4b003e4b463dffc74062
5
5
  SHA512:
6
- metadata.gz: 28bae6826777ff61c6643bb96fab4aba5489c6d6650d6d1cfa1f3773f5cf7f85464b96e58ec113d61a02b513e928dcf71d82c63b569b710c247bd15ef371bb41
7
- data.tar.gz: 733b05c9b0ccb42aa53480f8a4ee4bd6432849defb4483f3583364120420bf1c90df011a5b7abf73bb83c55cc3b85e71bb863da7cbc025852862ccc85841daf0
6
+ metadata.gz: f71a50d80a6f01837512d87a52ef32ec69a245e1927086cc0736efa35835c57710652f1ad6c294039422ad69eea20d308b48df02ba8d43e7c1acea4de7358ee0
7
+ data.tar.gz: 732cde407f1c4ff98bb7e528ea183dd483e2b8edf8a475f60f445dc7580fd8e8d3374ca248b5d7eb2f02b1c596efdeed5ce7dc393563425565657ca6302d6145
data/.gitignore CHANGED
@@ -34,3 +34,5 @@ activerecord-jdbc.iml
34
34
  lib/arjdbc/jdbc/adapter_java.jar
35
35
  .jrubyrc
36
36
  tags
37
+ pik.sh
38
+ .ruby-version
@@ -69,6 +69,9 @@ matrix:
69
69
  - addons:
70
70
  postgresql: "10"
71
71
  env: DB=postgresql PREPARED_STATEMENTS=true INSERT_RETURNING=true
72
+ - addons:
73
+ postgresql: "10"
74
+ env: DB=postgresql PREPARED_STATEMENTS=true JRUBY_OPTS=-J-Duser.timezone=America/Detroit
72
75
  - addons:
73
76
  postgresql: "9.4"
74
77
  env: DB=postgresql PREPARED_STATEMENTS=true
data/Gemfile CHANGED
@@ -55,7 +55,7 @@ group :test do
55
55
  gem 'mocha', '~> 1.2', require: false # Rails has '~> 0.14'
56
56
 
57
57
  gem 'bcrypt', '~> 3.1.11', require: false
58
- gem 'jdbc-mssql', '~> 0.7.0', require: nil
58
+ gem 'jdbc-mssql', '~> 0.9.0', require: nil
59
59
  # gem 'pry-debugger-jruby', platform: :jruby
60
60
  end
61
61
 
data/README.md CHANGED
@@ -6,16 +6,20 @@ 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 versions of Rails
9
+ stable of this adapter and Rails
10
10
 
11
- - For Rails `5.0.7.2` install the `50.3.1` version of this adapter
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
14
-
15
- Support for Rails 6.0 is planned in the future.
11
+ | Gem Version | Rails Version | min JRuby |
12
+ | ----------- | ------------- | --------- |
13
+ | 50.6.1 | 5.0.7.2 | 9.1.x |
14
+ | 51.6.1 | 5.1.7 | 9.1.x |
15
+ | 52.5.1 | 5.2.4.1 | 9.1.x |
16
+ | 60.0.0 | 6.0.2 | 9.2.9 |
16
17
 
17
18
  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
19
+ exception of some test that are not compatible with the SQL Server. To run
20
+ the test use the following fork [Rails](https://github.com/JesseChavez/rails/tree/6-0-stable-dev),
21
+ and the instructions in file `RUNNING_TESTS.md`. The fork has some
22
+ schema tweaks to make it compatible with SQL Server.
19
23
 
20
24
  ### How to use it:
21
25
 
@@ -24,13 +28,17 @@ Add the following to your `Gemfile`:
24
28
  ```ruby
25
29
  platforms :jruby do
26
30
  # Use jdbc as the database for Active Record
27
- gem 'activerecord-jdbc-alt-adapter', '~> 50.3.1', require: 'arjdbc'
28
- gem 'jdbc-mssql', '~> 0.6.0'
31
+ gem 'activerecord-jdbc-alt-adapter', '~> 60.0.0'
32
+ gem 'jdbc-mssql', '~> 0.7.0'
29
33
  end
30
34
  ```
31
35
 
32
- Or look at the sample rails 5.0 app [wombat](https://github.com/JesseChavez/wombat50)
33
- and see how is set up.
36
+ Or look at the sample rails and see how is set up:
37
+
38
+ - Rails 6.0 sample app [wombat60](https://github.com/JesseChavez/wombat60)
39
+
40
+ - Old rails 5.0 app [wombat50](https://github.com/JesseChavez/wombat50)
41
+
34
42
 
35
43
  ### Breaking changes
36
44
 
@@ -102,14 +110,6 @@ production:
102
110
  ```
103
111
 
104
112
 
105
- ### NOTE
106
-
107
- Keep one eye in the Rails connection pool, we have not thoroughly tested that
108
- part since we don't use the default Rails connection pool, other than that
109
- this adapter should just work.
110
-
111
-
112
-
113
113
  # ActiveRecord JDBC Adapter
114
114
 
115
115
  [![Gem Version](https://badge.fury.io/rb/activerecord-jdbc-adapter.svg)][7]
@@ -303,6 +303,10 @@ module ArJdbc
303
303
  @has_pg_hint_plan
304
304
  end
305
305
 
306
+ def supports_common_table_expressions?
307
+ true
308
+ end
309
+
306
310
  def supports_lazy_transactions?
307
311
  true
308
312
  end
@@ -379,13 +383,23 @@ module ArJdbc
379
383
  end
380
384
  end
381
385
 
386
+ def execute_batch(statements, name = nil)
387
+ if statements.is_a? Array
388
+ execute(combine_multi_statements(statements), name)
389
+ else
390
+ execute(statements, name)
391
+ end
392
+ end
393
+
382
394
  def explain(arel, binds = [])
383
395
  sql, binds = to_sql_and_binds(arel, binds)
384
396
  ActiveRecord::ConnectionAdapters::PostgreSQL::ExplainPrettyPrinter.new.pp(exec_query("EXPLAIN #{sql}", 'EXPLAIN', binds))
385
397
  end
386
398
 
387
399
  # from ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
388
- READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback) # :nodoc:
400
+ READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
401
+ :begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :with
402
+ ) # :nodoc:
389
403
  private_constant :READ_QUERY
390
404
 
391
405
  def write_query?(sql) # :nodoc:
@@ -435,7 +449,12 @@ module ArJdbc
435
449
  end
436
450
 
437
451
  def build_truncate_statements(*table_names)
438
- "TRUNCATE TABLE #{table_names.map(&method(:quote_table_name)).join(", ")}"
452
+ ["TRUNCATE TABLE #{table_names.flatten.map(&method(:quote_table_name)).join(", ")}"]
453
+ end
454
+
455
+ def truncate(table_name, name = nil)
456
+ ActiveRecord::Base.clear_query_caches_for_current_thread if @query_cache_enabled
457
+ execute("TRUNCATE TABLE #{quote_table_name(table_name)}", name)
439
458
  end
440
459
 
441
460
  def all_schemas
@@ -493,7 +512,7 @@ module ArJdbc
493
512
  alias_method :quote_schema_name, :quote_column_name
494
513
 
495
514
  # Need to clear the cache even though the AR adapter doesn't for some reason
496
- def remove_column(table_name, column_name, type = nil, options = {})
515
+ def remove_column(table_name, column_name, type = nil, **options)
497
516
  super
498
517
  clear_cache!
499
518
  end
@@ -213,7 +213,7 @@ module ArJdbc
213
213
  if oid
214
214
  if oid.is_a? Numeric || oid.match(/^\d+$/)
215
215
  # numeric OID
216
- query += "WHERE t.oid::integer = %s" % oid
216
+ query += "WHERE t.oid = %s" % oid
217
217
 
218
218
  elsif m = oid.match(/"?(\w+)"?\."?(\w+)"?/)
219
219
  # namespace and type name
@@ -97,6 +97,10 @@ module ArJdbc
97
97
  true
98
98
  end
99
99
 
100
+ def supports_common_table_expressions?
101
+ database_version >= "3.8.3"
102
+ end
103
+
100
104
  def supports_insert_on_conflict?
101
105
  database_version >= "3.24.0"
102
106
  end
@@ -154,7 +158,9 @@ module ArJdbc
154
158
  # DATABASE STATEMENTS ======================================
155
159
  #++
156
160
 
157
- READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(:begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback) # :nodoc:
161
+ READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
162
+ :begin, :commit, :explain, :select, :pragma, :release, :savepoint, :rollback, :with
163
+ ) # :nodoc:
158
164
  private_constant :READ_QUERY
159
165
 
160
166
  def write_query?(sql) # :nodoc:
@@ -223,7 +229,7 @@ module ArJdbc
223
229
  end
224
230
  end
225
231
 
226
- def remove_column(table_name, column_name, type = nil, options = {}) #:nodoc:
232
+ def remove_column(table_name, column_name, type = nil, **options) #:nodoc:
227
233
  alter_table(table_name) do |definition|
228
234
  definition.remove_column column_name
229
235
  definition.foreign_keys.delete_if do |_, fk_options|
@@ -317,11 +323,17 @@ module ArJdbc
317
323
  SQLite3Adapter::Version.new(query_value("SELECT sqlite_version(*)"))
318
324
  end
319
325
 
326
+ def build_truncate_statement(table_name)
327
+ "DELETE FROM #{quote_table_name(table_name)}"
328
+ end
329
+
320
330
  def build_truncate_statements(*table_names)
321
- truncate_tables = table_names.map do |table_name|
322
- "DELETE FROM #{quote_table_name(table_name)}"
323
- end
324
- combine_multi_statements(truncate_tables)
331
+ table_names.flatten.map { |table_name| build_truncate_statement table_name }
332
+ end
333
+
334
+ def truncate(table_name, name = nil)
335
+ ActiveRecord::Base.clear_query_caches_for_current_thread if @query_cache_enabled
336
+ execute(build_truncate_statement(table_name), name)
325
337
  end
326
338
 
327
339
  def check_version
@@ -352,7 +364,8 @@ module ArJdbc
352
364
  # See: https://www.sqlite.org/lang_altertable.html
353
365
  # SQLite has an additional restriction on the ALTER TABLE statement
354
366
  def invalid_alter_table_type?(type, options)
355
- type.to_sym == :primary_key || options[:primary_key]
367
+ type.to_sym == :primary_key || options[:primary_key] ||
368
+ options[:null] == false && options[:default].nil?
356
369
  end
357
370
 
358
371
  def alter_table(table_name, foreign_keys = foreign_keys(table_name), **options)
@@ -1,3 +1,3 @@
1
1
  module ArJdbc
2
- VERSION = '60.0.0'
2
+ VERSION = '60.1.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 = 'http://repo2.maven.org/maven2/org/apache/tomcat'
3
+ TOMCAT_MAVEN_REPO = 'https://repo1.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
@@ -2165,7 +2165,7 @@ public class RubyJdbcConnection extends RubyObject {
2165
2165
  return RubyString.newString(runtime, DateTimeUtils.dateToString(value));
2166
2166
  }
2167
2167
 
2168
- return DateTimeUtils.newDateAsTime(context, value, null).callMethod(context, "to_date");
2168
+ return DateTimeUtils.newDateAsTime(context, value, DateTimeZone.UTC).callMethod(context, "to_date");
2169
2169
  }
2170
2170
 
2171
2171
  protected IRubyObject timeToRuby(final ThreadContext context,
@@ -204,6 +204,57 @@ public class MSSQLRubyJdbcConnection extends RubyJdbcConnection {
204
204
  });
205
205
  }
206
206
 
207
+ /**
208
+ * Executes an INSERT SQL statement
209
+ * @param context
210
+ * @param sql
211
+ * @param pk Rails PK
212
+ * @return ActiveRecord::Result
213
+ * @throws SQLException
214
+ */
215
+ @Override
216
+ @JRubyMethod(name = "execute_insert_pk", required = 2)
217
+ public IRubyObject execute_insert_pk(final ThreadContext context, final IRubyObject sql, final IRubyObject pk) {
218
+
219
+ // MSSQL does not like composite primary keys here so chop it if there is more than one column
220
+ IRubyObject modifiedPk = pk;
221
+
222
+ if (pk instanceof RubyArray) {
223
+ RubyArray ary = (RubyArray) pk;
224
+ if (ary.size() > 0) {
225
+ modifiedPk = ary.eltInternal(0);
226
+ }
227
+ }
228
+
229
+ return super.execute_insert_pk(context, sql, modifiedPk);
230
+ }
231
+
232
+ /**
233
+ * Executes an INSERT SQL statement using a prepared statement
234
+ * @param context
235
+ * @param sql
236
+ * @param binds RubyArray of values to be bound to the query
237
+ * @param pk Rails PK
238
+ * @return ActiveRecord::Result
239
+ * @throws SQLException
240
+ */
241
+ @Override
242
+ @JRubyMethod(name = "execute_insert_pk", required = 3)
243
+ public IRubyObject execute_insert_pk(final ThreadContext context, final IRubyObject sql, final IRubyObject binds,
244
+ final IRubyObject pk) {
245
+ // MSSQL does not like composite primary keys here so chop it if there is more than one column
246
+ IRubyObject modifiedPk = pk;
247
+
248
+ if (pk instanceof RubyArray) {
249
+ RubyArray ary = (RubyArray) pk;
250
+ if (ary.size() > 0) {
251
+ modifiedPk = ary.eltInternal(0);
252
+ }
253
+ }
254
+
255
+ return super.execute_insert_pk(context, sql, binds, modifiedPk);
256
+ }
257
+
207
258
  @Override
208
259
  protected Integer jdbcTypeFor(final String type) {
209
260
 
@@ -36,26 +36,18 @@ import java.io.ByteArrayInputStream;
36
36
  import java.lang.StringBuilder;
37
37
  import java.lang.reflect.InvocationTargetException;
38
38
  import java.math.BigDecimal;
39
- import java.sql.Connection;
40
- import java.sql.DatabaseMetaData;
41
- import java.sql.PreparedStatement;
42
- import java.sql.ResultSet;
43
- import java.sql.ResultSetMetaData;
44
- import java.sql.SQLException;
45
- import java.sql.Timestamp;
46
- import java.sql.Types;
47
- import java.util.ArrayList;
48
- import java.util.Collections;
49
- import java.util.HashMap;
50
- import java.util.Map;
51
- import java.util.UUID;
39
+ import java.sql.*;
40
+ import java.sql.Date;
41
+ import java.util.*;
52
42
  import java.util.regex.Pattern;
53
43
  import java.util.regex.Matcher;
54
44
 
45
+ import org.joda.time.DateTime;
55
46
  import org.jruby.*;
56
47
  import org.jruby.anno.JRubyMethod;
57
48
  import org.jruby.exceptions.RaiseException;
58
49
  import org.jruby.ext.bigdecimal.RubyBigDecimal;
50
+ import org.jruby.ext.date.RubyDate;
59
51
  import org.jruby.javasupport.JavaUtil;
60
52
  import org.jruby.runtime.ObjectAllocator;
61
53
  import org.jruby.runtime.ThreadContext;
@@ -115,6 +107,7 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
115
107
 
116
108
  // Used to wipe trailing 0's from points (3.0, 5.6) -> (3, 5.6)
117
109
  private static final Pattern pointCleanerPattern = Pattern.compile("\\.0\\b");
110
+ private static final TimeZone TZ_DEFAULT = TimeZone.getDefault();
118
111
 
119
112
  private RubyClass resultClass;
120
113
  private RubyHash typeMap = null;
@@ -386,7 +379,20 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
386
379
  }
387
380
  }
388
381
 
389
- super.setDateParameter(context, connection, statement, index, value, attribute, type);
382
+ if ( ! "Date".equals(value.getMetaClass().getName()) && value.respondsTo("to_date") ) {
383
+ value = value.callMethod(context, "to_date");
384
+ }
385
+
386
+ if (value instanceof RubyDate) {
387
+ RubyDate rubyDate = (RubyDate) value;
388
+ DateTime dt = rubyDate.getDateTime();
389
+ // pgjdbc needs adjustment for default JVM timezone
390
+ statement.setDate(index, new Date(dt.getMillis() - TZ_DEFAULT.getOffset(dt.getMillis())));
391
+ return;
392
+ }
393
+
394
+ // NOTE: assuming Date#to_s does right ...
395
+ statement.setDate(index, Date.valueOf(value.toString()));
390
396
  }
391
397
 
392
398
  @Override
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-alt-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 60.0.0
4
+ version: 60.1.0
5
5
  platform: java
6
6
  authors:
7
7
  - Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-23 00:00:00.000000000 Z
11
+ date: 2021-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -17,8 +17,8 @@ dependencies:
17
17
  - !ruby/object:Gem::Version
18
18
  version: 6.0.0
19
19
  name: activerecord
20
- prerelease: false
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
@@ -264,8 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
264
  - !ruby/object:Gem::Version
265
265
  version: '0'
266
266
  requirements: []
267
- rubyforge_project:
268
- rubygems_version: 2.7.10
267
+ rubygems_version: 3.0.6
269
268
  signing_key:
270
269
  specification_version: 4
271
270
  summary: ActiveRecord JDBC adapter, for use within JRuby on Rails and SQL Server