-
Notifications
You must be signed in to change notification settings - Fork 21.4k
/
database_statements.rb
105 lines (89 loc) · 3.38 KB
/
database_statements.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# frozen_string_literal: true
module ActiveRecord
module ConnectionAdapters
module Trilogy
module DatabaseStatements
def select_all(*, **) # :nodoc:
result = super
with_raw_connection do |conn|
conn.next_result while conn.more_results_exist?
end
result
end
def internal_exec_query(sql, name = "SQL", binds = [], prepare: false, async: false, allow_retry: false) # :nodoc:
sql = transform_query(sql)
check_if_write_query(sql)
mark_transaction_written_if_write(sql)
result = raw_execute(sql, name, async: async, allow_retry: allow_retry)
ActiveRecord::Result.new(result.fields, result.to_a)
end
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil, returning: nil) # :nodoc:
sql = transform_query(sql)
check_if_write_query(sql)
mark_transaction_written_if_write(sql)
sql, _binds = sql_for_insert(sql, pk, binds, returning)
raw_execute(sql, name)
end
def exec_delete(sql, name = nil, binds = []) # :nodoc:
sql = transform_query(sql)
check_if_write_query(sql)
mark_transaction_written_if_write(sql)
result = raw_execute(to_sql(sql, binds), name)
result.affected_rows
end
alias :exec_update :exec_delete # :nodoc:
private
def raw_execute(sql, name, async: false, allow_retry: false, materialize_transactions: true)
log(sql, name, async: async) do |notification_payload|
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
sync_timezone_changes(conn)
result = conn.query(sql)
verified!
handle_warnings(sql)
notification_payload[:row_count] = result.count
result
end
end
end
def last_inserted_id(result)
if supports_insert_returning?
super
else
result.last_insert_id
end
end
def sync_timezone_changes(conn)
# Sync any changes since connection last established.
if default_timezone == :local
conn.query_flags |= ::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
else
conn.query_flags &= ~::Trilogy::QUERY_FLAGS_LOCAL_TIMEZONE
end
end
def execute_batch(statements, name = nil)
statements = statements.map { |sql| transform_query(sql) }
combine_multi_statements(statements).each do |statement|
with_raw_connection do |conn|
raw_execute(statement, name)
conn.next_result while conn.more_results_exist?
end
end
end
def multi_statements_enabled?
!!@config[:multi_statement]
end
def with_multi_statements
if multi_statements_enabled?
return yield
end
with_raw_connection do |conn|
conn.set_server_option(::Trilogy::SET_SERVER_MULTI_STATEMENTS_ON)
yield
ensure
conn.set_server_option(::Trilogy::SET_SERVER_MULTI_STATEMENTS_OFF) if active?
end
end
end
end
end
end