Skip to content

Commit 0c994a4

Browse files
committed
Merge branch 'develop' into feature/pure_sql
2 parents c2d52ae + abe6848 commit 0c994a4

30 files changed

+1117
-138
lines changed

examples/developer_examples/ut_custom_reporter.tpb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ create or replace type body ut_custom_reporter is
1616
return tab_str;
1717
end tab;
1818

19-
overriding member procedure print_text(a_text varchar2) is
19+
overriding member procedure print_text(a_text varchar2, a_item_type varchar2 := null) is
2020
begin
21-
(self as ut_documentation_reporter).print_text(tab || a_text);
21+
(self as ut_documentation_reporter).print_text(tab || a_text, a_item_type);
2222
end;
2323

2424
overriding member procedure before_calling_suite(self in out nocopy ut_custom_reporter, a_suite ut_logical_suite) as

examples/developer_examples/ut_custom_reporter.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ create or replace type ut_custom_reporter under ut_documentation_reporter
55
-- Member functions and procedures
66
constructor function ut_custom_reporter(a_tab_size integer default 4) return self as result,
77
overriding member function tab(self in ut_custom_reporter) return varchar2,
8-
overriding member procedure print_text(a_text varchar2),
8+
overriding member procedure print_text(a_text varchar2, a_item_type varchar2 := null),
99
overriding member procedure before_calling_suite(self in out nocopy ut_custom_reporter, a_suite ut_logical_suite),
1010
overriding member procedure before_calling_test(self in out nocopy ut_custom_reporter, a_test ut_test),
1111
overriding member procedure after_calling_test(self in out nocopy ut_custom_reporter, a_test ut_test),

source/api/ut.pkb

Lines changed: 47 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ create or replace package body ut is
2020
g_nls_date_format varchar2(4000);
2121
gc_fail_on_errors constant boolean := false;
2222

23+
g_result_line_no binary_integer;
24+
g_result_lines ut_varchar2_list := ut_varchar2_list();
25+
2326
function version return varchar2 is
2427
begin
2528
return ut_runner.version();
@@ -164,6 +167,31 @@ create or replace package body ut is
164167
rollback;
165168
end;
166169

170+
function get_report_outputs( a_cursor sys_refcursor ) return varchar2 is
171+
l_clob clob;
172+
l_item_type varchar2(32767);
173+
l_result varchar2(4000);
174+
begin
175+
if g_result_line_no is null then
176+
fetch a_cursor into l_clob, l_item_type;
177+
if a_cursor%notfound then
178+
close a_cursor;
179+
g_result_line_no := null;
180+
g_result_lines := ut_varchar2_list();
181+
raise_if_packages_invalidated();
182+
raise no_data_found;
183+
end if;
184+
g_result_lines := ut_utils.clob_to_table(l_clob, ut_utils.gc_max_storage_varchar2_len);
185+
g_result_line_no := g_result_lines.first;
186+
end if;
187+
188+
if g_result_line_no is not null then
189+
l_result := g_result_lines(g_result_line_no);
190+
g_result_line_no := g_result_lines.next(g_result_line_no);
191+
end if;
192+
return l_result;
193+
end;
194+
167195
function run(
168196
a_reporter ut_reporter_base := null,
169197
a_color_console integer := 0,
@@ -175,8 +203,7 @@ create or replace package body ut is
175203
a_client_character_set varchar2 := null
176204
) return ut_varchar2_rows pipelined is
177205
l_reporter ut_reporter_base := a_reporter;
178-
l_lines sys_refcursor;
179-
l_line varchar2(4000);
206+
l_results sys_refcursor;
180207
begin
181208
run_autonomous(
182209
ut_varchar2_list(),
@@ -190,15 +217,11 @@ create or replace package body ut is
190217
a_client_character_set
191218
);
192219
if l_reporter is of (ut_output_reporter_base) then
193-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
220+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
194221
loop
195-
fetch l_lines into l_line;
196-
exit when l_lines%notfound;
197-
pipe row(l_line);
222+
pipe row( get_report_outputs( l_results ) );
198223
end loop;
199-
close l_lines;
200224
end if;
201-
raise_if_packages_invalidated();
202225
return;
203226
end;
204227

