Delete folder getestet

This commit is contained in:
2026-04-10 16:25:09 +02:00
parent 87d241db7f
commit e5d1acbdca
2 changed files with 64 additions and 32 deletions

View File

@@ -118,6 +118,7 @@ create or replace package body pck_net_storage as
l_response clob;
l_status number;
l_header_index number := 1;
l_content_length number;
begin
if i_content_type is not null
@@ -127,6 +128,22 @@ create or replace package body pck_net_storage as
l_header_index := l_header_index + 1;
end if;
-- Content-Length immer mitsenden (OCI-Signing erfordert es bei PUT/POST,
-- 0 bei bodylosem Request ist valide)
if i_body_blob is not null and dbms_lob.getlength(i_body_blob) > 0
then
l_content_length := dbms_lob.getlength(i_body_blob);
elsif i_body_clob is not null and dbms_lob.getlength(i_body_clob) > 0
then
l_content_length := dbms_lob.getlength(i_body_clob);
else
l_content_length := 0;
end if;
apex_web_service.g_request_headers(l_header_index).name := 'Content-Length';
apex_web_service.g_request_headers(l_header_index).value := l_content_length;
l_header_index := l_header_index + 1;
apex_debug.info('url: ' || i_url);
l_response := apex_web_service.make_rest_request(
@@ -158,7 +175,7 @@ create or replace package body pck_net_storage as
return l_response;
end f_make_request;
-- Interne Implementierung ohne Rechteprüfung — wird von f_list_objects und p_delete_folder genutzt
-- Interne Implementierung ohne Rechteprüfung — wird von f_list_objects und p_delete_folder (Leerprüfung) genutzt
function f_list_objects_internal (
i_parent_folder in varchar2
,i_include_subfolders in varchar2
@@ -168,7 +185,7 @@ create or replace package body pck_net_storage as
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Listet Objekte und Unterordner im Bucket ohne Rechte- oder Scope-Prüfung.
-- Paginiert automatisch über nextStartWith bis alle Ergebnisse geladen sind.
-- Wird von f_list_objects (öffentlich) und p_delete_folder intern genutzt.
-- Wird von f_list_objects (öffentlich) und p_delete_folder (Leerprüfung) intern genutzt.
------------------------------------------------------------------------------------------------------
-- Parameter: i_parent_folder Ordnerpfad im Bucket (z.B. eingang/)
-- i_include_subfolders 'Y' = alle Dateien rekursiv, 'N' = nur direkte Kinder des Ordners
@@ -538,50 +555,65 @@ create or replace package body pck_net_storage as
);
end p_delete_object;
procedure p_delete_folder (i_parent_folder in varchar2)
procedure p_delete_folder (i_folder_key in varchar2)
/*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Löscht rekursiv alle Objekte unterhalb eines Präfixes im OCI Bucket.
-- Pseudo-Ordner (is_folder = Y) werden übersprungen.
-- Beschreibung: Löscht einen leeren Ordner im OCI Bucket.
-- Schlägt fehl, wenn noch Objekte oder Unterordner vorhanden sind.
------------------------------------------------------------------------------------------------------
-- Parameter: i_parent_folder Ordnerpräfix (z.B. eingang/batch-001/)
-- Parameter: i_folder_key Kompletter Ordner name inkl. Pfad (z.B. eingang/batch-001/)
------------------------------------------------------------------------------------------------------
-- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt
-- SCK 2026-04-10 Rekursives Löschen entfernt — Ordner muss leer sein
------------------------------------------------------------------------------------------------Kopf*/
is
l_objects t_net_storage_tab;
l_response clob;
l_obj_path t_object_path;
l_prefix varchar2(1024) := f_normalize_prefix(i_parent_folder);
l_prefix varchar2(1024) := f_normalize_prefix(i_folder_key);
l_count number;
begin
pck_mitarbeiterrecht.p_hat_recht('ADMIN');
p_assert_allowed(l_prefix);
-- Alle Objekte im Ordner auflisten (rekursiv, alle Tiefen)
--l_objects := f_list_objects_internal(
-- i_parent_folder => l_prefix
-- ,i_include_subfolders => 'Y'
-- ,i_start_with => null
-- ,i_limit => 0
--);
-- Direkte Kinder prüfen (Dateien und Unterordner)
l_objects := f_list_objects_internal(
i_parent_folder => l_prefix
,i_include_subfolders => 'N'
,i_start_with => null
,i_limit => 0
);
-- Nur echte Objekte löschen, keine Pseudo-Ordner
--for rec in (select object_name, is_folder from table(l_objects))
--loop
-- if rec.is_folder = 'N'
-- then
-- l_response := f_make_request(
-- i_method => 'DELETE'
-- ,i_url => f_build_url(rec.object_name)
-- );
-- end if;
--end loop;
/*
apex_debug.info('p_delete_folder: prefix=%s, Anzahl gefundene Einträge=%s', l_prefix, l_objects.count);
for i in 1 .. l_objects.count
loop
apex_debug.info(' [%s] key=%s | is_folder=%s', i, l_objects(i).object_key, l_objects(i).is_folder);
end loop;
*/
-- Den Ordner selbst (object_key = l_prefix) aus der Zählung ausschließen
select count(*)
into l_count
from table(l_objects)
where object_key != l_prefix;
if l_count > 0
then
raise_application_error(-20017, 'Ordner ist nicht leer und kann nicht gelöscht werden');
end if;
-- Ordner-Objekt selbst löschen
l_response := f_make_request(
i_method => 'DELETE'
,i_url => f_build_url(l_prefix)
);
l_obj_path := f_split_object_key(l_prefix);
pck_log.p_info(
i_module => c_log_module
,i_action => 'DELETE_FOLDER'
,i_message => 'Ordner "' || l_obj_path.filename || '" rekursiv gelöscht | Pfad: ' || l_obj_path.path
,i_message => 'Ordner "' || l_obj_path.filename || '" gelöscht | Pfad: ' || l_obj_path.path
,i_object_ref => l_prefix
);
end p_delete_folder;

View File

@@ -41,7 +41,7 @@ create or replace package pck_net_storage as
);
procedure p_delete_folder (
i_parent_folder in varchar2
i_folder_key in varchar2
);
procedure p_rename_object (