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

Skip to content

Commit b918c09

Browse files
authored
Merge pull request #274 from Pazus/cache-ivalidation-on-drop
fix cache invalidation on drop
2 parents d1bbd9f + a6ff7ec commit b918c09

3 files changed

Lines changed: 64 additions & 9 deletions

File tree

source/core/ut_suite_manager.pkb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

tests/RunAll.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ exec ut_coverage.coverage_start_develop();
136136
@@lib/RunTest.sql ut_suite_manager/ut_suite_manager.configure_execution_by_path.PrepareRunnerForTheTop2PackageProcedureByPath.sql
137137
@@lib/RunTest.sql ut_suite_manager/ut_suite_manager.configure_execution_by_path.PrepareRunnerForTheTop2PackageProcedureByPathCurUser.sql
138138
@@lib/RunTest.sql ut_suite_manager/ut_suite_manager.DoesntFindTheSuiteWhenPackageSpecIsInvalid.sql
139+
@@lib/RunTest.sql ut_suite_manager/ut_suite_manager.CacheInvalidaesOnPackageDrop.sql
140+
139141

140142
@@lib/RunTest.sql ut_test/ut_test.DisabledFlagSkipTest.sql
141143
@@lib/RunTest.sql ut_test/ut_test.OwnerNameInvalid.sql
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
set termout off
2+
create or replace package tst_package_to_be_dropped as
3+
--%suite
4+
5+
--%test
6+
procedure test1;
7+
end;
8+
/
9+
create or replace package body tst_package_to_be_dropped as
10+
procedure test1 is begin ut.expect(1).to_equal(1); end;
11+
procedure test2 is begin ut.expect(1).to_equal(1); end;
12+
end;
13+
/
14+
set termout on
15+
16+
declare
17+
l_objects_to_run ut_suite_items;
18+
test_result number;
19+
begin
20+
ut.run(USER||'.tst_package_to_be_dropped');
21+
end;
22+
/
23+
24+
drop package tst_package_to_be_dropped
25+
/
26+
begin
27+
28+
begin
29+
ut.run(user || '.tst_package_to_be_dropped');
30+
exception
31+
when others then
32+
if sqlerrm like '%tst_package_to_be_dropped%does not exist%' then
33+
:test_result := ut_utils.tr_success;
34+
end if;
35+
end;
36+
37+
if :test_result != ut_utils.tr_success or :test_result is null then
38+
dbms_output.put_line('Failed: Expected exception with text like ''%tst_package_to_be_dropped%does not exist%'' but got:''' ||
39+
sqlerrm || '''');
40+
end if;
41+
end;
42+
/
43+
set termout off
44+
drop package tst_package_to_be_dropped
45+
/
46+
set termout on

0 commit comments

Comments
 (0)