@@ -64,100 +64,51 @@ create or replace type body ut_output_buffer_base is
6464 commit;
6565 end;
6666
67- member function get_lines(a_initial_timeout number := null, a_timeout_sec number := null) return ut_output_data_rows pipelined is
68- lc_init_wait_sec constant number := coalesce(a_initial_timeout, 10 );
69- lc_100_milisec constant number(1,1) := 0.1; --sleep for 100 ms between checks
70- lc_500_milisec constant number(3,1) := 0.5; --sleep for 1 s when waiting long
71- lc_1_second constant number(3,1) := 1;
72- l_buffer_rowids ut_varchar2_rows;
73- l_buffer_data ut_output_data_rows;
74- l_finished_flags ut_integer_list;
75- l_last_read_message_id integer;
76- l_already_waited_sec number(10,2) := 0;
77- l_data_finished boolean := false;
78- l_finished boolean := false;
79- l_sleep_time number(2,1) := lc_100_milisec;
80- l_lock_status integer;
81- l_producer_started boolean := false;
82- l_producer_finished boolean := false;
83- function get_lock_status return integer is
84- l_result integer;
85- l_release_status integer;
86- begin
87- l_result := dbms_lock.request( self.lock_handle, dbms_lock.s_mode, 0, false );
88- if l_result = 0 then
89- l_release_status := dbms_lock.release( self.lock_handle );
90- end if;
91- return l_result;
92- end;
67+ member function timeout_producer_not_started( a_producer_started boolean, a_already_waited_sec number, a_init_wait_sec number ) return boolean
68+ is
69+ l_result boolean := false;
9370 begin
94- while not l_finished loop
95-
96- --check if the lock is still there on output - if yes, the main session is still running and so don't stop
97- l_lock_status := get_lock_status();
98- get_data_from_buffer_table( l_last_read_message_id, l_buffer_data, l_buffer_rowids, l_finished_flags );
99-
100- --nothing fetched from output, wait and try again
101- if l_buffer_data.count = 0 then
102-
103- dbms_lock.sleep(l_sleep_time);
104- l_already_waited_sec := l_already_waited_sec + l_sleep_time;
105-
106- -- if waited more than lc_1_second seconds then increase wait period to minimize the CPU usage.
107- if l_already_waited_sec >= lc_1_second then
108- l_sleep_time := lc_500_milisec;
109- end if;
110-
71+ if not a_producer_started and a_already_waited_sec >= a_init_wait_sec then
72+ if a_init_wait_sec > 0 then
73+ self.remove_buffer_info();
74+ raise_application_error(
75+ ut_utils.gc_out_buffer_timeout,
76+ 'Timeout occurred while waiting for report data producer to start. Waited for: '||ut_utils.to_string( a_already_waited_sec )||' seconds.'
77+ );
11178 else
112-
113- l_already_waited_sec := 0;
114- l_sleep_time := lc_100_milisec;
115-
116- for i in 1 .. l_buffer_data.count loop
117- if l_buffer_data(i).text is not null then
118- pipe row( l_buffer_data(i) );
119- elsif l_finished_flags(i) = 1 then
120- l_data_finished := true;
121- exit;
122- end if;
123- end loop;
124-
125- remove_read_data(l_buffer_rowids);
126-
79+ l_result := true;
12780 end if;
128- l_producer_started := (l_lock_status <> 0 or l_buffer_data.count > 0) or l_producer_started;
129- l_producer_finished := (l_producer_started and l_lock_status = 0 and l_buffer_data.count = 0) or l_producer_finished;
130-
131- if not l_producer_started and l_already_waited_sec >= lc_init_wait_sec then
132-
133- if lc_init_wait_sec > 0 then
134- self.remove_buffer_info();
135- raise_application_error(
136- ut_utils.gc_out_buffer_timeout,
137- 'Timeout occurred while waiting for report data producer to start. Waited for: '||ut_utils.to_string( l_already_waited_sec )||' seconds.'
138- );
139- else
140- l_finished := true;
141- end if;
142-
143- elsif not l_producer_finished and a_timeout_sec is not null and l_already_waited_sec >= a_timeout_sec then
144-
145- if a_timeout_sec > 0 then
146- self.remove_buffer_info();
147- raise_application_error(
148- ut_utils.gc_out_buffer_timeout,
149- 'Timeout occurred while waiting for more data from producer. Waited for: '||ut_utils.to_string( l_already_waited_sec )||' seconds.'
150- );
151- else
152- l_finished := true;
153- end if;
81+ end if;
82+ return l_result;
83+ end;
15484
155- elsif (l_data_finished or l_producer_finished) then
156- l_finished := true;
85+ member function timeout_producer_not_finished(a_producer_finished boolean, a_already_waited_sec number, a_timeout_sec number) return boolean
86+ is
87+ l_result boolean := false;
88+ begin
89+ if not a_producer_finished and a_timeout_sec is not null and a_already_waited_sec >= a_timeout_sec then
90+ if a_timeout_sec > 0 then
91+ self.remove_buffer_info();
92+ raise_application_error(
93+ ut_utils.gc_out_buffer_timeout,
94+ 'Timeout occurred while waiting for more data from producer. Waited for: '||ut_utils.to_string( a_already_waited_sec )||' seconds.'
95+ );
96+ else
97+ l_result := true;
15798 end if;
158- end loop;
159- self.remove_buffer_info();
160- return;
99+ end if;
100+ return l_result;
101+ end;
102+
103+ member function get_lock_status return integer is
104+ l_result integer;
105+ l_release_status integer;
106+ begin
107+ l_result := dbms_lock.request( self.lock_handle, dbms_lock.s_mode, 0, false );
108+ if l_result = 0 then
109+ l_release_status := dbms_lock.release( self.lock_handle );
110+ end if;
111+ return l_result;
161112 end;
162113
163114 member function get_lines_cursor(a_initial_timeout number := null, a_timeout_sec number := null) return sys_refcursor is
0 commit comments