@@ -213,8 +236,7 @@ create or replace package body ut is
213236
a_client_character_set varchar2 := null
214237
) return ut_varchar2_rows pipelined is
215238
l_reporter ut_reporter_base := a_reporter;
216-
l_lines sys_refcursor;
217-
l_line varchar2(4000);
239+
l_results sys_refcursor;
218240
begin
219241
run_autonomous(
220242
ut_varchar2_list(),
@@ -228,15 +250,11 @@ create or replace package body ut is
228250
a_client_character_set
229251
);
230252
if l_reporter is of (ut_output_reporter_base) then
231-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
253+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
232254
loop
233-
fetch l_lines into l_line;
234-
exit when l_lines%notfound;
235-
pipe row(l_line);
255+
pipe row( get_report_outputs( l_results ) );
236256
end loop;
237-
close l_lines;
238257
end if;
239-
raise_if_packages_invalidated();
240258
return;
241259
end;
242260

@@ -252,8 +270,7 @@ create or replace package body ut is
252270
a_client_character_set varchar2 := null
253271
) return ut_varchar2_rows pipelined is
254272
l_reporter ut_reporter_base := a_reporter;
255-
l_lines sys_refcursor;
256-
l_line varchar2(4000);
273+
l_results sys_refcursor;
257274
begin
258275
run_autonomous(
259276
a_paths,
@@ -267,15 +284,11 @@ create or replace package body ut is
267284
a_client_character_set
268285
);
269286
if l_reporter is of (ut_output_reporter_base) then
270-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
287+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
271288
loop
272-
fetch l_lines into l_line;
273-
exit when l_lines%notfound;
274-
pipe row(l_line);
289+
pipe row( get_report_outputs( l_results ) );
275290
end loop;
276-
close l_lines;
277291
end if;
278-
raise_if_packages_invalidated();
279292
return;
280293
end;
281294

@@ -291,8 +304,7 @@ create or replace package body ut is
291304
a_client_character_set varchar2 := null
292305
) return ut_varchar2_rows pipelined is
293306
l_reporter ut_reporter_base := a_reporter;
294-
l_lines sys_refcursor;
295-
l_line varchar2(4000);
307+
l_results sys_refcursor;
296308
begin
297309
run_autonomous(
298310
a_paths,
@@ -306,15 +318,11 @@ create or replace package body ut is
306318
a_client_character_set
307319
);
308320
if l_reporter is of (ut_output_reporter_base) then
309-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
321+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
310322
loop
311-
fetch l_lines into l_line;
312-
exit when l_lines%notfound;
313-
pipe row(l_line);
323+
pipe row( get_report_outputs( l_results ) );
314324
end loop;
315-
close l_lines;
316325
end if;
317-
raise_if_packages_invalidated();
318326
return;
319327
end;
320328

@@ -329,9 +337,8 @@ create or replace package body ut is
329337
a_exclude_objects ut_varchar2_list := null,
330338
a_client_character_set varchar2 := null
331339
) return ut_varchar2_rows pipelined is
332-
l_reporter ut_reporter_base := a_reporter;
333-
l_lines sys_refcursor;
334-
l_line varchar2(4000);
340+
l_reporter ut_reporter_base := a_reporter;
341+
l_results sys_refcursor;
335342
begin
336343
run_autonomous(
337344
ut_varchar2_list(a_path),
@@ -345,15 +352,11 @@ create or replace package body ut is
345352
a_client_character_set
346353
);
347354
if l_reporter is of (ut_output_reporter_base) then
348-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
355+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
349356
loop
350-
fetch l_lines into l_line;
351-
exit when l_lines%notfound;
352-
pipe row(l_line);
357+
pipe row( get_report_outputs( l_results ) );
353358
end loop;
354-
close l_lines;
355359
end if;
356-
raise_if_packages_invalidated();
357360
return;
358361
end;
359362

@@ -369,8 +372,7 @@ create or replace package body ut is
369372
a_client_character_set varchar2 := null
370373
) return ut_varchar2_rows pipelined is
371374
l_reporter ut_reporter_base := a_reporter;
372-
l_lines sys_refcursor;
373-
l_line varchar2(4000);
375+
l_results sys_refcursor;
374376
begin
375377
run_autonomous(
376378
ut_varchar2_list(a_path),
@@ -384,15 +386,11 @@ create or replace package body ut is
384386
a_client_character_set
385387
);
386388
if l_reporter is of (ut_output_reporter_base) then
387-
l_lines := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
389+
l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor();
388390
loop
389-
fetch l_lines into l_line;
390-
exit when l_lines%notfound;
391-
pipe row(l_line);
391+
pipe row( get_report_outputs( l_results ) );
392392
end loop;
393-
close l_lines;
394393
end if;
395-
raise_if_packages_invalidated();
396394
return;
397395
end;
398396

