Skip to content

Commit 8e39e0d

Browse files
committed
Extract Trilogy::DatabaseStatements
To be consistent with other adapters.
1 parent f902999 commit 8e39e0d

File tree

2 files changed

+91
-83
lines changed

2 files changed

+91
-83
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveRecord
4+
module ConnectionAdapters
5+
module Trilogy
6+
module DatabaseStatements
7+
READ_QUERY = 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 select_all(*, **) # :nodoc:
16+
result = nil
17+
with_raw_connection do |conn|
18+
result = super
19+
conn.next_result while conn.more_results_exist?
20+
end
21+
result
22+
end
23+
24+
def write_query?(sql) # :nodoc:
25+
!READ_QUERY.match?(sql)
26+
rescue ArgumentError # Invalid encoding
27+
!READ_QUERY.match?(sql.b)
28+
end
29+
30+
def explain(arel, binds = [], options = [])
31+
sql = build_explain_clause(options) + " " + to_sql(arel, binds)
32+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
33+
result = exec_query(sql, "EXPLAIN", binds)
34+
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
35+
36+
MySQL::ExplainPrettyPrinter.new.pp(result, elapsed)
37+
end
38+
39+
def exec_query(sql, name = "SQL", binds = [], prepare: false, async: false)
40+
sql = transform_query(sql)
41+
check_if_write_query(sql)
42+
43+
result = raw_execute(sql, name, async: async)
44+
ActiveRecord::Result.new(result.fields, result.to_a)
45+
end
46+
47+
alias exec_without_stmt exec_query
48+
49+
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
50+
sql = transform_query(sql)
51+
check_if_write_query(sql)
52+
53+
raw_execute(to_sql(sql, binds), name)
54+
end
55+
56+
def exec_delete(sql, name = nil, binds = [])
57+
sql = transform_query(sql)
58+
check_if_write_query(sql)
59+
60+
result = raw_execute(to_sql(sql, binds), name)
61+
result.affected_rows
62+
end
63+
64+
alias :exec_update :exec_delete
65+
66+
def high_precision_current_timestamp
67+
HIGH_PRECISION_CURRENT_TIMESTAMP
68+
end
69+
70+
def build_explain_clause(options = [])
71+
return "EXPLAIN" if options.empty?
72+
73+
explain_clause = "EXPLAIN #{options.join(" ").upcase}"
74+
75+
if analyze_without_explain? && explain_clause.include?("ANALYZE")
76+
explain_clause.sub("EXPLAIN ", "")
77+
else
78+
explain_clause
79+
end
80+
end
81+
82+
private
83+
def last_inserted_id(result)
84+
result.last_insert_id
85+
end
86+
end
87+
end
88+
end
89+
end

activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb

Lines changed: 2 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
gem "trilogy", "~> 2.4"
66
require "trilogy"
77

8+
require "active_record/connection_adapters/trilogy/database_statements"
89
require "active_record/connection_adapters/trilogy/lost_connection_exception_translator"
910
require "active_record/connection_adapters/trilogy/errors"
1011

@@ -37,95 +38,13 @@ def trilogy_connection(config)
3738
end
3839
module ConnectionAdapters
3940
class TrilogyAdapter < AbstractMysqlAdapter
40-
module DatabaseStatements
41-
READ_QUERY = AbstractAdapter.build_read_query_regexp(
42-
:desc, :describe, :set, :show, :use
43-
) # :nodoc:
44-
private_constant :READ_QUERY
45-
46-
HIGH_PRECISION_CURRENT_TIMESTAMP = Arel.sql("CURRENT_TIMESTAMP(6)").freeze # :nodoc:
47-
private_constant :HIGH_PRECISION_CURRENT_TIMESTAMP
48-
49-
def select_all(*, **) # :nodoc:
50-
result = nil
51-
with_raw_connection do |conn|
52-
result = super
53-
conn.next_result while conn.more_results_exist?
54-
end
55-
result
56-
end
57-
58-
def write_query?(sql) # :nodoc:
59-
!READ_QUERY.match?(sql)
60-
rescue ArgumentError # Invalid encoding
61-
!READ_QUERY.match?(sql.b)
62-
end
63-
64-
def explain(arel, binds = [], options = [])
65-
sql = build_explain_clause(options) + " " + to_sql(arel, binds)
66-
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
67-
result = exec_query(sql, "EXPLAIN", binds)
68-
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
69-
70-
MySQL::ExplainPrettyPrinter.new.pp(result, elapsed)
71-
end
72-
73-
def exec_query(sql, name = "SQL", binds = [], prepare: false, async: false)
74-
sql = transform_query(sql)
75-
check_if_write_query(sql)
76-
77-
result = raw_execute(sql, name, async: async)
78-
ActiveRecord::Result.new(result.fields, result.to_a)
79-
end
80-
81-
alias exec_without_stmt exec_query
82-
83-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
84-
sql = transform_query(sql)
85-
check_if_write_query(sql)
86-
87-
raw_execute(to_sql(sql, binds), name)
88-
end
89-
90-
def exec_delete(sql, name = nil, binds = [])
91-
sql = transform_query(sql)
92-
check_if_write_query(sql)
93-
94-
result = raw_execute(to_sql(sql, binds), name)
95-
result.affected_rows
96-
end
97-
98-
alias :exec_update :exec_delete
99-
100-
def high_precision_current_timestamp
101-
HIGH_PRECISION_CURRENT_TIMESTAMP
102-
end
103-
104-
def build_explain_clause(options = [])
105-
return "EXPLAIN" if options.empty?
106-
107-
explain_clause = "EXPLAIN #{options.join(" ").upcase}"
108-
109-
if analyze_without_explain? && explain_clause.include?("ANALYZE")
110-
explain_clause.sub("EXPLAIN ", "")
111-
else
112-
explain_clause
113-
end
114-
end
115-
116-
private
117-
def last_inserted_id(result)
118-
result.last_insert_id
119-
end
120-
end
121-
12241
ER_BAD_DB_ERROR = 1049
12342
ER_DBACCESS_DENIED_ERROR = 1044
12443
ER_ACCESS_DENIED_ERROR = 1045
12544

12645
ADAPTER_NAME = "Trilogy"
12746

128-
include DatabaseStatements
47+
include Trilogy::DatabaseStatements
12948

13049
SSL_MODES = {
13150
SSL_MODE_DISABLED: ::Trilogy::SSL_DISABLED,

0 commit comments

Comments
 (0)