Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce adapter for Trilogy, a MySQL-compatible DB client
The [Trilogy database client][trilogy-client] and corresponding [Active Record adapter][ar-adapter] were both open sourced by GitHub last year. Shopify has recently taken the plunge and successfully adopted Trilogy in their Rails monolith. With two major Rails applications running Trilogy successfully, we'd like to propose upstreaming the adapter to Rails as a MySQL-compatible alternative to Mysql2Adapter. [trilogy-client]: https://github.com/github/trilogy [ar-adapter]: https://github.com/github/activerecord-trilogy-adapter Co-authored-by: Aaron Patterson <tenderlove@github.com> Co-authored-by: Adam Roben <adam@roben.org> Co-authored-by: Ali Ibrahim <aibrahim2k2@gmail.com> Co-authored-by: Aman Gupta <aman@tmm1.net> Co-authored-by: Arthur Nogueira Neves <github@arthurnn.com> Co-authored-by: Arthur Schreiber <arthurschreiber@github.com> Co-authored-by: Ashe Connor <kivikakk@github.com> Co-authored-by: Brandon Keepers <brandon@opensoul.org> Co-authored-by: Brian Lopez <seniorlopez@gmail.com> Co-authored-by: Brooke Kuhlmann <brooke@testdouble.com> Co-authored-by: Bryana Knight <bryanaknight@github.com> Co-authored-by: Carl Brasic <brasic@github.com> Co-authored-by: Chris Bloom <chrisbloom7@github.com> Co-authored-by: Cliff Pruitt <cliff.pruitt@cliffpruitt.com> Co-authored-by: Daniel Colson <composerinteralia@github.com> Co-authored-by: David Calavera <david.calavera@gmail.com> Co-authored-by: David Celis <davidcelis@github.com> Co-authored-by: David Ratajczak <david@mockra.com> Co-authored-by: Dirkjan Bussink <d.bussink@gmail.com> Co-authored-by: Eileen Uchitelle <eileencodes@gmail.com> Co-authored-by: Enrique Gonzalez <enriikke@gmail.com> Co-authored-by: Garrett Bjerkhoel <garrett@github.com> Co-authored-by: Georgi Knox <georgicodes@github.com> Co-authored-by: HParker <HParker@github.com> Co-authored-by: Hailey Somerville <hailey@hailey.lol> Co-authored-by: James Dennes <jdennes@gmail.com> Co-authored-by: Jane Sternbach <janester@github.com> Co-authored-by: Jess Bees <toomanybees@github.com> Co-authored-by: Jesse Toth <jesse.toth@github.com> Co-authored-by: Joel Hawksley <joelhawksley@github.com> Co-authored-by: John Barnette <jbarnette@github.com> Co-authored-by: John Crepezzi <john.crepezzi@gmail.com> Co-authored-by: John Hawthorn <john@hawthorn.email> Co-authored-by: John Nunemaker <nunemaker@gmail.com> Co-authored-by: Jonathan Hoyt <hoyt@github.com> Co-authored-by: Katrina Owen <kytrinyx@github.com> Co-authored-by: Keeran Raj Hawoldar <keeran@gmail.com> Co-authored-by: Kevin Solorio <soloriok@gmail.com> Co-authored-by: Leo Correa <lcorr005@gmail.com> Co-authored-by: Lizz Hale <lizzhale@github.com> Co-authored-by: Lorin Thwaits <lorint@gmail.com> Co-authored-by: Matt Jones <al2o3cr@gmail.com> Co-authored-by: Matthew Draper <matthewd@github.com> Co-authored-by: Max Veytsman <mveytsman@github.com> Co-authored-by: Nathan Witmer <nathan@zerowidth.com> Co-authored-by: Nick Holden <nick.r.holden@gmail.com> Co-authored-by: Paarth Madan <paarth.madan@shopify.com> Co-authored-by: Patrick Reynolds <patrick.reynolds@github.com> Co-authored-by: Rob Sanheim <rsanheim@gmail.com> Co-authored-by: Rocio Delgado <rocio@github.com> Co-authored-by: Sam Lambert <sam.lambert@github.com> Co-authored-by: Shay Frendt <shay@github.com> Co-authored-by: Shlomi Noach <shlomi-noach@github.com> Co-authored-by: Sophie Haskins <sophaskins@github.com> Co-authored-by: Thomas Maurer <tma@github.com> Co-authored-by: Tim Pease <tim.pease@gmail.com> Co-authored-by: Yossef Mendelssohn <ymendel@pobox.com> Co-authored-by: Zack Koppert <zkoppert@github.com> Co-authored-by: Zhongying Qiao <cryptoque@users.noreply.github.com>
- Loading branch information
1 parent
bd8aeea
commit 5ed3f60
Showing
68 changed files
with
1,735 additions
and
161 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
49 changes: 49 additions & 0 deletions
49
activerecord/lib/active_record/connection_adapters/trilogy/errors.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# frozen_string_literal: true | ||
|
||
module ActiveRecord | ||
module ConnectionAdapters | ||
module Trilogy | ||
module Errors | ||
# ServerShutdown will be raised when the database server was shutdown. | ||
class ServerShutdown < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# ServerLost will be raised when the database connection was lost. | ||
class ServerLost < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# ServerGone will be raised when the database connection is gone. | ||
class ServerGone < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# BrokenPipe will be raised when a system process connection fails. | ||
class BrokenPipe < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# SocketError will be raised when Ruby encounters a network error. | ||
class SocketError < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# ConnectionResetByPeer will be raised when a network connection is closed | ||
# outside the sytstem process. | ||
class ConnectionResetByPeer < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# ClosedConnection will be raised when the Trilogy encounters a closed | ||
# connection. | ||
class ClosedConnection < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# InvalidSequenceId will be raised when Trilogy ecounters an invalid sequence | ||
# id. | ||
class InvalidSequenceId < ActiveRecord::ConnectionFailed | ||
end | ||
|
||
# UnexpectedPacket will be raised when Trilogy ecounters an unexpected | ||
# response packet. | ||
class UnexpectedPacket < ActiveRecord::ConnectionFailed | ||
end | ||
end | ||
end | ||
end | ||
end |
64 changes: 64 additions & 0 deletions
64
...ord/lib/active_record/connection_adapters/trilogy/lost_connection_exception_translator.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
# frozen_string_literal: true | ||
|
||
module ActiveRecord | ||
module ConnectionAdapters | ||
module Trilogy | ||
class LostConnectionExceptionTranslator | ||
attr_reader :exception, :message, :error_number | ||
|
||
def initialize(exception, message, error_number) | ||
@exception = exception | ||
@message = message | ||
@error_number = error_number | ||
end | ||
|
||
def translate | ||
translate_database_exception || translate_ruby_exception || translate_trilogy_exception | ||
end | ||
|
||
private | ||
ER_SERVER_SHUTDOWN = 1053 | ||
CR_SERVER_LOST = 2013 | ||
CR_SERVER_LOST_EXTENDED = 2055 | ||
CR_SERVER_GONE_ERROR = 2006 | ||
|
||
def translate_database_exception | ||
case error_number | ||
when ER_SERVER_SHUTDOWN | ||
Errors::ServerShutdown.new(message) | ||
when CR_SERVER_LOST, CR_SERVER_LOST_EXTENDED | ||
Errors::ServerLost.new(message) | ||
when CR_SERVER_GONE_ERROR | ||
Errors::ServerGone.new(message) | ||
end | ||
end | ||
|
||
def translate_ruby_exception | ||
case exception | ||
when Errno::EPIPE | ||
Errors::BrokenPipe.new(message) | ||
when SocketError, IOError | ||
Errors::SocketError.new(message) | ||
when ::Trilogy::ConnectionError | ||
if message.include?("Connection reset by peer") | ||
Errors::ConnectionResetByPeer.new(message) | ||
end | ||
end | ||
end | ||
|
||
def translate_trilogy_exception | ||
return unless exception.is_a?(::Trilogy::Error) | ||
|
||
case message | ||
when /TRILOGY_CLOSED_CONNECTION/ | ||
Errors::ClosedConnection.new(message) | ||
when /TRILOGY_INVALID_SEQUENCE_ID/ | ||
Errors::InvalidSequenceId.new(message) | ||
when /TRILOGY_UNEXPECTED_PACKET/ | ||
Errors::UnexpectedPacket.new(message) | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end |
Oops, something went wrong.