@@ -21,103 +21,39 @@ create or replace package body ut_coverage_extended is
2121 */
2222
2323 function get_extended_coverage(a_coverage_options ut_coverage_options) return ut_coverage.t_coverage is
24- l_result ut_coverage.t_coverage;
25- l_result_block ut_coverage.t_coverage;
26- l_result_profiler ut_coverage.t_coverage;
27- l_source_objects_crsr ut_coverage_helper.t_tmp_table_objects_crsr;
28- l_source_object ut_coverage_helper.t_tmp_table_object;
29- l_new_unit ut_coverage.t_unit_coverage;
30- l_line_no binary_integer;
24+ l_result_block ut_coverage.t_coverage;
25+ l_result_profiler_enrich ut_coverage.t_coverage;
26+ l_object ut_coverage.t_full_name;
27+ l_line_no binary_integer;
3128 begin
29+ ut_coverage_helper.cleanup_tmp_table();
3230 l_result_block := ut_coverage_block.get_coverage_data_block(a_coverage_options => a_coverage_options);
33- l_result_profiler:= ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
31+ ut_coverage_helper.cleanup_tmp_table();
32+ l_result_profiler_enrich:= ut_coverage_proftab.get_coverage_data_profiler(a_coverage_options => a_coverage_options);
3433
35-
36- ut_coverage.populate_tmp_table(a_coverage_options,ut_coverage.get_cov_sources_sql(a_coverage_options,'N'));
37-
38- l_source_objects_crsr := ut_coverage_helper.get_tmp_table_objects_cursor();
39- loop
40- fetch l_source_objects_crsr
41- into l_source_object;
42- exit when l_source_objects_crsr%notfound;
43- --check if we have a hits in any of reporters
44- if l_result_block.total_lines > 0 or l_result_profiler.total_lines > 0 then
45- --update total stats
46- l_result.total_lines := nvl(l_result.total_lines,0) + l_source_object.lines_count;
47- l_result.total_blocks := nvl(l_result_block.total_blocks,0);
48- l_result.uncovered_blocks := nvl(l_result_block.uncovered_blocks,0);
49- l_result.covered_blocks := nvl(l_result_block.covered_blocks,0);
50- l_result.partcovered_lines := nvl(l_result_block.partcovered_lines,0);
51-
52- --populate object level coverage stats
53- if not l_result.objects.exists(l_source_object.full_name) then
54- l_result.objects(l_source_object.full_name) := l_new_unit;
55- l_result.objects(l_source_object.full_name).owner := l_source_object.owner;
56- l_result.objects(l_source_object.full_name).name := l_source_object.name;
57- l_result.objects(l_source_object.full_name).total_lines := l_source_object.lines_count;
58- l_result.objects(l_source_object.full_name).total_blocks := nvl(l_result_block.objects(l_source_object.full_name).total_blocks,0);
59- l_result.objects(l_source_object.full_name).uncovered_blocks := nvl(l_result_block.objects(l_source_object.full_name).uncovered_blocks,0);
60- l_result.objects(l_source_object.full_name).covered_blocks := nvl(l_result_block.objects(l_source_object.full_name).covered_blocks,0);
61- l_result.objects(l_source_object.full_name).partcovered_lines := nvl(l_result_block.objects(l_source_object.full_name).partcovered_lines,0);
34+ -- Enrich profiler results with some of the block results
35+ l_object := l_result_profiler_enrich.objects.first;
36+ while (l_object is not null)
37+ loop
38+ l_line_no := l_result_profiler_enrich.objects(l_object).lines.first;
39+ while (l_line_no is not null)
40+ loop
41+ if l_result_block.objects(l_object).lines.exists(l_line_no) then
42+ -- enrich line level stats
43+ l_result_profiler_enrich.objects(l_object).lines(l_line_no).partcove := l_result_block.objects(l_object).lines(l_line_no).partcove;
44+ -- enrich object level stats
45+ l_result_profiler_enrich.objects(l_object).partcovered_lines := nvl(l_result_profiler_enrich.objects(l_object).partcovered_lines,0) + l_result_block.objects(l_object).lines(l_line_no).partcove;
6246 end if;
63-
64- l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.first,
65- l_result_profiler.objects(l_source_object.full_name).lines.first);
66-
67- if l_line_no is null then
68- l_result.uncovered_lines := l_result.uncovered_lines + l_source_object.lines_count;
69- l_result.objects(l_source_object.full_name).uncovered_lines := l_source_object.lines_count;
70- else
71- loop
72- exit when l_line_no is null;
73-
74- -- Set executions to zero at beginning, specific coverage will overwrite if exists.
75- l_result.objects(l_source_object.full_name).lines(l_line_no).executions := 0;
76- l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := 0;
77- l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := 0;
78- l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := 0;
79-
80- -- we need to check if given index exists for that coverage type or we get no data found
81- if l_result_block.objects(l_source_object.full_name).lines.exists(l_line_no) then
82- l_result.objects(l_source_object.full_name).lines(l_line_no).no_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).no_blocks,0);
83- l_result.objects(l_source_object.full_name).lines(l_line_no).covered_blocks := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).covered_blocks,0);
84- l_result.objects(l_source_object.full_name).lines(l_line_no).partcove := NVL(l_result_block.objects(l_source_object.full_name).lines(l_line_no).partcove,0);
85- --We capture block executions here, since block coverage do not capture more than 1
86- --if profiler executions exists we will use that number as profiler shows hits correctly
87-
88- l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_block.objects(l_source_object.full_name).lines(l_line_no).executions;
89- end if;
90-
91- if l_result_profiler.objects(l_source_object.full_name).lines.exists(l_line_no) then
92- l_result.objects(l_source_object.full_name).lines(l_line_no).executions := l_result_profiler.objects(l_source_object.full_name).lines(l_line_no).executions;
93- end if;
94-
95- -- Recalculate total lines
96- if l_result.objects(l_source_object.full_name).lines(l_line_no).executions > 0 then
97- -- total level stats
98- l_result.executions := l_result.executions + l_result.objects(l_source_object.full_name).lines(l_line_no).executions;
99- l_result.covered_lines := l_result.covered_lines + 1;
100- -- object level stats
101- l_result.objects(l_source_object.full_name).covered_lines := l_result.objects(l_source_object.full_name)
102- .covered_lines + 1;
103- elsif l_result.objects(l_source_object.full_name).lines(l_line_no).executions = 0 then
104- -- total level stats
105- l_result.uncovered_lines := l_result.uncovered_lines + 1;
106- -- object level stats
107- l_result.objects(l_source_object.full_name).uncovered_lines := l_result.objects(l_source_object.full_name)
108- .uncovered_lines + 1;
109- end if;
110-
111- l_line_no := least(l_result_block.objects(l_source_object.full_name).lines.next(l_line_no),
112- l_result_profiler.objects(l_source_object.full_name).lines.next(l_line_no));
113-
114- end loop;
115- end if;
116- end if;
117-
118- end loop;
119- close l_source_objects_crsr;
120- return l_result;
47+ --At the end go to next line
48+ l_line_no := l_result_profiler_enrich.objects(l_object).lines.next(l_line_no);
49+ end loop;
50+ --total level stats enrich
51+ l_result_profiler_enrich.partcovered_lines := nvl(l_result_profiler_enrich.partcovered_lines,0) + l_result_profiler_enrich.objects(l_object).partcovered_lines;
52+ -- At the end go to next object
53+ l_object := l_result_profiler_enrich.objects.next(l_object);
54+ end loop;
55+
56+ return l_result_profiler_enrich;
12157
12258 end get_extended_coverage;
12359
0 commit comments