Delete folder getestet
This commit is contained in:
@@ -115,18 +115,35 @@ create or replace package body pck_net_storage as
|
|||||||
-- SCK 2026-04-08 Funktion erstellt
|
-- SCK 2026-04-08 Funktion erstellt
|
||||||
------------------------------------------------------------------------------------------------Kopf*/
|
------------------------------------------------------------------------------------------------Kopf*/
|
||||||
is
|
is
|
||||||
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
|
||||||
then
|
then
|
||||||
apex_web_service.g_request_headers(l_header_index).name := 'Content-Type';
|
apex_web_service.g_request_headers(l_header_index).name := 'Content-Type';
|
||||||
apex_web_service.g_request_headers(l_header_index).value := i_content_type;
|
apex_web_service.g_request_headers(l_header_index).value := i_content_type;
|
||||||
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;
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user