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_response clob;
l_status number; l_status number;
l_header_index number := 1; l_header_index number := 1;
l_content_length number;
begin begin
if i_content_type is not null 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; l_header_index := l_header_index + 1;
end if; 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); apex_debug.info('url: ' || i_url);
l_response := apex_web_service.make_rest_request( l_response := apex_web_service.make_rest_request(
@@ -158,7 +175,7 @@ create or replace package body pck_net_storage as
return l_response; return l_response;
end f_make_request; 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 ( function f_list_objects_internal (
i_parent_folder in varchar2 i_parent_folder in varchar2
,i_include_subfolders in varchar2 ,i_include_subfolders in varchar2
@@ -168,7 +185,7 @@ create or replace package body pck_net_storage as
/*Kopf------------------------------------------------------------------------------------------------ /*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Listet Objekte und Unterordner im Bucket ohne Rechte- oder Scope-Prüfung. -- Beschreibung: Listet Objekte und Unterordner im Bucket ohne Rechte- oder Scope-Prüfung.
-- Paginiert automatisch über nextStartWith bis alle Ergebnisse geladen sind. -- 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/) -- Parameter: i_parent_folder Ordnerpfad im Bucket (z.B. eingang/)
-- i_include_subfolders 'Y' = alle Dateien rekursiv, 'N' = nur direkte Kinder des Ordners -- 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; end p_delete_object;
procedure p_delete_folder (i_parent_folder in varchar2) procedure p_delete_folder (i_folder_key in varchar2)
/*Kopf------------------------------------------------------------------------------------------------ /*Kopf------------------------------------------------------------------------------------------------
-- Beschreibung: Löscht rekursiv alle Objekte unterhalb eines Präfixes im OCI Bucket. -- Beschreibung: Löscht einen leeren Ordner im OCI Bucket.
-- Pseudo-Ordner (is_folder = Y) werden übersprungen. -- 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 -- MA Datum Änderung
-- SCK 2026-04-08 Prozedur erstellt -- SCK 2026-04-08 Prozedur erstellt
-- SCK 2026-04-10 Rekursives Löschen entfernt — Ordner muss leer sein
------------------------------------------------------------------------------------------------Kopf*/ ------------------------------------------------------------------------------------------------Kopf*/
is is
l_objects t_net_storage_tab; l_objects t_net_storage_tab;
l_response clob; l_response clob;
l_obj_path t_object_path; 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 begin
pck_mitarbeiterrecht.p_hat_recht('ADMIN'); pck_mitarbeiterrecht.p_hat_recht('ADMIN');
p_assert_allowed(l_prefix); p_assert_allowed(l_prefix);
-- Alle Objekte im Ordner auflisten (rekursiv, alle Tiefen) -- Direkte Kinder prüfen (Dateien und Unterordner)
--l_objects := f_list_objects_internal( l_objects := f_list_objects_internal(
-- i_parent_folder => l_prefix i_parent_folder => l_prefix
-- ,i_include_subfolders => 'Y' ,i_include_subfolders => 'N'
-- ,i_start_with => null ,i_start_with => null
-- ,i_limit => 0 ,i_limit => 0
--); );
-- Nur echte Objekte löschen, keine Pseudo-Ordner /*
--for rec in (select object_name, is_folder from table(l_objects)) apex_debug.info('p_delete_folder: prefix=%s, Anzahl gefundene Einträge=%s', l_prefix, l_objects.count);
--loop for i in 1 .. l_objects.count
-- if rec.is_folder = 'N' loop
-- then apex_debug.info(' [%s] key=%s | is_folder=%s', i, l_objects(i).object_key, l_objects(i).is_folder);
-- l_response := f_make_request( end loop;
-- i_method => 'DELETE' */
-- ,i_url => f_build_url(rec.object_name)
-- ); -- Den Ordner selbst (object_key = l_prefix) aus der Zählung ausschließen
-- end if; select count(*)
--end loop; 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); l_obj_path := f_split_object_key(l_prefix);
pck_log.p_info( pck_log.p_info(
i_module => c_log_module i_module => c_log_module
,i_action => 'DELETE_FOLDER' ,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 ,i_object_ref => l_prefix
); );
end p_delete_folder; end p_delete_folder;

View File

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