@@ -15,11 +15,14 @@ create or replace package body ut_suite_manager is
1515 See the License for the specific language governing permissions and
1616 limitations under the License.
1717 */
18+
19+ type t_schema_info is record (changed_at date, obj_cnt integer);
1820
1921 type tt_schema_suites is table of ut_logical_suite index by varchar2(4000 char);
2022 type t_schema_cache is record(
2123 schema_suites tt_schema_suites
22- ,changed_at date);
24+ ,changed_at date
25+ ,obj_cnt integer);
2326 type tt_schema_suites_list is table of t_schema_cache index by varchar2(128 char);
2427
2528 g_schema_suites tt_schema_suites_list;
@@ -29,15 +32,15 @@ create or replace package body ut_suite_manager is
2932 return substr(a_path, nvl(length(a_part), 0) + 1);
3033 end;
3134
32- function get_schema_max_ddl (a_owner_name varchar2) return date is
33- l_date date ;
35+ function get_schema_info (a_owner_name varchar2) return t_schema_info is
36+ l_info t_schema_info ;
3437 begin
35- select nvl(max(t.last_ddl_time), date '4999-12-31')
36- into l_date
38+ select nvl(max(t.last_ddl_time), date '4999-12-31'), count(*)
39+ into l_info
3740 from all_objects t
3841 where t.owner = a_owner_name
3942 and t.object_type in ('PACKAGE');
40- return l_date ;
43+ return l_info ;
4144 end;
4245
4346 function config_package(a_owner_name varchar2, a_object_name varchar2) return ut_logical_suite is
@@ -185,11 +188,12 @@ create or replace package body ut_suite_manager is
185188
186189 end config_package;
187190
188- procedure update_cache(a_owner_name varchar2, a_schema_suites tt_schema_suites) is
191+ procedure update_cache(a_owner_name varchar2, a_schema_suites tt_schema_suites, a_total_obj_cnt integer ) is
189192 begin
190193 if a_schema_suites.count > 0 then
191194 g_schema_suites(a_owner_name).schema_suites := a_schema_suites;
192195 g_schema_suites(a_owner_name).changed_at := sysdate;
196+ g_schema_suites(a_owner_name).obj_cnt := a_total_obj_cnt;
193197 elsif g_schema_suites.exists(a_owner_name) then
194198 g_schema_suites.delete(a_owner_name);
195199 end if;
@@ -307,7 +311,7 @@ create or replace package body ut_suite_manager is
307311 end loop;
308312
309313 -- Caching
310- update_cache(a_owner_name, l_schema_suites);
314+ update_cache(a_owner_name, l_schema_suites, get_schema_info(a_owner_name).obj_cnt );
311315
312316 -- printing results for debugging purpose
313317 $if $$ut_trace $then
@@ -321,10 +325,13 @@ create or replace package body ut_suite_manager is
321325 end config_schema;
322326
323327 function get_schema_suites(a_schema_name in varchar2) return tt_schema_suites is
328+ l_schema_info t_schema_info;
324329 begin
325330 -- Currently cache invalidation on DDL is not implemented so schema is rescaned each time
331+ l_schema_info := get_schema_info(a_schema_name);
326332 if not g_schema_suites.exists(a_schema_name) or g_schema_suites(a_schema_name)
327- .changed_at <= get_schema_max_ddl(a_schema_name) then
333+ .changed_at <= l_schema_info.changed_at
334+ or g_schema_suites(a_schema_name).obj_cnt != l_schema_info.obj_cnt then
328335 ut_utils.debug_log('Rescanning schema ' || a_schema_name);
329336 config_schema(a_schema_name);
330337 end if;
0 commit comments