Skip to content

Commit 751b60c

Browse files
committed
Postgres, fix connecting to database
Error: test_query(PostgreSQLConnectionTest::ContextWithTable): ActiveRecord::ConnectionNotEstablished: adapter requires :driver class and jdbc :url arjdbc/jdbc/RubyJdbcConnection.java:532:in `initialize' org/jruby/RubyClass.java:935:in `new' /home/jessec/bryk/vendor_gems/activerecord-jdbc-adapter/lib/arjdbc/postgresql/adapter.rb:879:in `new_client' /home/jessec/bryk/vendor_gems/activerecord-jdbc-adapter/lib/arjdbc/abstract/connection_management.rb:43:in `connect' /home/jessec/bryk/vendor_gems/activerecord-jdbc-adapter/lib/arjdbc/abstract/connection_management.rb:53:in `reconnect' /home/jessec/.gem/jruby/3.1.4/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:662:in `block in reconnect!' /home/jessec/.gem/jruby/3.1.4/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize' /home/jessec/.gem/jruby/3.1.4/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:661:in `reconnect!' /home/jessec/.gem/jruby/3.1.4/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:763:in `block in verify!' /home/jessec/.gem/jruby/3.1.4/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize' ...
1 parent 113836b commit 751b60c

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

lib/arjdbc/postgresql.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
require 'arjdbc'
22
require 'arjdbc/postgresql/adapter'
3-
require 'arjdbc/postgresql/connection_methods'
3+
# require 'arjdbc/postgresql/connection_methods'

lib/arjdbc/postgresql/adapter.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
require 'arjdbc/postgresql/name'
2525
require 'arjdbc/postgresql/database_statements'
2626
require 'arjdbc/postgresql/schema_statements'
27+
require "arjdbc/postgresql/adapter_hash_config"
2728

2829
require 'active_model'
2930

@@ -855,6 +856,7 @@ class PostgreSQLAdapter < AbstractAdapter
855856
include ArJdbc::Abstract::StatementCache
856857
include ArJdbc::Abstract::TransactionSupport
857858
include ArJdbc::PostgreSQL
859+
include ArJdbc::PostgreSQLConfig
858860

859861
require 'arjdbc/postgresql/oid_types'
860862
include ::ArJdbc::PostgreSQL::OIDTypes
@@ -900,7 +902,8 @@ def dbconsole(config, options = {})
900902
def initialize(...)
901903
super
902904

903-
conn_params = @config.compact
905+
# assign arjdbc extra connection params
906+
conn_params = build_connection_config(@config.compact)
904907

905908
@connection_parameters = conn_params
906909

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# frozen_string_literal: true
2+
3+
module ArJdbc
4+
module PostgreSQLConfig
5+
def build_connection_config(config)
6+
config = config.deep_dup
7+
8+
load_jdbc_driver
9+
10+
config[:driver] ||= database_driver_name
11+
12+
host = (config[:host] ||= config[:hostaddr] || ENV["PGHOST"] || "localhost")
13+
port = (config[:port] ||= ENV["PGPORT"] || 5432)
14+
database = config[:database] || config[:dbname] || ENV["PGDATABASE"]
15+
16+
config[:url] ||= "jdbc:postgresql://#{host}:#{port}/#{database}"
17+
18+
config[:url] << config[:pg_params] if config[:pg_params]
19+
20+
config[:username] ||= config[:user] || ENV["PGUSER"] || ENV_JAVA["user.name"]
21+
config[:password] ||= ENV["PGPASSWORD"] unless config.key?(:password)
22+
23+
config[:properties] = build_properties(config)
24+
25+
config
26+
end
27+
28+
private
29+
30+
def load_jdbc_driver
31+
require "jdbc/postgres"
32+
33+
::Jdbc::Postgres.load_driver(:require) if defined?(::Jdbc::Postgres.load_driver)
34+
rescue LoadError
35+
# assuming driver.jar is on the class-path
36+
end
37+
38+
def database_driver_name
39+
return ::Jdbc::Postgres.driver_name if defined?(::Jdbc::Postgres.driver_name)
40+
41+
"org.postgresql.Driver"
42+
end
43+
44+
def build_properties(config)
45+
properties = config[:properties] || {}
46+
47+
# PG :connect_timeout - maximum time to wait for connection to succeed
48+
connect_timeout = config[:connect_timeout] || ENV["PGCONNECT_TIMEOUT"]
49+
50+
properties["socketTimeout"] ||= connect_timeout if connect_timeout
51+
52+
login_timeout = config[:login_timeout]
53+
54+
properties["loginTimeout"] ||= login_timeout if login_timeout
55+
56+
sslmode = config.key?(:sslmode) ? config[:sslmode] : config[:requiressl]
57+
# NOTE: makes not much sense since this needs some JVM options :
58+
sslmode = ENV["PGSSLMODE"] || ENV["PGREQUIRESSL"] if sslmode.nil?
59+
60+
# PG :sslmode - disable|allow|prefer|require
61+
unless sslmode.nil? || !(sslmode == true || sslmode.to_s == "require")
62+
# JRuby/JVM needs to be started with :
63+
# -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=...
64+
# or a non-validating connection might be used (for testing) :
65+
# :sslfactory = 'org.postgresql.ssl.NonValidatingFactory'
66+
67+
if config[:driver].start_with?("org.postgresql.")
68+
properties["sslfactory"] ||= "org.postgresql.ssl.NonValidatingFactory"
69+
end
70+
71+
properties["ssl"] ||= "true"
72+
end
73+
74+
properties["tcpKeepAlive"] ||= config[:keepalives] if config.key?(:keepalives)
75+
properties["kerberosServerName"] ||= config[:krbsrvname] if config[:krbsrvname]
76+
77+
prepared_statements = config.fetch(:prepared_statements, true)
78+
79+
prepared_statements = false if prepared_statements == "false"
80+
81+
if prepared_statements
82+
# this makes the pgjdbc driver handle hot compatibility internally
83+
properties["autosave"] ||= "conservative"
84+
else
85+
# If prepared statements are off, lets make sure they are really *off*
86+
properties["prepareThreshold"] = 0
87+
end
88+
89+
properties
90+
end
91+
end
92+
end

0 commit comments

Comments
 (0)