source/core/events/ut_event_manager.pkb

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,42 @@ create or replace package body ut_event_manager as
2121
type t_listener_numbers is table of boolean index by t_listener_number;
2222
type t_events_listeners is table of t_listener_numbers index by t_event_name;
2323

24-
g_event_listeners_index t_events_listeners;
25-
g_listeners t_listeners;
24+
type t_event_manager is record (
25+
event_listener_index t_events_listeners,
26+
listeners t_listeners
27+
);
28+
type t_event_managers is table of t_event_manager;
29+
30+
g_event_listeners_index t_events_listeners;
31+
g_listeners t_listeners;
32+
g_suspended_event_managers t_event_managers;
2633

2734
procedure initialize is
2835
begin
36+
if g_listeners is not null and g_listeners.count > 0 then
37+
if g_suspended_event_managers is null then
38+
g_suspended_event_managers := t_event_managers();
39+
end if;
40+
g_suspended_event_managers.extend;
41+
g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index := g_event_listeners_index;
42+
g_suspended_event_managers(g_suspended_event_managers.count).listeners := g_listeners;
43+
end if;
2944
g_event_listeners_index.delete;
3045
g_listeners := t_listeners();
3146
end;
3247

48+
procedure dispose_listeners is
49+
begin
50+
if g_suspended_event_managers is not null and g_suspended_event_managers.count > 0 then
51+
g_event_listeners_index := g_suspended_event_managers(g_suspended_event_managers.count).event_listener_index;
52+
g_listeners := g_suspended_event_managers(g_suspended_event_managers.count).listeners;
53+
g_suspended_event_managers.trim(1);
54+
else
55+
g_event_listeners_index.delete;
56+
g_listeners := t_listeners();
57+
end if;
58+
end;
59+
3360
procedure trigger_event( a_event_name t_event_name, a_event_object ut_event_item ) is
3461
begin
3562
if a_event_name is not null and g_event_listeners_index.exists(a_event_name)
@@ -39,6 +66,9 @@ create or replace package body ut_event_manager as
3966
for listener_number in 1 .. g_event_listeners_index(a_event_name).count loop
4067
g_listeners(listener_number).on_event(a_event_name, a_event_object);
4168
end loop;
69+
if a_event_name = ut_utils.gc_finalize then
70+
dispose_listeners;
71+
end if;
4272
end if;
4373
end;
4474

source/core/output_buffers/ut_output_buffer_base.tps

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ create or replace type ut_output_buffer_base authid definer as object(
1919
output_id raw(32),
2020
member procedure init(self in out nocopy ut_output_buffer_base),
2121
not instantiable member procedure close(self in ut_output_buffer_base),
22-
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),
24-
not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_varchar2_rows pipelined,
22+
not instantiable member procedure send_line(self in ut_output_buffer_base, a_text varchar2, a_item_type varchar2 := null),
23+
not instantiable member procedure send_lines(self in ut_output_buffer_base, a_text_list ut_varchar2_rows, a_item_type varchar2 := null),
24+
not instantiable member procedure send_clob(self in ut_output_buffer_base, a_text clob, a_item_type varchar2 := null),
25+
not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined,
2526
not instantiable member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor,
2627
not instantiable member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null)
2728
) not final not instantiable

source/core/output_buffers/ut_output_buffer_tmp.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ create table ut_output_buffer_tmp$(
1919
*/
2020
output_id raw(32) not null,
2121
message_id number(38,0) not null,
22-
text varchar2(4000),
22+
text clob,
23+
item_type varchar2(1000),
2324
is_finished number(1,0) default 0 not null,
2425
constraint ut_output_buffer_tmp_pk primary key(output_id, message_id),
2526
constraint ut_output_buffer_tmp_ck check(is_finished = 0 and text is not null or is_finished = 1 and text is null),
2627
constraint ut_output_buffer_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id)
2728
) organization index overflow nologging initrans 100
29+
lob(text) store as securefile ut_output_text(retention none)
2830
;
2931

3032
-- This is needed to be EBR ready as editioning view can only be created by edition enabled user
@@ -58,6 +60,7 @@ limitations under the License.
5860
select output_id
5961
,message_id
6062
,text
63+
,item_type
6164
,is_finished
6265
from ut_output_buffer_tmp$';
6366

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
create or replace type ut_output_data_row as object (
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2018 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
text clob,
19+
item_type varchar2(1000)
20+
)
21+
/
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
create or replace type ut_output_data_rows as
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2018 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
table of ut_output_data_row
19+
/

0 commit comments

Comments
 (0)