11create or replace package body ut_suite_manager is
22
33 type tt_schema_suits is table of ut_test_suite index by varchar2(4000 char);
4- type tt_schena_suits_list is table of tt_schema_suits index by varchar2(32 char);
4+ type t_schema_cache is record (schema_suites tt_schema_suits, changed_at date);
5+ type tt_schena_suits_list is table of t_schema_cache index by varchar2(32 char);
56
67 g_schema_suites tt_schena_suits_list;
78
89 function trim_path(a_path varchar2, a_part varchar2) return varchar2 is
910 begin
1011 return substr(a_path, nvl(length(a_part), 0) + 1);
1112 end;
13+
14+ function get_schema_max_ddl(a_owner_name varchar2) return date is
15+ l_date date;
16+ begin
17+ select max(t.LAST_DDL_TIME)
18+ into l_date
19+ from all_objects t
20+ where t.owner = a_owner_name
21+ and t.object_type in ('PACKAGE');
22+ return l_date;
23+ end;
1224
1325 function config_package(a_owner_name varchar2, a_object_name varchar2) return ut_test_suite is
1426 l_annotation_data ut_annotations.typ_annotated_package;
@@ -169,6 +181,8 @@ create or replace package body ut_suite_manager is
169181 l_root_suite ut_test_suite;
170182
171183 l_schema_suites tt_schema_suits;
184+
185+ l_max_ddl_date date;
172186
173187 procedure put(a_root_suite in out nocopy ut_test_suite, a_path varchar2, a_suite ut_test_suite, a_parent_path varchar2 default null) is
174188 l_temp_root varchar2(4000 char);
@@ -234,6 +248,7 @@ create or replace package body ut_suite_manager is
234248 $end
235249
236250 begin
251+ l_max_ddl_date := get_schema_max_ddl(a_owner_name);
237252 -- form the single-dimension list of suites constructed from parsed packages
238253 for rec in (select t.owner
239254 ,t.object_name
@@ -274,7 +289,8 @@ create or replace package body ut_suite_manager is
274289
275290 -- Each nonempty root-suite list for the schema is saved into the cache
276291 if l_schema_suites.count > 0 then
277- g_schema_suites(a_owner_name) := l_schema_suites;
292+ g_schema_suites(a_owner_name).schema_suites := l_schema_suites;
293+ g_schema_suites(a_owner_name).changed_at := l_max_ddl_date;
278294 elsif g_schema_suites.exists(a_owner_name) then
279295 g_schema_suites.delete(a_owner_name);
280296 end if;
@@ -290,62 +306,16 @@ create or replace package body ut_suite_manager is
290306
291307 end config_schema;
292308
293- procedure run_schema_suites(a_owner_name varchar2, a_reporter in out nocopy ut_reporter, a_force_parse_again boolean default false) is
294- l_ind varchar2(4000 char);
295- l_suite ut_test_suite;
296- l_suite_list ut_objects_list := ut_objects_list();
297- begin
298- --TODO - we do not have a way to pass list of suites here
299- a_reporter.before_run(ut_objects_list());
300- if not g_schema_suites.exists(a_owner_name) or g_schema_suites(a_owner_name).count = 0 or
301- nvl(a_force_parse_again, false) then
302- config_schema(a_owner_name);
303- end if;
304-
305- if g_schema_suites.exists(a_owner_name) then
306- l_ind := g_schema_suites(a_owner_name).first;
307- while l_ind is not null loop
308- l_suite := g_schema_suites(a_owner_name) (l_ind);
309- l_suite.do_execute(a_reporter => a_reporter);
310- l_suite_list.extend; l_suite_list(l_suite_list.last) := l_suite;
311- l_ind := g_schema_suites(a_owner_name).next(l_ind);
312- end loop;
313- else
314- -- we have to figure out what to do here
315- null;
316- end if;
317- --TODO - we do not have a way to pass list of suites here
318- a_reporter.after_run(l_suite_list);
319- end run_schema_suites;
320-
321- procedure run_schema_suites_static(a_owner_name varchar2, a_reporter in ut_reporter, a_force_parse_again boolean default false) is
322- l_temp_reported ut_reporter;
323- begin
324- l_temp_reported := a_reporter;
325- run_schema_suites(a_owner_name, l_temp_reported, a_force_parse_again);
326- end run_schema_suites_static;
327-
328- procedure run_cur_schema_suites(a_reporter in out nocopy ut_reporter, a_force_parse_again boolean default false) is
329- begin
330- run_schema_suites(sys_context('userenv', 'current_schema'), a_reporter, a_force_parse_again);
331- end run_cur_schema_suites;
332-
333- procedure run_cur_schema_suites_static(a_reporter in ut_reporter, a_force_parse_again boolean default false) is
334- l_temp_reported ut_reporter;
335- begin
336- l_temp_reported := a_reporter;
337- run_schema_suites(sys_context('userenv', 'current_schema'), l_temp_reported, a_force_parse_again);
338- end run_cur_schema_suites_static;
339-
340309 function get_schema_suites(a_schema_name in varchar2) return tt_schema_suits is
341310 begin
342311 -- Currently cache invalidation on DDL is not implemented so schema is rescaned each time
343- --if not g_schema_suites.exists(a_schema_name) then
344- -- config_schema(a_schema_name);
345- --end if;
346- config_schema(a_schema_name);
312+ if not g_schema_suites.exists(a_schema_name)
313+ or g_schema_suites(a_schema_name).changed_at<nvl(get_schema_max_ddl(a_schema_name), date'2999-12-31') then
314+ ut_utils.debug_log('Rescanning schema ' || a_schema_name);
315+ config_schema(a_schema_name);
316+ end if;
347317
348- return g_schema_suites(a_schema_name);
318+ return g_schema_suites(a_schema_name).schema_suites ;
349319 end get_schema_suites;
350320
351321 -- Validate all paths are correctly formatted
0 commit comments