@@ -16,10 +16,26 @@ create or replace package body ut_coverage is
1616 limitations under the License.
1717 */
1818
19-
20- type t_source_lines is table of binary_integer;
19+ g_coverage_id tt_coverage_id_arr;
20+ g_develop_mode boolean not null := false;
21+ g_is_started boolean not null := false;
22+
23+ procedure set_develop_mode(a_develop_mode in boolean) is
24+ begin
25+ g_develop_mode := a_develop_mode;
26+ end;
27+
28+ function get_coverage_id(a_coverage_type in varchar2) return integer is
29+ begin
30+ return g_coverage_id(a_coverage_type);
31+ end;
2132
22- function get_cov_sources_sql(a_coverage_options ut_coverage_options, a_skipped_lines varchar2 default 'Y') return varchar2 is
33+ function is_develop_mode return boolean is
34+ begin
35+ return g_develop_mode;
36+ end;
37+
38+ function get_cov_sources_sql(a_coverage_options ut_coverage_options) return varchar2 is
2339 l_result varchar2(32767);
2440 l_full_name varchar2(100);
2541 l_view_name varchar2(200) := ut_metadata.get_dba_view('dba_source');
@@ -44,8 +60,7 @@ create or replace package body ut_coverage is
4460 and regexp_like( t.text, '[A-Za-z0-9$#_]*(begin|declare|compound).*','i'))
4561 ) as line,
4662 s.text, ]';
47- if a_skipped_lines = 'Y' then
48- l_result := l_result ||
63+ l_result := l_result ||
4964 q'[case
5065 when
5166 -- to avoid execution of regexp_like on every line
@@ -62,10 +77,7 @@ create or replace package body ut_coverage is
6277 )
6378 then 'Y'
6479 end as to_be_skipped ]';
65- else
66- l_result := l_result || q'['N' as to_be_skipped ]';
67- end if;
68-
80+
6981 l_result := l_result ||' from '||l_view_name||q'[ s]';
7082
7183 if a_coverage_options.file_mappings is not empty then
@@ -96,7 +108,7 @@ create or replace package body ut_coverage is
96108 l_skip_objects ut_object_names;
97109 l_sql varchar2(32767);
98110 begin
99- if not ut_coverage_helper. is_develop_mode() then
111+ if not is_develop_mode() then
100112 --skip all the utplsql framework objects and all the unit test packages that could potentially be reported by coverage.
101113 l_skip_objects := ut_utils.get_utplsql_objects_list() multiset union all coalesce(a_coverage_options.exclude_objects, ut_object_names());
102114 end if;
@@ -111,13 +123,13 @@ create or replace package body ut_coverage is
111123 return l_cursor;
112124 end;
113125
114- procedure populate_tmp_table(a_coverage_options in ut_coverage_options,a_sql in varchar2) is
126+ procedure populate_tmp_table(a_coverage_options ut_coverage_options, a_sql in varchar2) is
115127 pragma autonomous_transaction;
116128 l_cov_sources_crsr sys_refcursor;
117129 l_cov_sources_data ut_coverage_helper.t_coverage_sources_tmp_rows;
118130 begin
119131
120- if not ut_coverage_helper.is_tmp_table_populated() or ut_coverage_helper. is_develop_mode() then
132+ if not ut_coverage_helper.is_tmp_table_populated() or is_develop_mode() then
121133 ut_coverage_helper.cleanup_tmp_table();
122134
123135 l_cov_sources_crsr := get_cov_sources_cursor(a_coverage_options,a_sql);
@@ -140,33 +152,55 @@ create or replace package body ut_coverage is
140152 * Public functions
141153 */
142154 procedure coverage_start(a_coverage_options ut_coverage_options default null) is
155+ l_run_comment varchar2(200) := 'utPLSQL Code coverage run '||ut_utils.to_string(systimestamp);
143156 begin
144- ut_coverage_helper.coverage_start('utPLSQL Code coverage run '||ut_utils.to_string(systimestamp));
157+ if not is_develop_mode() and not g_is_started then
158+ $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
159+ ut_coverage_helper_block.coverage_start( l_run_comment, g_coverage_id(gc_block_coverage) );
160+ -- g_coverage_id(gc_block_coverage) := dbms_plsql_code_coverage.start_coverage( l_run_comment );
161+ $end
162+ ut_coverage_helper_profiler.coverage_start( l_run_comment, g_coverage_id(gc_proftab_coverage) );
163+ coverage_pause();
164+ g_is_started := true;
165+ end if;
145166 end;
146167
147- procedure coverage_start_develop(a_coverage_options ut_coverage_options default null) is
168+ procedure coverage_pause is
148169 begin
149- ut_coverage_helper.coverage_start_develop;
170+ if not is_develop_mode() then
171+ ut_coverage_helper_profiler.coverage_pause();
172+ end if;
150173 end;
151174
152- procedure coverage_pause is
175+ procedure coverage_resume is
153176 begin
154- ut_coverage_helper.coverage_pause ();
177+ ut_coverage_helper_profiler.coverage_resume ();
155178 end;
156179
157- procedure coverage_resume is
180+ procedure mock_coverage_id(a_coverage_id integer,a_coverage_type in varchar2) is
158181 begin
159- ut_coverage_helper.coverage_resume();
182+ g_develop_mode := true;
183+ g_is_started := true;
184+ g_coverage_id(a_coverage_type) := a_coverage_id;
160185 end;
161186
162- procedure coverage_stop is
187+ procedure mock_coverage_id(a_coverage_id tt_coverage_id_arr) is
163188 begin
164- ut_coverage_helper.coverage_stop();
189+ g_develop_mode := true;
190+ g_is_started := true;
191+ g_coverage_id := a_coverage_id;
165192 end;
166193
167- procedure coverage_stop_develop is
194+ procedure coverage_stop is
168195 begin
169- ut_coverage_helper.coverage_stop_develop();
196+ if not is_develop_mode() then
197+ g_is_started := false;
198+ $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
199+ ut_coverage_helper_block.coverage_stop();
200+ $end
201+ ut_coverage_helper_profiler.coverage_stop();
202+ g_is_started := false;
203+ end if;
170204 end;
171205
172206 function get_coverage_data(a_coverage_options ut_coverage_options) return t_coverage is
@@ -175,13 +209,16 @@ create or replace package body ut_coverage is
175209 l_object ut_coverage.t_full_name;
176210 l_line_no binary_integer;
177211 begin
178- -- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
212+ --prepare global temp table with sources
213+ populate_tmp_table(a_coverage_options, get_cov_sources_sql(a_coverage_options));
214+
215+ -- Get raw data for both reporters, order is important as tmp table will skip headers and dont populate
179216 -- tmp table for block again.
180- l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data(a_coverage_options => a_coverage_options );
217+ l_result_profiler_enrich:= ut_coverage_profiler.get_coverage_data( a_coverage_options, get_coverage_id(gc_proftab_coverage) );
181218
182219 -- If block coverage available we will use it.
183220 $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then
184- l_result_block := ut_coverage_block.get_coverage_data(a_coverage_options => a_coverage_options );
221+ l_result_block := ut_coverage_block.get_coverage_data( a_coverage_options, get_coverage_id(gc_block_coverage) );
185222
186223 -- Enrich profiler results with some of the block results
187224 l_object := l_result_profiler_enrich.objects.first;
0 commit comments