1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
FUNCTION decompression_fichier (nom_fichier_src_ IN VARCHAR2,
nom_fichier_cible_ IN VARCHAR2,
chemin_ IN VARCHAR2)
RETURN BOOLEAN IS
pointeur_fic_src_ BFILE := NULL;
contenu_compresse_ BLOB;
contenu_decompresse_ BLOB;
pos_depart_src_ INTEGER := 1;
pos_depart_dst_ INTEGER := 1;
taille_blob_ INTEGER;
fic_cible_ UTL_FILE.file_type;
contenu_lu_ RAW (32767);
debut_lecture_ NUMBER := 1;
taille_a_lire_ BINARY_INTEGER := 32767;
----
BEGIN
BEGIN
DBMS_LOB.createtemporary (contenu_compresse_, TRUE);
-- Initialise le pointeur correspondant au fichier source compressé
pointeur_fic_src_ := BFILENAME (chemin_, nom_fichier_src_);
IF DBMS_LOB.fileexists (pointeur_fic_src_) = 1
THEN
DBMS_LOB.fileopen (pointeur_fic_src_, DBMS_LOB.file_readonly);
-- Copie de tout le fichier compressé dans un BLOB
DBMS_LOB.loadblobfromfile (contenu_compresse_,
pointeur_fic_src_,
DBMS_LOB.lobmaxsize,
pos_depart_src_,
pos_depart_dst_);
-- Le BLOB ayant le contenu compressé est décompressé dans un BLOB
contenu_decompresse_ := utl_compress.lz_uncompress (contenu_compresse_);
fic_cible_ :=
UTL_FILE.fopen (chemin_,
nom_fichier_cible_,
'wb',
32767);
taille_blob_ := DBMS_LOB.getlength (contenu_decompresse_);
-- Si la taille de la décompression passe en une seule écriture
IF taille_blob_ < 32767
THEN
UTL_FILE.put_raw (fic_cible_, contenu_decompresse_, TRUE);
-- UTL_FILE.fflush (fic_cible_);
ELSE
-- Parcours morceau par morceau de la décompression
-- la taille de chaque morceau correspond à la taille maxi d'un RAW
WHILE debut_lecture_ < taille_blob_
LOOP
--
IF debut_lecture_ + taille_a_lire_ > taille_blob_
THEN
taille_a_lire_ := (taille_blob_ + 1) - debut_lecture_;
END IF;
DBMS_LOB.read (contenu_decompresse_,
taille_a_lire_,
debut_lecture_,
contenu_lu_);
UTL_FILE.put_raw (fic_cible_, contenu_lu_, TRUE);
debut_lecture_ := debut_lecture_ + taille_a_lire_;
--
END LOOP;
END IF;
UTL_FILE.fclose (fic_cible_);
DBMS_LOB.FILECLOSE (pointeur_fic_src_);
END IF;
DBMS_LOB.FREETEMPORARY (contenu_compresse_);
RETURN TRUE;
EXCEPTION
WHEN OTHERS
THEN
IF UTL_FILE.is_open (fic_cible_)
THEN
UTL_FILE.fclose (fic_cible_);
END IF;
--
IF (DBMS_LOB.fileisopen (pointeur_fic_src_) = 1)
THEN
DBMS_LOB.fileclose (pointeur_fic_src_);
END IF;
-- ...
RETURN FALSE;
END;
END decompression_fichier; |
Partager