diff --git a/CHANGELOG.md b/CHANGELOG.md index d272e368..5c25529f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - [BREAKING CHANGE] Ruby version 3.1.0 or later is required. [#632](https://github.com/MiniProfiler/rack-mini-profiler/pull/632) - [FIX] Truncate long profiler name in profiler popup. [#634](https://github.com/MiniProfiler/rack-mini-profiler/pull/634) - [FIX] `flamegraph_mode` query param having no effect. [#635](https://github.com/MiniProfiler/rack-mini-profiler/pull/635) +- [FEATURE] Show record type and count in SQL query UI. [#638](https://github.com/MiniProfiler/rack-mini-profiler/pull/638) ## 3.3.1 - 2024-02-15 - [FEATURE] Support dynamic `config.content_security_policy_nonce` [#609](https://github.com/MiniProfiler/rack-mini-profiler/pull/609) diff --git a/lib/html/includes.tmpl b/lib/html/includes.tmpl index 2acb36ba..993a8639 100644 --- a/lib/html/includes.tmpl +++ b/lib/html/includes.tmpl @@ -124,7 +124,7 @@ - + @@ -223,6 +223,9 @@ {{= MiniProfiler.renderExecuteType(it.s.execute_type) }}
{{= MiniProfiler.formatDuration(it.s.duration_milliseconds) }} ms
+ {{? it.s.row_count > 0 }} +
{{= it.s.class_name }}: {{= it.s.row_count }}
+ {{?}}
step
time from start
query type
duration
step
time from start
query type
duration
records
call stack
query
diff --git a/lib/html/vendor.js b/lib/html/vendor.js index 4129882b..80927fa0 100644 --- a/lib/html/vendor.js +++ b/lib/html/vendor.js @@ -7,7 +7,7 @@ MiniProfiler.templates = {}; MiniProfiler.templates["profilerTemplate"] = function anonymous(it ) { -var out='
';if(it.has_duplicate_sql_timings){out+='!';}out+=' '+( MiniProfiler.formatDuration(it.duration_milliseconds))+' ms ';if(MiniProfiler.showTotalSqlCount()){out+=' '+( it.sql_count)+' sql ';}out+=' ';if(it.name.length >= 30){out+=' '+( it.name.substring(0,15) + "..." + it.name.slice(-15) )+' ';}else{out+=' '+( it.name)+' ';}out+='
'+( it.name )+' ('+( MiniProfiler.formatDuration(it.duration_milliseconds))+' ms) '+( it.machine_name)+' on '+( MiniProfiler.renderDate(it.started_formatted))+'
';if(it.has_sql_timings){out+=' ';}out+=' ';var arr1=it.custom_timing_names;if(arr1){var value,i1=-1,l1=arr1.length-1;while(i1'+( value.toLowerCase() )+' (ms) ';} } out+=' '+( MiniProfiler.templates.timingTemplate({timing: it.root, page: it}) )+' ';if(it.has_sql_timings){out+=' ';}out+=' ';var arr2=it.custom_timing_names;if(arr2){var value,i2=-1,l2=arr2.length-1;while(i2 '+( MiniProfiler.formatDuration(it.custom_timing_stats[value].duration / it.duration_milliseconds * 100) )+' % in '+( value.toLowerCase() )+' ';} } out+='
event duration (ms) with children (ms) from start (ms)query time (ms)
';if(!it.client_timings){out+=' '+( MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) )+' ';}out+=' show time with children snapshots '+( MiniProfiler.formatDuration(it.duration_milliseconds_in_sql / it.duration_milliseconds * 100) )+' % in sql
';if(it.client_timings){out+=' ';var arr3=MiniProfiler.getClientTimings(it.client_timings);if(arr3){var value,i3=-1,l3=arr3.length-1;while(i3 ';} } out+='
client event duration (ms) from start (ms)
'+( value.name )+' ';if(value.duration >= 0){out+=' '+( MiniProfiler.formatDuration(value.duration) )+' ';}out+=' +'+( MiniProfiler.formatDuration(value.start) )+'
'+( MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) )+'
';}out+=' ';if(it.custom_fields && Object.keys(it.custom_fields).length > 0){out+='

Snapshot custom fields

