Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 64dfb41

Browse files
committed
Output buffer&reporters performance improvements
1 parent b3e98be commit 64dfb41

19 files changed

Lines changed: 372 additions & 249 deletions

source/core/output_buffers/ut_output_buffer_base.tps

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ create or replace type ut_output_buffer_base authid definer as object(
2020
member procedure init(self in out nocopy ut_output_buffer_base),
2121
not instantiable member procedure close(self in ut_output_buffer_base),
2222
not instantiable member procedure send_line(self in ut_output_buffer_base, a_text varchar2),
23+
not instantiable member procedure send_lines(self in ut_output_buffer_base, a_text_list ut_varchar2_rows),
2324
not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_varchar2_rows pipelined,
2425
not instantiable member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor,
2526
not instantiable member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null)

source/core/output_buffers/ut_output_table_buffer.tpb

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,15 @@ create or replace type body ut_output_table_buffer is
4747
end;
4848

4949
overriding member procedure send_line(self in ut_output_table_buffer, a_text varchar2) is
50-
l_text_list ut_varchar2_rows;
5150
pragma autonomous_transaction;
5251
begin
5352
if a_text is not null then
5453
if length(a_text) > ut_utils.gc_max_storage_varchar2_len then
55-
l_text_list := ut_utils.convert_collection(ut_utils.clob_to_table(a_text, ut_utils.gc_max_storage_varchar2_len));
56-
insert
57-
into ut_output_buffer_tmp(output_id, message_id, text)
58-
select self.output_id, ut_message_id_seq.nextval, t.column_value
59-
from table(l_text_list) t;
54+
self.send_lines(
55+
ut_utils.convert_collection(
56+
ut_utils.clob_to_table(a_text, ut_utils.gc_max_storage_varchar2_len)
57+
)
58+
);
6059
else
6160
insert into ut_output_buffer_tmp(output_id, message_id, text)
6261
values (self.output_id, ut_message_id_seq.nextval, a_text);
@@ -65,6 +64,18 @@ create or replace type body ut_output_table_buffer is
6564
end if;
6665
end;
6766

67+
overriding member procedure send_lines(self in ut_output_table_buffer, a_text_list ut_varchar2_rows) is
68+
pragma autonomous_transaction;
69+
begin
70+
insert into ut_output_buffer_tmp(output_id, message_id, text)
71+
select self.output_id, ut_message_id_seq.nextval, t.column_value
72+
from table(a_text_list) t
73+
where t.column_value is not null;
74+
75+
commit;
76+
end;
77+
78+
6879
overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_varchar2_rows pipelined is
6980
l_buffer_data ut_varchar2_rows;
7081
l_already_waited_for number(10,2) := 0;

source/core/output_buffers/ut_output_table_buffer.tps

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ create or replace type ut_output_table_buffer under ut_output_buffer_base (
2020
constructor function ut_output_table_buffer(self in out nocopy ut_output_table_buffer, a_output_id raw := null) return self as result,
2121
overriding member procedure init(self in out nocopy ut_output_table_buffer),
2222
overriding member procedure send_line(self in ut_output_table_buffer, a_text varchar2),
23+
overriding member procedure send_lines(self in ut_output_table_buffer, a_text_list ut_varchar2_rows),
2324
overriding member procedure close(self in ut_output_table_buffer),
2425
overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_varchar2_rows pipelined,
2526
overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor,

source/core/types/ut_output_reporter_base.tpb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ create or replace type body ut_output_reporter_base is
4646
self.output_buffer.send_line(a_text);
4747
end;
4848

49+
member procedure print_text_lines(self in out nocopy ut_output_reporter_base, a_text_lines ut_varchar2_rows) is
50+
begin
51+
self.output_buffer.send_lines(a_text_lines);
52+
end;
53+
4954
final member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural) return ut_varchar2_rows pipelined is
5055
begin
5156
for i in (select column_value from table(self.output_buffer.get_lines(a_initial_timeout, a_timeout_sec))) loop

