Skip to content

Commit e7880d0

Browse files
authored
Add row_count field to sql.active_record notification (#1169)
1 parent b64b4f6 commit e7880d0

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

+16-18
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ def write_query?(sql) # :nodoc:
1414
end
1515

1616
def raw_execute(sql, name, async: false, allow_retry: false, materialize_transactions: true)
17-
result = nil
18-
1917
log(sql, name, async: async) do
2018
with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
2119
result = if id_insert_table_name = query_requires_identity_insert?(sql)
@@ -24,14 +22,12 @@ def raw_execute(sql, name, async: false, allow_retry: false, materialize_transac
2422
internal_raw_execute(sql, conn, perform_do: true)
2523
end
2624
verified!
25+
result
2726
end
2827
end
29-
30-
result
3128
end
3229

3330
def internal_exec_query(sql, name = "SQL", binds = [], prepare: false, async: false, allow_retry: false)
34-
result = nil
3531
sql = transform_query(sql)
3632

3733
check_if_write_query(sql)
@@ -42,20 +38,21 @@ def internal_exec_query(sql, name = "SQL", binds = [], prepare: false, async: fa
4238
sql = sp_executesql_sql(sql, types, params, name)
4339
end
4440

45-
log(sql, name, binds, async: async) do
41+
log(sql, name, binds, async: async) do |notification_payload|
4642
with_raw_connection do |conn|
47-
if id_insert_table_name = query_requires_identity_insert?(sql)
48-
with_identity_insert_enabled(id_insert_table_name, conn) do
49-
result = internal_exec_sql_query(sql, conn)
50-
end
51-
else
52-
result = internal_exec_sql_query(sql, conn)
53-
end
43+
result = if id_insert_table_name = query_requires_identity_insert?(sql)
44+
with_identity_insert_enabled(id_insert_table_name, conn) do
45+
internal_exec_sql_query(sql, conn)
46+
end
47+
else
48+
internal_exec_sql_query(sql, conn)
49+
end
50+
5451
verified!
52+
notification_payload[:row_count] = result.count
53+
result
5554
end
5655
end
57-
58-
result
5956
end
6057

6158
def internal_exec_sql_query(sql, conn)
@@ -174,7 +171,7 @@ def execute_procedure(proc_name, *variables)
174171
end.join(", ")
175172
sql = "EXEC #{proc_name} #{vars}".strip
176173

177-
log(sql, "Execute Procedure") do
174+
log(sql, "Execute Procedure") do |notification_payload|
178175
with_raw_connection do |conn|
179176
result = internal_raw_execute(sql, conn)
180177
verified!
@@ -185,10 +182,11 @@ def execute_procedure(proc_name, *variables)
185182
yield(r) if block_given?
186183
end
187184

188-
result.each.map { |row| row.is_a?(Hash) ? row.with_indifferent_access : row }
185+
result = result.each.map { |row| row.is_a?(Hash) ? row.with_indifferent_access : row }
186+
notification_payload[:row_count] = result.count
187+
result
189188
end
190189
end
191-
192190
end
193191

194192
def with_identity_insert_enabled(table_name, conn)

test/cases/coerced_tests.rb

+22
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,28 @@ def test_payload_name_on_load_coerced
351351
Book.send(:load_schema!)
352352
original_test_payload_name_on_load
353353
end
354+
355+
# Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
356+
coerce_tests! :test_payload_row_count_on_select_all
357+
def test_payload_row_count_on_select_all_coerced
358+
connection.remove_index(:books, column: [:author_id, :name])
359+
360+
original_test_payload_row_count_on_select_all
361+
ensure
362+
Book.where(author_id: nil, name: 'row count book 1').delete_all
363+
Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
364+
end
365+
366+
# Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
367+
coerce_tests! :test_payload_row_count_on_raw_sql
368+
def test_payload_row_count_on_raw_sql_coerced
369+
connection.remove_index(:books, column: [:author_id, :name])
370+
371+
original_test_payload_row_count_on_raw_sql
372+
ensure
373+
Book.where(author_id: nil, name: 'row count book 3').delete_all
374+
Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
375+
end
354376
end
355377
end
356378

0 commit comments

Comments
 (0)