';var arr4=Object.keys(it.custom_fields);if(arr4){var key,i4=-1,l4=arr4.length-1;while(i4 ';} } out+='
'+( key )+' '+( it.custom_fields[key] )+'
';}out+='
';if(it.has_sql_timings){out+='
';var arr5=MiniProfiler.getSqlTimings(it.root);if(arr5){var value,index=-1,l5=arr5.length-1;while(indexms ';if(MiniProfiler.showTotalSqlCount()){out+=' '+( it.sql_count)+' sql ';}out+=' ';if(it.name.length >= 30){out+=' '+( it.name.substring(0,15) + "..." + it.name.slice(-15) )+' ';}else{out+=' '+( it.name)+' ';}out+='
'+( it.name )+' ('+( MiniProfiler.formatDuration(it.duration_milliseconds))+' ms) '+( it.machine_name)+' on '+( MiniProfiler.renderDate(it.started_formatted))+'
step
time from start
query type
duration
call stack
query
';if(it.has_sql_timings){out+=' ';}out+=' ';var arr1=it.custom_timing_names;if(arr1){var value,i1=-1,l1=arr1.length-1;while(i1'+( value.toLowerCase() )+' (ms) ';} } out+=' '+( MiniProfiler.templates.timingTemplate({timing: it.root, page: it}) )+' ';if(it.has_sql_timings){out+=' ';}out+=' ';var arr2=it.custom_timing_names;if(arr2){var value,i2=-1,l2=arr2.length-1;while(i2 '+( MiniProfiler.formatDuration(it.custom_timing_stats[value].duration / it.duration_milliseconds * 100) )+' % in '+( value.toLowerCase() )+' ';} } out+='
event duration (ms) with children (ms) from start (ms)query time (ms)
';if(!it.client_timings){out+=' '+( MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) )+' ';}out+=' show time with children snapshots '+( MiniProfiler.formatDuration(it.duration_milliseconds_in_sql / it.duration_milliseconds * 100) )+' % in sql
';if(it.client_timings){out+=' ';var arr3=MiniProfiler.getClientTimings(it.client_timings);if(arr3){var value,i3=-1,l3=arr3.length-1;while(i3 ';} } out+='
client event duration (ms) from start (ms)
'+( value.name )+' ';if(value.duration >= 0){out+=' '+( MiniProfiler.formatDuration(value.duration) )+' ';}out+=' +'+( MiniProfiler.formatDuration(value.start) )+'
'+( MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) )+'
';}out+=' ';if(it.custom_fields && Object.keys(it.custom_fields).length > 0){out+='

Snapshot custom fields

';var arr4=Object.keys(it.custom_fields);if(arr4){var key,i4=-1,l4=arr4.length-1;while(i4 ';} } out+='
'+( key )+' '+( it.custom_fields[key] )+'
';}out+='
';if(it.has_sql_timings){out+='
';var arr5=MiniProfiler.getSqlTimings(it.root);if(arr5){var value,index=-1,l5=arr5.length-1;while(index ';return out; +var out=' ';return out; } MiniProfiler.templates["sqlGapTemplate"] = function anonymous(it ) { diff --git a/lib/mini_profiler/timer_struct/sql.rb b/lib/mini_profiler/timer_struct/sql.rb index 28d30964..5ba150d4 100644 --- a/lib/mini_profiler/timer_struct/sql.rb +++ b/lib/mini_profiler/timer_struct/sql.rb @@ -46,6 +46,8 @@ def initialize(query, duration_ms, page, parent, params = nil, skip_backtrace = duration_milliseconds: duration_ms, first_fetch_duration_milliseconds: duration_ms, parameters: query ? trim_binds(params) : nil, + row_count: 0, + class_name: nil, parent_timing_id: nil, is_duplicate: false )
step
time from start
query type
duration
records
call stack
query
'+( it.s.parent_timing_name )+'
T+'+( MiniProfiler.formatDuration(it.s.start_milliseconds) )+' ms
';if(it.s.is_duplicate){out+='DUPLICATE';}out+=' '+( MiniProfiler.renderExecuteType(it.s.execute_type) )+'
'+( MiniProfiler.formatDuration(it.s.duration_milliseconds) )+' ms
'+( it.s.stack_trace_snippet )+'
';if(it.s.formatted_command_string){out+='
'+( it.s.formatted_command_string )+'; '+( MiniProfiler.formatParameters(it.s.parameters) )+'
';}else{out+=' Query redacted ';}out+='
'+( it.s.parent_timing_name )+'
T+'+( MiniProfiler.formatDuration(it.s.start_milliseconds) )+' ms
';if(it.s.is_duplicate){out+='DUPLICATE';}out+=' '+( MiniProfiler.renderExecuteType(it.s.execute_type) )+'
'+( MiniProfiler.formatDuration(it.s.duration_milliseconds) )+' ms
';if(it.s.row_count > 0){out+='
'+( it.s.class_name )+': '+( it.s.row_count )+'
';}out+='
'+( it.s.stack_trace_snippet )+'
';if(it.s.formatted_command_string){out+='
'+( it.s.formatted_command_string )+'; '+( MiniProfiler.formatParameters(it.s.parameters) )+'
';}else{out+=' Query redacted ';}out+='