source/core/types/ut_output_reporter_base.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ create or replace type ut_output_reporter_base under ut_reporter_base(
2222
overriding member procedure before_calling_run(self in out nocopy ut_output_reporter_base, a_run in ut_run),
2323

2424
member procedure print_text(self in out nocopy ut_output_reporter_base, a_text varchar2),
25-
25+
member procedure print_text_lines(self in out nocopy ut_output_reporter_base, a_text_lines ut_varchar2_rows),
2626
member procedure print_clob(self in out nocopy ut_output_reporter_base, a_clob clob),
2727

2828
final member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_varchar2_rows pipelined,

source/core/ut_utils.pkb

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,51 @@ create or replace package body ut_utils is
326326
end if;
327327
end append_to_list;
328328

329-
procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2:= chr(10)) is
329+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows) is
330+
begin
331+
if a_items is not null then
332+
if a_list is null then
333+
a_list := ut_varchar2_rows();
334+
end if;
335+
for i in 1 .. a_items.count loop
336+
a_list.extend;
337+
a_list(a_list.last) := a_items(i);
338+
end loop;
339+
end if;
340+
end;
341+
342+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob) is
343+
begin
344+
append_to_list(
345+
a_list,
346+
convert_collection(
347+
clob_to_table( a_item, ut_utils.gc_max_storage_varchar2_len )
348+
)
349+
);
350+
end;
351+
352+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2) is
353+
l_items ut_varchar2_rows;
354+
begin
355+
if a_item is not null then
356+
if a_list is null then
357+
a_list := ut_varchar2_rows();
358+
end if;
359+
if length(a_item) > gc_max_storage_varchar2_len then
360+
append_to_list(
361+
a_list,
362+
ut_utils.convert_collection(
363+
ut_utils.clob_to_table( a_item, gc_max_storage_varchar2_len )
364+
)
365+
);
366+
else
367+
a_list.extend;
368+
a_list(a_list.last) := a_item;
369+
end if;
370+
end if;
371+
end append_to_list;
372+
373+
procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2:= chr(10)) is
330374
begin
331375
if a_clob_table is not null and cardinality(a_clob_table) > 0 then
332376
if a_src_clob is null then
@@ -522,7 +566,7 @@ procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab,
522566
||'?>';
523567
end;
524568

525-
function trim_list_elements(a_list IN ut_varchar2_list, a_regexp_to_trim in varchar2 default '[:space:]') return ut_varchar2_list is
569+
function trim_list_elements(a_list ut_varchar2_list, a_regexp_to_trim varchar2 default '[:space:]') return ut_varchar2_list is
526570
l_trimmed_list ut_varchar2_list;
527571
l_index integer;
528572
begin

source/core/ut_utils.pks

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,21 @@ create or replace package ut_utils authid definer is
247247
*/
248248
procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2);
249249

250+
/**
251+
* Append a item to the end of ut_varchar2_rows
252+
*/
253+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2);
254+
255+
/**
256+
* Append a item to the end of ut_varchar2_rows
257+
*/
258+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob);
259+
260+
/**
261+
* Append a list of items to the end of ut_varchar2_rows
262+
*/
263+
procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows);
264+
250265
procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2 := chr(10));
251266

252267
procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob);

source/reporters/ut_coverage_cobertura_reporter.tpb

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ create or replace type body ut_coverage_cobertura_reporter is
3939
l_line_no := a_unit_coverage.lines.first;
4040
if l_line_no is null then
4141
for i in 1 .. a_unit_coverage.total_lines loop
42-
l_file_part := '<line number="'||i||'" hits="0" branch="false"/>'||chr(10);
43-
ut_utils.append_to_clob(l_result, l_file_part);
42+
ut_utils.append_to_clob(l_result, '<line number="'||i||'" hits="0" branch="false"/>');
4443
end loop;
4544
else
4645
while l_line_no is not null loop
@@ -68,79 +67,83 @@ create or replace type body ut_coverage_cobertura_reporter is
6867
function get_coverage_xml(
6968
a_coverage_data ut_coverage.t_coverage,
7069
a_run ut_run
71-
) return clob is
70+
) return ut_varchar2_rows is
7271
l_file_part varchar2(32767);
73-
l_result clob;
72+
l_result ut_varchar2_rows := ut_varchar2_rows();
7473
l_unit ut_coverage.t_full_name;
7574
l_obj_name ut_coverage.t_object_name;
76-
c_coverage_def constant varchar2(200) := '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">'||chr(10);
77-
c_file_footer constant varchar2(30) := '</file>'||chr(10);
75+
c_coverage_def constant varchar2(200) := '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">';
76+
c_file_footer constant varchar2(30) := '</file>';
7877
c_coverage_footer constant varchar2(30) := '</coverage>';
79-
c_sources_footer constant varchar2(30) := '</sources>'||chr(10);
80-
c_packages_footer constant varchar2(30) := '</packages>'||chr(10);
81-
c_package_footer constant varchar2(30) := '</package>'||chr(10);
82-
c_class_footer constant varchar2(30) := '</class>'||chr(10);
83-
c_lines_footer constant varchar2(30) := '</lines>'||chr(10);
78+
c_sources_footer constant varchar2(30) := '</sources>';
79+
c_packages_footer constant varchar2(30) := '</packages>';
80+
c_package_footer constant varchar2(30) := '</package>';
81+
c_class_footer constant varchar2(30) := '</class>';
82+
c_lines_footer constant varchar2(30) := '</lines>';
8483
l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
8584
begin
8685

