Skip to content

Commit 512f334

Browse files
authored
Refactor adapter interface to match abstract adapter (#1216)
1 parent edddc2b commit 512f334

File tree

4 files changed

+35
-49
lines changed

4 files changed

+35
-49
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
- [#1153](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1153) Only support Ruby v3.1+
1010
- [#1196](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1196) Use default inspect for database adapter
11+
- [#1216](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1216) Refactor adapter interface to match abstract adapter
1112

1213
#### Fixed
1314

lib/active_record/connection_adapters/sqlserver/database_statements.rb

+33-41
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,39 @@ def write_query?(sql) # :nodoc:
1313
!READ_QUERY.match?(sql.b)
1414
end
1515

16-
def raw_execute(sql, name, async: false, allow_retry: false, materialize_transactions: true)
17-
log(sql, name, async: async) do |notification_payload|
18-
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
19-
result = if id_insert_table_name = query_requires_identity_insert?(sql)
20-
with_identity_insert_enabled(id_insert_table_name, conn) { internal_raw_execute(sql, conn, perform_do: true) }
21-
else
22-
internal_raw_execute(sql, conn, perform_do: true)
23-
end
24-
verified!
25-
notification_payload[:row_count] = result
26-
result
27-
end
16+
def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notification_payload:, batch:)
17+
result = if id_insert_table_name = query_requires_identity_insert?(sql)
18+
with_identity_insert_enabled(id_insert_table_name, raw_connection) do
19+
internal_exec_sql_query(sql, raw_connection)
20+
end
21+
else
22+
internal_exec_sql_query(sql, raw_connection)
23+
end
24+
25+
verified!
26+
notification_payload[:row_count] = result.count
27+
result
28+
end
29+
30+
def cast_result(raw_result)
31+
if raw_result.columns.empty?
32+
ActiveRecord::Result.empty
33+
else
34+
ActiveRecord::Result.new(raw_result.columns, raw_result.rows)
2835
end
2936
end
3037

31-
def internal_exec_query(sql, name = "SQL", binds = [], prepare: false, async: false, allow_retry: false)
32-
sql = transform_query(sql)
33-
34-
check_if_write_query(sql)
35-
mark_transaction_written_if_write(sql)
38+
def affected_rows(raw_result)
39+
raw_result.first['AffectedRows']
40+
end
3641

37-
unless without_prepared_statement?(binds)
42+
def raw_execute(sql, name = nil, binds = [], prepare: false, async: false, allow_retry: false, materialize_transactions: true, batch: false)
43+
unless binds.nil? || binds.empty?
3844
types, params = sp_executesql_types_and_parameters(binds)
3945
sql = sp_executesql_sql(sql, types, params, name)
4046
end
4147

42-
log(sql, name, binds, async: async) do |notification_payload|
43-
with_raw_connection do |conn|
44-
result = if id_insert_table_name = query_requires_identity_insert?(sql)
45-
with_identity_insert_enabled(id_insert_table_name, conn) do
46-
internal_exec_sql_query(sql, conn)
47-
end
48-
else
49-
internal_exec_sql_query(sql, conn)
50-
end
51-
52-
verified!
53-
notification_payload[:row_count] = result.count
54-
result
55-
end
56-
end
48+
super
5749
end
5850

5951
def internal_exec_sql_query(sql, conn)
@@ -63,14 +55,14 @@ def internal_exec_sql_query(sql, conn)
6355
finish_statement_handle(handle)
6456
end
6557

66-
def exec_delete(sql, name, binds)
58+
def exec_delete(sql, name = nil, binds = [])
6759
sql = sql.dup << "; SELECT @@ROWCOUNT AS AffectedRows"
68-
super(sql, name, binds).rows.first.first
60+
super(sql, name, binds)
6961
end
7062

71-
def exec_update(sql, name, binds)
63+
def exec_update(sql, name = nil, binds = [])
7264
sql = sql.dup << "; SELECT @@ROWCOUNT AS AffectedRows"
73-
super(sql, name, binds).rows.first.first
65+
super(sql, name, binds)
7466
end
7567

7668
def begin_db_transaction
@@ -378,6 +370,7 @@ def sp_executesql_sql(sql, types, params, name)
378370
sql = "EXEC sp_executesql #{quote(sql)}"
379371
sql += ", #{types}, #{params}" unless params.empty?
380372
end
373+
381374
sql.freeze
382375
end
383376

@@ -455,10 +448,9 @@ def finish_statement_handle(handle)
455448
# TinyTDS returns false instead of raising an exception if connection fails.
456449
# Getting around this by raising an exception ourselves while PR
457450
# https://github.com/rails-sqlserver/tiny_tds/pull/469 is not released.
458-
def internal_raw_execute(sql, conn, perform_do: false)
459-
result = conn.execute(sql).tap do |_result|
460-
raise TinyTds::Error, "failed to execute statement" if _result.is_a?(FalseClass)
461-
end
451+
def internal_raw_execute(sql, raw_connection, perform_do: false)
452+
result = raw_connection.execute(sql)
453+
raise TinyTds::Error, "failed to execute statement" if result.is_a?(FalseClass)
462454

463455
perform_do ? result.do : result
464456
end

lib/active_record/connection_adapters/sqlserver/showplan.rb

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def explain(arel, binds = [], options = [])
1616
sql = to_sql(arel)
1717
result = with_showplan_on { internal_exec_query(sql, "EXPLAIN", binds) }
1818
printer = showplan_printer.new(result)
19+
1920
printer.pp
2021
end
2122

test/cases/coerced_tests.rb

-8
Original file line numberDiff line numberDiff line change
@@ -2250,14 +2250,6 @@ class LogSubscriberTest < ActiveRecord::TestCase
22502250
def test_verbose_query_logs_coerced
22512251
original_test_verbose_query_logs
22522252
end
2253-
2254-
# Bindings logged slightly differently.
2255-
coerce_tests! :test_where_in_binds_logging_include_attribute_names
2256-
def test_where_in_binds_logging_include_attribute_names_coerced
2257-
Developer.where(id: [1, 2, 3, 4, 5]).load
2258-
wait
2259-
assert_match(%{@0 = 1, @1 = 2, @2 = 3, @3 = 4, @4 = 5 [["id", nil], ["id", nil], ["id", nil], ["id", nil], ["id", nil]]}, @logger.logged(:debug).last)
2260-
end
22612253
end
22622254

22632255
class ReloadModelsTest < ActiveRecord::TestCase

0 commit comments

Comments
 (0)