Skip to content

Commit b975205

Browse files
authored
Merge pull request trilogy-libraries#24 from adrianna-chang-shopify/ac-translate-new-error-classes
Translate new error classes
2 parents a17f0ad + 93ea6cf commit b975205

File tree

5 files changed

+58
-20
lines changed

5 files changed

+58
-20
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ else
88
gem "activerecord", ENV["RAILS_VERSION"]
99
end
1010

11+
gem "trilogy", git: "https://github.com/github/trilogy", branch: "main", glob: "contrib/ruby/*.gemspec"
12+
1113
gemspec

lib/active_record/connection_adapters/trilogy_adapter.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ def last_inserted_id(result)
5656

5757
ER_BAD_DB_ERROR = 1049
5858
ER_ACCESS_DENIED_ERROR = 1045
59-
ER_CONN_HOST_ERROR = 2003
60-
ER_UNKNOWN_HOST_ERROR = 2005
6159

6260
ADAPTER_NAME = "Trilogy"
6361

@@ -75,7 +73,7 @@ class << self
7573
def new_client(config)
7674
config[:ssl_mode] = parse_ssl_mode(config[:ssl_mode]) if config[:ssl_mode]
7775
::Trilogy.new(config)
78-
rescue Trilogy::DatabaseError => error
76+
rescue Trilogy::ConnectionError, Trilogy::ProtocolError => error
7977
raise translate_connect_error(config, error)
8078
end
8179

@@ -95,10 +93,12 @@ def translate_connect_error(config, error)
9593
ActiveRecord::NoDatabaseError.db_error(config[:database])
9694
when ER_ACCESS_DENIED_ERROR
9795
ActiveRecord::DatabaseConnectionError.username_error(config[:username])
98-
when ER_CONN_HOST_ERROR, ER_UNKNOWN_HOST_ERROR
99-
ActiveRecord::DatabaseConnectionError.hostname_error(config[:host])
10096
else
101-
ActiveRecord::ConnectionNotEstablished.new(error.message)
97+
if error.message.match?(/TRILOGY_DNS_ERROR/)
98+
ActiveRecord::DatabaseConnectionError.hostname_error(config[:host])
99+
else
100+
ActiveRecord::ConnectionNotEstablished.new(error.message)
101+
end
102102
end
103103
end
104104
end

lib/trilogy_adapter/lost_connection_exception_translator.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ def translate_ruby_exception
3737
Errors::BrokenPipe.new(message)
3838
when SocketError, IOError
3939
Errors::SocketError.new(message)
40-
when Errno::ECONNRESET
41-
Errors::ConnectionResetByPeer.new(message)
40+
when Trilogy::ConnectionError
41+
if message.match?(/Connection reset by peer/)
42+
Errors::ConnectionResetByPeer.new(message)
43+
end
4244
end
4345
end
4446

test/lib/active_record/connection_adapters/trilogy_adapter_test.rb

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,40 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
2727
@adapter.disconnect!
2828
end
2929

30+
test ".new_client" do
31+
client = @adapter.class.new_client(@configuration)
32+
assert_equal Trilogy, client.class
33+
end
34+
35+
test ".new_client on db error" do
36+
configuration = @configuration.merge(database: "unknown")
37+
assert_raises ActiveRecord::NoDatabaseError do
38+
@adapter.class.new_client(configuration)
39+
end
40+
end
41+
42+
test ".new_client on access denied error" do
43+
skip("Test fails intermittently with TRILOGY_PROTOCOL_VIOLATION. See https://github.com/github/trilogy/pull/42")
44+
configuration = @configuration.merge(username: "unknown")
45+
assert_raises ActiveRecord::DatabaseConnectionError do
46+
@adapter.class.new_client(configuration)
47+
end
48+
end
49+
50+
test ".new_client on host error" do
51+
configuration = @configuration.merge(host: "unknown")
52+
assert_raises ActiveRecord::DatabaseConnectionError do
53+
@adapter.class.new_client(configuration)
54+
end
55+
end
56+
57+
test ".new_client on port error" do
58+
configuration = @configuration.merge(port: 1234)
59+
assert_raises ActiveRecord::ConnectionNotEstablished do
60+
@adapter.class.new_client(configuration)
61+
end
62+
end
63+
3064
test "#explain for one query" do
3165
explain = @adapter.explain("select * from posts")
3266
assert_match %(possible_keys), explain
@@ -121,7 +155,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
121155
end
122156

123157
test "#active? answers false with connection and exception" do
124-
@adapter.send(:connection).stub(:ping, -> { raise Trilogy::Error.new }) do
158+
@adapter.send(:connection).stub(:ping, -> { raise Trilogy::BaseError.new }) do
125159
assert_equal false, @adapter.active?
126160
end
127161
end
@@ -147,11 +181,11 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
147181
adapter = trilogy_adapter_with_connection(old_connection)
148182