87-
dbms_lob.createtemporary(l_result,true);
88-
89-
ut_utils.append_to_clob(l_result, ut_utils.get_xml_header(a_run.client_character_set)||chr(10));
90-
ut_utils.append_to_clob(l_result, c_coverage_def);
86+
ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
87+
ut_utils.append_to_list( l_result, c_coverage_def );
9188

9289
--write header
93-
l_file_part:= '<coverage line-rate="0" branch-rate="0.0" lines-covered="'||a_coverage_data.covered_lines||'" lines-valid="'||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">';
94-
ut_utils.append_to_clob(l_result, l_file_part);
90+
ut_utils.append_to_list(
91+
l_result,
92+
'<coverage line-rate="0" branch-rate="0.0" lines-covered="'
93+
||a_coverage_data.covered_lines||'" lines-valid="'
94+
||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)
95+
||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">'
96+
);
9597

9698

9799
--Write sources
98100
l_unit := a_coverage_data.objects.first;
99-
l_file_part := '<sources>'||CHR(10);
100-
ut_utils.append_to_clob(l_result, l_file_part);
101+
ut_utils.append_to_list( l_result, '<sources>' );
101102

102103
while l_unit is not null loop
103-
l_file_part := '<source>'||dbms_xmlgen.convert(l_unit)||'</source>'||chr(10);
104-
ut_utils.append_to_clob(l_result, l_file_part);
104+
ut_utils.append_to_list(l_result, '<source>'||dbms_xmlgen.convert(l_unit)||'</source>');
105105
l_unit := a_coverage_data.objects.next(l_unit);
106106
end loop;
107-
ut_utils.append_to_clob(l_result, c_sources_footer);
107+
ut_utils.append_to_list(l_result, c_sources_footer);
108108

109109
--write packages
110110
l_unit := a_coverage_data.objects.first;
111-
l_file_part := '<packages>'||CHR(10);
112-
ut_utils.append_to_clob(l_result, l_file_part);
111+
ut_utils.append_to_list(l_result, '<packages>');
113112

114113
while l_unit is not null loop
115114
l_obj_name := a_coverage_data.objects(l_unit).name;
116-
l_file_part := '<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'||CHR(10);
117-
ut_utils.append_to_clob(l_result, l_file_part);
115+
ut_utils.append_to_list(
116+
l_result,
117+
'<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
118+
);
118119

119-
l_file_part := '<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'||CHR(10);
120-
ut_utils.append_to_clob(l_result, l_file_part);
120+
ut_utils.append_to_list(
121+
l_result,
122+
'<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'
123+
||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
124+
);
121125

122-
l_file_part := '<lines>'||CHR(10);
123-
ut_utils.append_to_clob(l_result, l_file_part);
124-
125-
dbms_lob.append(l_result,get_lines_xml(a_coverage_data.objects(l_unit)));
126+
ut_utils.append_to_list(l_result, '<lines>');
127+
128+
ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
126129

127-
ut_utils.append_to_clob(l_result, c_lines_footer);
128-
ut_utils.append_to_clob(l_result, c_class_footer);
129-
ut_utils.append_to_clob(l_result, c_package_footer);
130+
ut_utils.append_to_list(l_result, c_lines_footer);
131+
ut_utils.append_to_list(l_result, c_class_footer);
132+
ut_utils.append_to_list(l_result, c_package_footer);
130133

131134
l_unit := a_coverage_data.objects.next(l_unit);
132135
end loop;
133136

134-
ut_utils.append_to_clob(l_result, c_packages_footer);
135-
ut_utils.append_to_clob(l_result, c_coverage_footer);
137+
ut_utils.append_to_list(l_result, c_packages_footer);
138+
ut_utils.append_to_list(l_result, c_coverage_footer);
136139
return l_result;
137140
end;
138141
begin
139142
ut_coverage.coverage_stop();
140143

141144
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
142145

143-
self.print_clob( get_coverage_xml( l_coverage_data, a_run ) );
146+
self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
144147

145148
(self as ut_reporter_base).after_calling_run(a_run);
146149
end;

source/reporters/ut_coverage_html_reporter.tpb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ create or replace type body ut_coverage_html_reporter is
2929
end;
3030

3131
overriding member procedure after_calling_run(self in out nocopy ut_coverage_html_reporter, a_run in ut_run) as
32-
l_report_lines ut_varchar2_list;
3332
l_coverage_data ut_coverage.t_coverage;
3433
begin
3534
ut_coverage.coverage_stop();
3635
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
3736

38-
self.print_clob(
37+
self.print_text_lines(
3938
ut_coverage_report_html_helper.get_index(
4039
a_coverage_data => l_coverage_data,
4140
a_assets_path => self.assets_path,

0 commit comments

Comments
 (0)