activerecord-jdbc-alt-adapter 71.0.0.alpha1-java → 71.0.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +7 -4
- data/.github/workflows/ruby.yml +11 -11
- data/.gitignore +6 -3
- data/Gemfile +2 -2
- data/README.md +3 -2
- data/activerecord-jdbc-adapter.gemspec +1 -1
- data/lib/arel/visitors/sqlserver.rb +15 -2
- data/lib/arjdbc/abstract/connection_management.rb +10 -8
- data/lib/arjdbc/abstract/core.rb +2 -8
- data/lib/arjdbc/abstract/database_statements.rb +5 -15
- data/lib/arjdbc/abstract/relation_query_attribute_monkey_patch.rb +24 -0
- data/lib/arjdbc/abstract/statement_cache.rb +1 -1
- data/lib/arjdbc/abstract/transaction_support.rb +0 -13
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/mssql/adapter.rb +15 -4
- data/lib/arjdbc/mssql/schema_statements.rb +6 -3
- data/lib/arjdbc/mssql.rb +1 -1
- data/lib/arjdbc/mysql/adapter.rb +43 -6
- data/lib/arjdbc/postgresql/adapter.rb +252 -105
- data/lib/arjdbc/postgresql/database_statements.rb +20 -0
- data/lib/arjdbc/postgresql/oid_types.rb +8 -27
- data/lib/arjdbc/postgresql/schema_statements.rb +57 -0
- data/lib/arjdbc/sqlite3/adapter.rb +32 -47
- data/lib/arjdbc/version.rb +1 -1
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +2 -2
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +11 -0
- metadata +7 -4
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ArJdbc
|
4
|
+
module PostgreSQL
|
5
|
+
module SchemaStatements
|
6
|
+
ForeignKeyDefinition = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition
|
7
|
+
Utils = ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
|
8
|
+
|
9
|
+
def foreign_keys(table_name)
|
10
|
+
scope = quoted_scope(table_name)
|
11
|
+
fk_info = internal_exec_query(<<~SQL, "SCHEMA", allow_retry: true, materialize_transactions: false)
|
12
|
+
SELECT t2.oid::regclass::text AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete, c.convalidated AS valid, c.condeferrable AS deferrable, c.condeferred AS deferred, c.conkey, c.confkey, c.conrelid, c.confrelid
|
13
|
+
FROM pg_constraint c
|
14
|
+
JOIN pg_class t1 ON c.conrelid = t1.oid
|
15
|
+
JOIN pg_class t2 ON c.confrelid = t2.oid
|
16
|
+
JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid
|
17
|
+
JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
|
18
|
+
JOIN pg_namespace t3 ON c.connamespace = t3.oid
|
19
|
+
WHERE c.contype = 'f'
|
20
|
+
AND t1.relname = #{scope[:name]}
|
21
|
+
AND t3.nspname = #{scope[:schema]}
|
22
|
+
ORDER BY c.conname
|
23
|
+
SQL
|
24
|
+
|
25
|
+
fk_info.map do |row|
|
26
|
+
to_table = Utils.unquote_identifier(row["to_table"])
|
27
|
+
# conkey = row["conkey"].scan(/\d+/).map(&:to_i)
|
28
|
+
# confkey = row["confkey"].scan(/\d+/).map(&:to_i)
|
29
|
+
conkey = row["conkey"]
|
30
|
+
confkey = row["confkey"]
|
31
|
+
|
32
|
+
if conkey.size > 1
|
33
|
+
column = column_names_from_column_numbers(row["conrelid"], conkey)
|
34
|
+
primary_key = column_names_from_column_numbers(row["confrelid"], confkey)
|
35
|
+
else
|
36
|
+
column = Utils.unquote_identifier(row["column"])
|
37
|
+
primary_key = row["primary_key"]
|
38
|
+
end
|
39
|
+
|
40
|
+
options = {
|
41
|
+
column: column,
|
42
|
+
name: row["name"],
|
43
|
+
primary_key: primary_key
|
44
|
+
}
|
45
|
+
|
46
|
+
options[:on_delete] = extract_foreign_key_action(row["on_delete"])
|
47
|
+
options[:on_update] = extract_foreign_key_action(row["on_update"])
|
48
|
+
options[:deferrable] = extract_constraint_deferrable(row["deferrable"], row["deferred"])
|
49
|
+
|
50
|
+
options[:validate] = row["valid"]
|
51
|
+
|
52
|
+
ForeignKeyDefinition.new(table_name, to_table, options)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -18,6 +18,8 @@ require "active_record/connection_adapters/sqlite3/schema_statements"
|
|
18
18
|
require "active_support/core_ext/class/attribute"
|
19
19
|
require "arjdbc/sqlite3/column"
|
20
20
|
|
21
|
+
require "arjdbc/abstract/relation_query_attribute_monkey_patch"
|
22
|
+
|
21
23
|
module SQLite3
|
22
24
|
module Constants
|
23
25
|
module Open
|
@@ -669,50 +671,20 @@ module ArJdbc
|
|
669
671
|
StatementPool.new(self.class.type_cast_config_to_integer(@config[:statement_limit]))
|
670
672
|
end
|
671
673
|
|
672
|
-
def
|
673
|
-
if
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
# @raw_connection.busy_timeout(self.class.type_cast_config_to_integer(@config[:timeout]))
|
678
|
-
elsif @config[:retries]
|
679
|
-
retries = self.class.type_cast_config_to_integer(@config[:retries])
|
680
|
-
raw_connection.busy_handler do |count|
|
681
|
-
count <= retries
|
682
|
-
end
|
683
|
-
end
|
684
|
-
|
685
|
-
# Enforce foreign key constraints
|
686
|
-
# https://www.sqlite.org/pragma.html#pragma_foreign_keys
|
687
|
-
# https://www.sqlite.org/foreignkeys.html
|
688
|
-
raw_execute("PRAGMA foreign_keys = ON", "SCHEMA")
|
689
|
-
unless @memory_database
|
690
|
-
# Journal mode WAL allows for greater concurrency (many readers + one writer)
|
691
|
-
# https://www.sqlite.org/pragma.html#pragma_journal_mode
|
692
|
-
raw_execute("PRAGMA journal_mode = WAL", "SCHEMA")
|
693
|
-
# Set more relaxed level of database durability
|
694
|
-
# 2 = "FULL" (sync on every write), 1 = "NORMAL" (sync every 1000 written pages) and 0 = "NONE"
|
695
|
-
# https://www.sqlite.org/pragma.html#pragma_synchronous
|
696
|
-
raw_execute("PRAGMA synchronous = NORMAL", "SCHEMA")
|
697
|
-
# Set the global memory map so all processes can share some data
|
698
|
-
# https://www.sqlite.org/pragma.html#pragma_mmap_size
|
699
|
-
# https://www.sqlite.org/mmap.html
|
700
|
-
raw_execute("PRAGMA mmap_size = #{128.megabytes}", "SCHEMA")
|
674
|
+
def reconnect
|
675
|
+
if active?
|
676
|
+
@raw_connection.rollback rescue nil
|
677
|
+
else
|
678
|
+
connect
|
701
679
|
end
|
702
|
-
# Impose a limit on the WAL file to prevent unlimited growth
|
703
|
-
# https://www.sqlite.org/pragma.html#pragma_journal_size_limit
|
704
|
-
raw_execute("PRAGMA journal_size_limit = #{64.megabytes}", "SCHEMA")
|
705
|
-
# Set the local connection cache to 2000 pages
|
706
|
-
# https://www.sqlite.org/pragma.html#pragma_cache_size
|
707
|
-
raw_execute("PRAGMA cache_size = 2000", "SCHEMA")
|
708
680
|
end
|
709
681
|
|
710
682
|
def configure_connection
|
711
683
|
if @config[:timeout] && @config[:retries]
|
712
684
|
raise ArgumentError, "Cannot specify both timeout and retries arguments"
|
713
685
|
elsif @config[:timeout]
|
714
|
-
# FIXME:
|
715
|
-
#
|
686
|
+
# FIXME: missing from adapter
|
687
|
+
# @raw_connection.busy_timeout(self.class.type_cast_config_to_integer(@config[:timeout]))
|
716
688
|
elsif @config[:retries]
|
717
689
|
retries = self.class.type_cast_config_to_integer(@config[:retries])
|
718
690
|
raw_connection.busy_handler do |count|
|
@@ -742,7 +714,7 @@ module ArJdbc
|
|
742
714
|
raw_execute("PRAGMA journal_size_limit = #{64.megabytes}", "SCHEMA")
|
743
715
|
# Set the local connection cache to 2000 pages
|
744
716
|
# https://www.sqlite.org/pragma.html#pragma_cache_size
|
745
|
-
raw_execute("PRAGMA cache_size = 2000", "SCHEMA")
|
717
|
+
raw_execute("PRAGMA cache_size = 2000", "SCHEMA")
|
746
718
|
end
|
747
719
|
end
|
748
720
|
# DIFFERENCE: A registration here is moved down to concrete class so we are not registering part of an adapter.
|
@@ -774,6 +746,20 @@ module ActiveRecord::ConnectionAdapters
|
|
774
746
|
# config.active_record.sqlite3_adapter_strict_strings_by_default = true
|
775
747
|
class_attribute :strict_strings_by_default, default: false # Does not actually do anything right now
|
776
748
|
|
749
|
+
def initialize(...)
|
750
|
+
super
|
751
|
+
|
752
|
+
conn_params = @config.compact
|
753
|
+
|
754
|
+
# NOTE: strict strings is not supported by the jdbc driver yet,
|
755
|
+
# hope it will supported soon, I open a issue in their repository.
|
756
|
+
# https://github.com/xerial/sqlite-jdbc/issues/1153
|
757
|
+
#
|
758
|
+
# @config[:strict] = ConnectionAdapters::SQLite3Adapter.strict_strings_by_default unless @config.key?(:strict)
|
759
|
+
|
760
|
+
@connection_parameters = conn_params
|
761
|
+
end
|
762
|
+
|
777
763
|
def self.represent_boolean_as_integer=(value) # :nodoc:
|
778
764
|
if value == false
|
779
765
|
raise "`.represent_boolean_as_integer=` is now always true, so make sure your application can work with it and remove this settings."
|
@@ -817,15 +803,6 @@ module ActiveRecord::ConnectionAdapters
|
|
817
803
|
::ActiveRecord::ConnectionAdapters::SQLite3Column
|
818
804
|
end
|
819
805
|
|
820
|
-
def jdbc_connection_class(spec)
|
821
|
-
self.class.jdbc_connection_class
|
822
|
-
end
|
823
|
-
|
824
|
-
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
825
|
-
def self.jdbc_connection_class
|
826
|
-
::ActiveRecord::ConnectionAdapters::SQLite3JdbcConnection
|
827
|
-
end
|
828
|
-
|
829
806
|
# 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).
|
830
807
|
# ActiveSupport.run_load_hooks(:active_record_sqlite3adapter, SQLite3Adapter)
|
831
808
|
|
@@ -843,6 +820,14 @@ module ActiveRecord::ConnectionAdapters
|
|
843
820
|
::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
|
844
821
|
|
845
822
|
class << self
|
823
|
+
def jdbc_connection_class
|
824
|
+
::ActiveRecord::ConnectionAdapters::SQLite3JdbcConnection
|
825
|
+
end
|
826
|
+
|
827
|
+
def new_client(conn_params, adapter_instance)
|
828
|
+
jdbc_connection_class.new(conn_params, adapter_instance)
|
829
|
+
end
|
830
|
+
|
846
831
|
def dbconsole(config, options = {})
|
847
832
|
args = []
|
848
833
|
|
data/lib/arjdbc/version.rb
CHANGED
@@ -793,8 +793,8 @@ public class RubyJdbcConnection extends RubyObject {
|
|
793
793
|
// Unfortunately the result set gets closed when getMoreResults()
|
794
794
|
// is called, so we have to process the result sets as we get them
|
795
795
|
// this shouldn't be an issue in most cases since we're only getting 1 result set anyways
|
796
|
-
|
797
|
-
result = mapToRawResult(context, connection, resultSet, false);
|
796
|
+
result = mapExecuteResult(context, connection, resultSet);
|
797
|
+
// result = mapToRawResult(context, connection, resultSet, false);
|
798
798
|
resultSet.close();
|
799
799
|
} else {
|
800
800
|
result = context.runtime.newFixnum(updateCount);
|
@@ -119,6 +119,17 @@ public class MySQLRubyJdbcConnection extends RubyJdbcConnection {
|
|
119
119
|
return driverWrapper;
|
120
120
|
}
|
121
121
|
|
122
|
+
@JRubyMethod(name = "ping")
|
123
|
+
public RubyBoolean db_ping(final ThreadContext context) {
|
124
|
+
final Connection connection = getConnection(true);
|
125
|
+
if (connection == null) return context.fals;
|
126
|
+
|
127
|
+
// NOTE: It seems only `connection.isValid(aliveTimeout)` is needed
|
128
|
+
// for JDBC 4.0 and up. https://jira.mariadb.org/browse/CONJ-51
|
129
|
+
|
130
|
+
return context.runtime.newBoolean(isConnectionValid(context, connection));
|
131
|
+
}
|
132
|
+
|
122
133
|
private static transient Class MYSQL_CONNECTION;
|
123
134
|
private static transient Boolean MYSQL_CONNECTION_FOUND;
|
124
135
|
|
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: 71.0.0
|
4
|
+
version: 71.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Nick Sieger, Ola Bini, Karol Bucek, Jesse Chavez, and JRuby contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/arjdbc/abstract/connection_management.rb
|
79
79
|
- lib/arjdbc/abstract/core.rb
|
80
80
|
- lib/arjdbc/abstract/database_statements.rb
|
81
|
+
- lib/arjdbc/abstract/relation_query_attribute_monkey_patch.rb
|
81
82
|
- lib/arjdbc/abstract/statement_cache.rb
|
82
83
|
- lib/arjdbc/abstract/transaction_support.rb
|
83
84
|
- lib/arjdbc/discover.rb
|
@@ -143,8 +144,10 @@ files:
|
|
143
144
|
- lib/arjdbc/postgresql/base/pgconn.rb
|
144
145
|
- lib/arjdbc/postgresql/column.rb
|
145
146
|
- lib/arjdbc/postgresql/connection_methods.rb
|
147
|
+
- lib/arjdbc/postgresql/database_statements.rb
|
146
148
|
- lib/arjdbc/postgresql/name.rb
|
147
149
|
- lib/arjdbc/postgresql/oid_types.rb
|
150
|
+
- lib/arjdbc/postgresql/schema_statements.rb
|
148
151
|
- lib/arjdbc/railtie.rb
|
149
152
|
- lib/arjdbc/sqlite3.rb
|
150
153
|
- lib/arjdbc/sqlite3/adapter.rb
|
@@ -228,9 +231,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
228
231
|
version: '0'
|
229
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
233
|
requirements:
|
231
|
-
- - "
|
234
|
+
- - ">="
|
232
235
|
- !ruby/object:Gem::Version
|
233
|
-
version:
|
236
|
+
version: '0'
|
234
237
|
requirements: []
|
235
238
|
rubygems_version: 3.3.26
|
236
239
|
signing_key:
|