149183
begin
150-
Trilogy.stub(:new, -> _ { raise Trilogy::Error.new }) do
184+
Trilogy.stub(:new, -> _ { raise Trilogy::BaseError.new }) do
151185
adapter.reconnect!
152186
end
153187
rescue ActiveRecord::StatementInvalid => ex
154-
assert_instance_of Trilogy::Error, ex.cause
188+
assert_instance_of Trilogy::BaseError, ex.cause
155189
else
156190
flunk "Expected Trilogy::Error to be raised"
157191
end
@@ -381,7 +415,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
381415

382416
# Cause an ER_SERVER_SHUTDOWN error (code 1053) after the session is
383417
# set. On reconnect, the adapter will get a real, working connection.
384-
server_shutdown_error = Trilogy::DatabaseError.new
418+
server_shutdown_error = Trilogy::ProtocolError.new
385419
server_shutdown_error.instance_variable_set(:@error_code, 1053)
386420
mock_connection.expect(:query, nil) { raise server_shutdown_error }
387421

@@ -416,7 +450,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
416450
assert adapter.active?
417451

418452
# Make connection lost for future queries by exceeding the read timeout
419-
assert_raises(Errno::ETIMEDOUT) do
453+
assert_raises(Trilogy::TimeoutError) do
420454
connection.query "SELECT sleep(2);"
421455
end
422456
assert_not adapter.active?
@@ -497,7 +531,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
497531
adapter.execute("SELECT 1")
498532

499533
# Cause the client to disconnect without the adapter's awareness
500-
assert_raises Errno::ETIMEDOUT do
534+
assert_raises Trilogy::TimeoutError do
501535
adapter.send(:connection).query("SELECT sleep(2)")
502536
end
503537

@@ -519,7 +553,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
519553
adapter.execute("SELECT 1")
520554

521555
# Cause the client to disconnect without the adapter's awareness
522-
assert_raises Errno::ETIMEDOUT do
556+
assert_raises Trilogy::TimeoutError do
523557
adapter.send(:connection).query("SELECT sleep(2)")
524558
end
525559
end
@@ -558,7 +592,7 @@ class ActiveRecord::ConnectionAdapters::TrilogyAdapterTest < TestCase
558592
test "#execute fails with unknown error" do
559593
assert_raises_with_message(ActiveRecord::StatementInvalid, /A random error/) do
560594
connection = Minitest::Mock.new Trilogy.new(@configuration)
561-
connection.expect(:query, nil) { raise Trilogy::DatabaseError, "A random error." }
595+
connection.expect(:query, nil) { raise Trilogy::ProtocolError, "A random error." }
562596
adapter = trilogy_adapter_with_connection(connection)
563597

564598
adapter.execute "SELECT * FROM posts;"

test/lib/trilogy_adapter/lost_connection_exception_translator_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
class TrilogyAdapter::LostConnectionExceptionTranslatorTest < TestCase
66
test "#translate returns appropriate TrilogyAdapter error for Trilogy exceptions" do
77
translator = TrilogyAdapter::LostConnectionExceptionTranslator.new(
8-
Trilogy::DatabaseError.new,
8+
Trilogy::ProtocolError.new,
99
"ER_SERVER_SHUTDOWN 1053",
1010
1053
1111
)
@@ -15,7 +15,7 @@ class TrilogyAdapter::LostConnectionExceptionTranslatorTest < TestCase
1515

1616
test "#translate returns nil for Trilogy exceptions when the error code is not given" do
1717
translator = TrilogyAdapter::LostConnectionExceptionTranslator.new(
18-
Trilogy::DatabaseError.new,
18+
Trilogy::ProtocolError.new,
1919
"ER_SERVER_SHUTDOWN 1053",
2020
nil
2121
)
@@ -35,7 +35,7 @@ class TrilogyAdapter::LostConnectionExceptionTranslatorTest < TestCase
3535

3636
test "#translate returns appropriate TrilogyAdapter error for lost connection Trilogy exceptions" do
3737
translator = TrilogyAdapter::LostConnectionExceptionTranslator.new(
38-
Trilogy::Error.new,
38+
Trilogy::BaseError.new,
3939
"TRILOGY_UNEXPECTED_PACKET",
4040
nil
4141
)
@@ -45,7 +45,7 @@ class TrilogyAdapter::LostConnectionExceptionTranslatorTest < TestCase
4545

4646
test "#translate returns nil for non-lost connection exceptions" do
4747
translator = TrilogyAdapter::LostConnectionExceptionTranslator.new(
48-
Trilogy::Error.new,
48+
Trilogy::BaseError.new,
4949
"Something bad happened but it wasn't a lost connection so...",
5050
nil
5151
)

0 commit comments

Comments
 (0)