activerecord-trilogy-adapter 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 065e502503fb93e0e951b03e67c43b8ea257a01c681c077b5b904a95ddcb0c90
|
4
|
+
data.tar.gz: 2a85e79e0654196e0dba708f7bbc4146c413bf0f0b135894357bc174374c76fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ed2509f2e8593d3d1b73c56b403875a1751f50c5e5ae99fc405fead7020ec43c5b9e0510e196b3818a5cc1335480062a8c75e2cfebb757ca19c46fa9d1404be
|
7
|
+
data.tar.gz: 45d9e001bee0aa227b2e7a7ac2f3b009d009f312cc2af128d5be0275c5f9ff2ce7b496ebde2ca7df1fedfd7a9a6b235df9fef1cfaf2309ca374357ba14d0a485
|
data/README.md
CHANGED
@@ -1,27 +1,34 @@
|
|
1
1
|
# Trilogy Adapter
|
2
2
|
|
3
|
-
Active Record database adapter for [Trilogy](https://github.com/trilogy-libraries/trilogy)
|
3
|
+
Ruby on Rails Active Record database adapter for [Trilogy](https://github.com/trilogy-libraries/trilogy), a client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding.
|
4
4
|
|
5
|
-
This gem offers Trilogy support for versions of
|
5
|
+
This gem offers Trilogy support for versions of Active Record prior to v7.1. Currently supports:
|
6
6
|
|
7
|
-
- Rails v7.
|
7
|
+
- ⚠️ Rails v7.1+ includes Trilogy support by default making this gem unnecessary
|
8
|
+
- ✅ Rails v7.0.x
|
9
|
+
- ✅ Rails v6.1.x
|
10
|
+
- ✅ Rails v6.0.x
|
8
11
|
|
9
12
|
## Requirements
|
10
13
|
|
11
|
-
- [Ruby](https://www.ruby-lang.org)
|
12
|
-
- [Active Record](https://github.com/rails/rails)
|
13
|
-
- [Trilogy](https://github.com/trilogy-libraries/trilogy)
|
14
|
+
- [Ruby](https://www.ruby-lang.org) v2.7 or higher
|
15
|
+
- [Active Record](https://github.com/rails/rails) v6.0.x or higher
|
16
|
+
- [Trilogy](https://github.com/trilogy-libraries/trilogy) v2.4.0 or higher, which is included as a dependency of this gem.
|
14
17
|
|
15
18
|
## Setup
|
16
19
|
|
17
|
-
|
20
|
+
1. Add the following to your `Gemfile` and run `bundle install`:
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
```rb
|
23
|
+
# Gemfile
|
24
|
+
gem "activerecord-trilogy-adapter"
|
25
|
+
```
|
26
|
+
2. Update your application's database configuration to use `trilogy` as the adapter:
|
22
27
|
|
23
|
-
|
24
|
-
|
28
|
+
```yaml
|
29
|
+
# config/database.yml
|
30
|
+
adapter: trilogy
|
31
|
+
```
|
25
32
|
|
26
33
|
## Versioning
|
27
34
|
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module Trilogy
|
6
|
+
module DatabaseStatements
|
7
|
+
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
|
8
|
+
:desc, :describe, :set, :show, :use
|
9
|
+
) # :nodoc:
|
10
|
+
private_constant :READ_QUERY
|
11
|
+
|
12
|
+
HIGH_PRECISION_CURRENT_TIMESTAMP = Arel.sql("CURRENT_TIMESTAMP(6)").freeze # :nodoc:
|
13
|
+
private_constant :HIGH_PRECISION_CURRENT_TIMESTAMP
|
14
|
+
|
15
|
+
def write_query?(sql) # :nodoc:
|
16
|
+
!READ_QUERY.match?(sql)
|
17
|
+
rescue ArgumentError # Invalid encoding
|
18
|
+
!READ_QUERY.match?(sql.b)
|
19
|
+
end
|
20
|
+
|
21
|
+
def explain(arel, binds = [])
|
22
|
+
sql = "EXPLAIN #{to_sql(arel, binds)}"
|
23
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
24
|
+
result = internal_exec_query(sql, "EXPLAIN", binds)
|
25
|
+
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
|
26
|
+
|
27
|
+
MySQL::ExplainPrettyPrinter.new.pp(result, elapsed)
|
28
|
+
end
|
29
|
+
|
30
|
+
def select_all(*, **) # :nodoc:
|
31
|
+
result = super
|
32
|
+
with_trilogy_connection do |conn|
|
33
|
+
conn.next_result while conn.more_results_exist?
|
34
|
+
end
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
38
|
+
def exec_query(sql, name = "SQL", binds = [], prepare: false, **kwargs)
|
39
|
+
internal_exec_query(sql, name, binds, prepare: prepare, **kwargs)
|
40
|
+
end
|
41
|
+
|
42
|
+
def internal_exec_query(sql, name = "SQL", binds = [], prepare: false, async: false) # :nodoc:
|
43
|
+
sql = transform_query(sql)
|
44
|
+
check_if_write_query(sql)
|
45
|
+
mark_transaction_written_if_write(sql)
|
46
|
+
|
47
|
+
result = raw_execute(sql, name, async: async)
|
48
|
+
ActiveRecord::Result.new(result.fields, result.to_a)
|
49
|
+
end
|
50
|
+
|
51
|
+
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil, returning: nil) # :nodoc:
|
52
|
+
sql = transform_query(sql)
|
53
|
+
check_if_write_query(sql)
|
54
|
+
mark_transaction_written_if_write(sql)
|
55
|
+
|
56
|
+
raw_execute(to_sql(sql, binds), name)
|
57
|
+
end
|
58
|
+
|
59
|
+
def exec_delete(sql, name = nil, binds = []) # :nodoc:
|
60
|
+
sql = transform_query(sql)
|
61
|
+
check_if_write_query(sql)
|
62
|
+
mark_transaction_written_if_write(sql)
|
63
|
+
|
64
|
+
result = raw_execute(to_sql(sql, binds), name)
|
65
|
+
result.affected_rows
|
66
|
+
end
|
67
|
+
|
68
|
+
alias :exec_update :exec_delete # :nodoc:
|
69
|
+
|
70
|
+
def high_precision_current_timestamp
|
71
|
+
HIGH_PRECISION_CURRENT_TIMESTAMP
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
if ActiveRecord.version < ::Gem::Version.new('7.0.a') # ActiveRecord <= 6.1 support
|
76
|
+
def raw_execute(sql, name, uses_transaction: true, **_kwargs)
|
77
|
+
# Same as mark_transaction_written_if_write(sql)
|
78
|
+
transaction = current_transaction
|
79
|
+
if transaction.respond_to?(:written) && transaction.open?
|
80
|
+
transaction.written ||= write_query?(sql)
|
81
|
+
end
|
82
|
+
|
83
|
+
log(sql, name) do
|
84
|
+
with_trilogy_connection(uses_transaction: uses_transaction) do |conn|
|
85
|
+
sync_timezone_changes(conn)
|
86
|
+
conn.query(sql)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def transform_query(sql); sql; end
|
92
|
+
def check_if_write_query(*args); end
|
93
|
+
|
94
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1.a') # ActiveRecord <= 6.0 support
|
95
|
+
def mark_transaction_written_if_write(*args); end
|
96
|
+
end
|
97
|
+
else # ActiveRecord 7.0 support
|
98
|
+
def raw_execute(sql, name, uses_transaction: true, async: false, allow_retry: false)
|
99
|
+
mark_transaction_written_if_write(sql)
|
100
|
+
log(sql, name, async: async) do
|
101
|
+
with_trilogy_connection(uses_transaction: uses_transaction, allow_retry: allow_retry) do |conn|
|
102
|
+
sync_timezone_changes(conn)
|
103
|
+
conn.query(sql)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def last_inserted_id(result)
|
110
|
+
result.last_insert_id
|
111
|
+
end
|
112
|
+
|
113
|
+
def sync_timezone_changes(conn)
|
114
|
+
# Sync any changes since connection last established.
|
115
|
+
if default_timezone == :local
|
116
|
+
conn.query_flags |= ::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
|
117
|
+
else
|
118
|
+
conn.query_flags &= ~::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -4,83 +4,82 @@ require "trilogy"
|
|
4
4
|
require "active_record/connection_adapters/abstract_mysql_adapter"
|
5
5
|
|
6
6
|
require "active_record/tasks/trilogy_database_tasks"
|
7
|
+
require "active_record/connection_adapters/trilogy/database_statements"
|
7
8
|
require "trilogy_adapter/lost_connection_exception_translator"
|
8
9
|
|
9
10
|
module ActiveRecord
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
private_constant :READ_QUERY
|
17
|
-
|
18
|
-
HIGH_PRECISION_CURRENT_TIMESTAMP = Arel.sql("CURRENT_TIMESTAMP(6)").freeze # :nodoc:
|
19
|
-
private_constant :HIGH_PRECISION_CURRENT_TIMESTAMP
|
11
|
+
# ActiveRecord <= 6.1 support
|
12
|
+
if ActiveRecord.version < ::Gem::Version.new('7.0.a')
|
13
|
+
class DatabaseConnectionError < ConnectionNotEstablished
|
14
|
+
def initialize(message = nil)
|
15
|
+
super(message || "Database connection error")
|
16
|
+
end
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
class << self
|
19
|
+
def hostname_error(hostname)
|
20
|
+
DatabaseConnectionError.new(<<~MSG)
|
21
|
+
There is an issue connecting with your hostname: #{hostname}.\n
|
22
|
+
Please check your database configuration and ensure there is a valid connection to your database.
|
23
|
+
MSG
|
25
24
|
end
|
26
25
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
MySQL::ExplainPrettyPrinter.new.pp(result, elapsed)
|
26
|
+
def username_error(username)
|
27
|
+
DatabaseConnectionError.new(<<~MSG)
|
28
|
+
There is an issue connecting to your database with your username/password, username: #{username}.\n
|
29
|
+
Please check your database configuration to ensure the username/password are valid.
|
30
|
+
MSG
|
34
31
|
end
|
32
|
+
end
|
33
|
+
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
NoDatabaseError.class_exec do
|
36
|
+
def self.db_error(db_name)
|
37
|
+
NoDatabaseError.new(<<~MSG)
|
38
|
+
We could not find your database: #{db_name}. Available database configurations can be found in config/database.yml file.
|
40
39
|
|
41
|
-
|
40
|
+
To resolve this error:
|
42
41
|
|
43
|
-
|
44
|
-
|
45
|
-
end
|
42
|
+
- Did you create the database for this app, or delete it? You may need to create your database.
|
43
|
+
- Has the database name changed? Check your database.yml config has the correct database name.
|
46
44
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
alias :exec_update :exec_delete
|
53
|
-
|
54
|
-
def high_precision_current_timestamp
|
55
|
-
HIGH_PRECISION_CURRENT_TIMESTAMP
|
56
|
-
end
|
45
|
+
To create your database, run:\n\n bin/rails db:create
|
46
|
+
MSG
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
57
50
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1.a') # ActiveRecord <= 6.0 support
|
52
|
+
require "active_record/database_configurations"
|
53
|
+
DatabaseConfigurations.class_exec do
|
54
|
+
def resolve(config) # :nodoc:
|
55
|
+
@resolver ||= ::ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new(::ActiveRecord::Base.configurations)
|
56
|
+
@resolver.resolve(config)
|
62
57
|
end
|
58
|
+
end
|
59
|
+
end
|
63
60
|
|
61
|
+
module ConnectionAdapters
|
62
|
+
class TrilogyAdapter < ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
|
64
63
|
ER_BAD_DB_ERROR = 1049
|
65
64
|
ER_ACCESS_DENIED_ERROR = 1045
|
66
65
|
|
67
66
|
ADAPTER_NAME = "Trilogy"
|
68
67
|
|
69
|
-
include DatabaseStatements
|
68
|
+
include Trilogy::DatabaseStatements
|
70
69
|
|
71
70
|
SSL_MODES = {
|
72
|
-
SSL_MODE_DISABLED: Trilogy::SSL_DISABLED,
|
73
|
-
SSL_MODE_PREFERRED: Trilogy::SSL_PREFERRED_NOVERIFY,
|
74
|
-
SSL_MODE_REQUIRED: Trilogy::SSL_REQUIRED_NOVERIFY,
|
75
|
-
SSL_MODE_VERIFY_CA: Trilogy::SSL_VERIFY_CA,
|
76
|
-
SSL_MODE_VERIFY_IDENTITY: Trilogy::SSL_VERIFY_IDENTITY
|
71
|
+
SSL_MODE_DISABLED: ::Trilogy::SSL_DISABLED,
|
72
|
+
SSL_MODE_PREFERRED: ::Trilogy::SSL_PREFERRED_NOVERIFY,
|
73
|
+
SSL_MODE_REQUIRED: ::Trilogy::SSL_REQUIRED_NOVERIFY,
|
74
|
+
SSL_MODE_VERIFY_CA: ::Trilogy::SSL_VERIFY_CA,
|
75
|
+
SSL_MODE_VERIFY_IDENTITY: ::Trilogy::SSL_VERIFY_IDENTITY
|
77
76
|
}.freeze
|
78
77
|
|
79
78
|
class << self
|
80
79
|
def new_client(config)
|
81
80
|
config[:ssl_mode] = parse_ssl_mode(config[:ssl_mode]) if config[:ssl_mode]
|
82
81
|
::Trilogy.new(config)
|
83
|
-
rescue Trilogy::ConnectionError, Trilogy::ProtocolError => error
|
82
|
+
rescue ::Trilogy::ConnectionError, ::Trilogy::ProtocolError => error
|
84
83
|
raise translate_connect_error(config, error)
|
85
84
|
end
|
86
85
|
|
@@ -88,7 +87,6 @@ module ActiveRecord
|
|
88
87
|
return mode if mode.is_a? Integer
|
89
88
|
|
90
89
|
m = mode.to_s.upcase
|
91
|
-
# enable Mysql2 client compatibility
|
92
90
|
m = "SSL_MODE_#{m}" unless m.start_with? "SSL_MODE_"
|
93
91
|
|
94
92
|
SSL_MODES.fetch(m.to_sym, mode)
|
@@ -101,13 +99,26 @@ module ActiveRecord
|
|
101
99
|
when ER_ACCESS_DENIED_ERROR
|
102
100
|
ActiveRecord::DatabaseConnectionError.username_error(config[:username])
|
103
101
|
else
|
104
|
-
if error.message.
|
102
|
+
if error.message.include?("TRILOGY_DNS_ERROR")
|
105
103
|
ActiveRecord::DatabaseConnectionError.hostname_error(config[:host])
|
106
104
|
else
|
107
105
|
ActiveRecord::ConnectionNotEstablished.new(error.message)
|
108
106
|
end
|
109
107
|
end
|
110
108
|
end
|
109
|
+
|
110
|
+
private
|
111
|
+
def initialize_type_map(m)
|
112
|
+
super if ActiveRecord.version >= ::Gem::Version.new('7.0.a')
|
113
|
+
|
114
|
+
m.register_type(%r(char)i) do |sql_type|
|
115
|
+
limit = extract_limit(sql_type)
|
116
|
+
Type.lookup(:string, adapter: :trilogy, limit: limit)
|
117
|
+
end
|
118
|
+
|
119
|
+
m.register_type %r(^enum)i, Type.lookup(:string, adapter: :trilogy)
|
120
|
+
m.register_type %r(^set)i, Type.lookup(:string, adapter: :trilogy)
|
121
|
+
end
|
111
122
|
end
|
112
123
|
|
113
124
|
def initialize(connection, logger, connection_options, config)
|
@@ -118,6 +129,8 @@ module ActiveRecord
|
|
118
129
|
)
|
119
130
|
end
|
120
131
|
|
132
|
+
TYPE_MAP = Type::TypeMap.new.tap { |m| initialize_type_map(m) }
|
133
|
+
|
121
134
|
def supports_json?
|
122
135
|
!mariadb? && database_version >= "5.7.8"
|
123
136
|
end
|
@@ -157,8 +170,6 @@ module ActiveRecord
|
|
157
170
|
@lock.synchronize do
|
158
171
|
disconnect!
|
159
172
|
connect
|
160
|
-
rescue StandardError => original_exception
|
161
|
-
raise translate_exception_class(original_exception, nil, nil)
|
162
173
|
end
|
163
174
|
end
|
164
175
|
|
@@ -170,21 +181,11 @@ module ActiveRecord
|
|
170
181
|
end
|
171
182
|
end
|
172
183
|
|
173
|
-
def
|
174
|
-
mark_transaction_written_if_write(sql)
|
175
|
-
|
176
|
-
log(sql, name, async: async) do
|
177
|
-
with_trilogy_connection(allow_retry: allow_retry, uses_transaction: uses_transaction) do |conn|
|
178
|
-
sync_timezone_changes(conn)
|
179
|
-
conn.query(sql)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def execute(sql, name = nil, **kwargs)
|
184
|
+
def execute(sql, name = nil, allow_retry: false, **kwargs)
|
185
185
|
sql = transform_query(sql)
|
186
186
|
check_if_write_query(sql)
|
187
|
-
|
187
|
+
|
188
|
+
raw_execute(sql, name, allow_retry: allow_retry, **kwargs)
|
188
189
|
end
|
189
190
|
|
190
191
|
def active?
|
@@ -206,31 +207,39 @@ module ActiveRecord
|
|
206
207
|
end
|
207
208
|
|
208
209
|
def discard!
|
209
|
-
|
210
|
+
super
|
211
|
+
unless connection.nil?
|
212
|
+
connection.discard!
|
213
|
+
self.connection = nil
|
214
|
+
end
|
210
215
|
end
|
211
216
|
|
212
|
-
|
213
|
-
|
217
|
+
private
|
218
|
+
def text_type?(type)
|
219
|
+
TYPE_MAP.lookup(type).is_a?(Type::String) || TYPE_MAP.lookup(type).is_a?(Type::Text)
|
220
|
+
end
|
221
|
+
|
222
|
+
def each_hash(result)
|
223
|
+
return to_enum(:each_hash, result) unless block_given?
|
214
224
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
225
|
+
keys = result.fields.map(&:to_sym)
|
226
|
+
result.rows.each do |row|
|
227
|
+
hash = {}
|
228
|
+
idx = 0
|
229
|
+
row.each do |value|
|
230
|
+
hash[keys[idx]] = value
|
231
|
+
idx += 1
|
232
|
+
end
|
233
|
+
yield hash
|
222
234
|
end
|
223
|
-
yield hash
|
224
|
-
end
|
225
235
|
|
226
|
-
|
227
|
-
|
236
|
+
nil
|
237
|
+
end
|
228
238
|
|
229
|
-
|
230
|
-
|
231
|
-
|
239
|
+
def error_number(exception)
|
240
|
+
exception.error_code if exception.respond_to?(:error_code)
|
241
|
+
end
|
232
242
|
|
233
|
-
private
|
234
243
|
attr_accessor :connection
|
235
244
|
|
236
245
|
def connect
|
@@ -243,17 +252,8 @@ module ActiveRecord
|
|
243
252
|
connect
|
244
253
|
end
|
245
254
|
|
246
|
-
def sync_timezone_changes(conn)
|
247
|
-
# Sync any changes since connection last established.
|
248
|
-
if ActiveRecord.default_timezone == :local
|
249
|
-
conn.query_flags |= ::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
|
250
|
-
else
|
251
|
-
conn.query_flags &= ~::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
255
|
def execute_batch(statements, name = nil)
|
256
|
-
statements = statements.map { |sql| transform_query(sql) }
|
256
|
+
statements = statements.map { |sql| transform_query(sql) } if respond_to?(:transform_query)
|
257
257
|
combine_multi_statements(statements).each do |statement|
|
258
258
|
with_trilogy_connection do |conn|
|
259
259
|
raw_execute(statement, name)
|
@@ -272,11 +272,11 @@ module ActiveRecord
|
|
272
272
|
end
|
273
273
|
|
274
274
|
with_trilogy_connection do |conn|
|
275
|
-
conn.set_server_option(Trilogy::SET_SERVER_MULTI_STATEMENTS_ON)
|
275
|
+
conn.set_server_option(::Trilogy::SET_SERVER_MULTI_STATEMENTS_ON)
|
276
276
|
|
277
277
|
yield
|
278
278
|
ensure
|
279
|
-
conn.set_server_option(Trilogy::SET_SERVER_MULTI_STATEMENTS_OFF)
|
279
|
+
conn.set_server_option(::Trilogy::SET_SERVER_MULTI_STATEMENTS_OFF)
|
280
280
|
end
|
281
281
|
end
|
282
282
|
|
@@ -317,7 +317,20 @@ module ActiveRecord
|
|
317
317
|
end
|
318
318
|
end
|
319
319
|
|
320
|
+
if ActiveRecord.version < ::Gem::Version.new('7.0.a') # For ActiveRecord <= 6.1
|
321
|
+
def default_timezone
|
322
|
+
ActiveRecord::Base.default_timezone
|
323
|
+
end
|
324
|
+
else # For ActiveRecord 7.0
|
325
|
+
def default_timezone
|
326
|
+
ActiveRecord.default_timezone
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
320
330
|
def translate_exception(exception, message:, sql:, binds:)
|
331
|
+
if exception.is_a?(::Trilogy::TimeoutError) && !exception.error_code
|
332
|
+
return ActiveRecord::AdapterTimeout.new(message, sql: sql, binds: binds)
|
333
|
+
end
|
321
334
|
error_code = exception.error_code if exception.respond_to?(:error_code)
|
322
335
|
|
323
336
|
::TrilogyAdapter::LostConnectionExceptionTranslator.
|
@@ -327,6 +340,61 @@ module ActiveRecord
|
|
327
340
|
def default_prepared_statements
|
328
341
|
false
|
329
342
|
end
|
343
|
+
|
344
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1.a') # For ActiveRecord <= 6.0
|
345
|
+
def prepared_statements?
|
346
|
+
@prepared_statements && !prepared_statements_disabled_cache.include?(object_id)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
ActiveRecord::Type.register(:immutable_string, adapter: :trilogy) do |_, **args|
|
351
|
+
Type::ImmutableString.new(true: "1", false: "0", **args)
|
352
|
+
end
|
353
|
+
|
354
|
+
ActiveRecord::Type.register(:string, adapter: :trilogy) do |_, **args|
|
355
|
+
Type::String.new(true: "1", false: "0", **args)
|
356
|
+
end
|
357
|
+
|
358
|
+
ActiveRecord::Type.register(:unsigned_integer, Type::UnsignedInteger, adapter: :trilogy)
|
330
359
|
end
|
360
|
+
|
361
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1.a') # For ActiveRecord <= 6.0
|
362
|
+
class PoolConfig < ConnectionSpecification
|
363
|
+
def initialize(connection_class, db_config, *args)
|
364
|
+
super("primary", db_config, "#{db_config[:adapter]}_connection")
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
SchemaCache.class_exec do
|
369
|
+
def self.load_from(filename)
|
370
|
+
return unless File.file?(filename)
|
371
|
+
|
372
|
+
read(filename) do |file|
|
373
|
+
if filename.include?(".dump")
|
374
|
+
Marshal.load(file)
|
375
|
+
else
|
376
|
+
if YAML.respond_to?(:unsafe_load)
|
377
|
+
YAML.unsafe_load(file)
|
378
|
+
else
|
379
|
+
YAML.load(file)
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
def self.read(filename, &block)
|
386
|
+
if File.extname(filename) == ".gz"
|
387
|
+
Zlib::GzipReader.open(filename) { |gz|
|
388
|
+
yield gz.read
|
389
|
+
}
|
390
|
+
else
|
391
|
+
yield File.read(filename)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
private_class_method :read
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
ActiveSupport.run_load_hooks(:active_record_trilogyadapter, TrilogyAdapter)
|
331
399
|
end
|
332
400
|
end
|
@@ -1,5 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1.a') # ActiveRecord <= 6.0 support
|
4
|
+
module ::ActiveRecord
|
5
|
+
class QueryAborted < ::ActiveRecord::StatementInvalid
|
6
|
+
end
|
7
|
+
class AdapterTimeout < ::ActiveRecord::QueryAborted
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
3
12
|
module TrilogyAdapter
|
4
13
|
module Errors
|
5
14
|
# ServerShutdown will be raised when the database server was shutdown.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-trilogy-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trilogy
|
@@ -30,20 +30,20 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 6.0.a
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 7.
|
36
|
+
version: 7.1.a
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: 6.0.a
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 7.
|
46
|
+
version: 7.1.a
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: minitest
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,6 +111,7 @@ extra_rdoc_files:
|
|
111
111
|
files:
|
112
112
|
- LICENSE.md
|
113
113
|
- README.md
|
114
|
+
- lib/active_record/connection_adapters/trilogy/database_statements.rb
|
114
115
|
- lib/active_record/connection_adapters/trilogy_adapter.rb
|
115
116
|
- lib/active_record/tasks/trilogy_database_tasks.rb
|
116
117
|
- lib/activerecord-trilogy-adapter.rb
|