/***
 XT_UTL_FILE v.0.9 2006/8/18 FileOutputStream
 ***/
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED XT_UTL_FILE_PEER
AS
package jp.rivus.io;
import java.io.FileOutputStream;
import java.io.InputStream;
import oracle.sql.BLOB;
class UtilFileSurrogate {
	public final static int DEBUG_LEVEL = 1;
	public final static int SUCCESS = 0;
	public final static int FAIL = 1;
	public final static int MULTI_WRITE_COUNT = 8;
	/**
	 * writeBlob to file.
	 * @return SUCCESS(0) if the LOB is written. / FAIL(1) errors
	 */
	public static int writeBlob(String pFilename, BLOB pBlob)
	throws Exception
	{
		int len = -1;
		int ret = FAIL; // (default)
		FileOutputStream fos = null;
		try{
			int chunk = MULTI_WRITE_COUNT * pBlob.getChunkSize();
			InputStream bis = pBlob.getBinaryStream();
			fos = new FileOutputStream(pFilename);
			byte[] buffer = new byte[chunk];
			while((len = bis.read(buffer))!=-1){
				fos.write(buffer);
			}
			ret = SUCCESS;
		}
		catch (Exception e) {
			// hadleException(e);
			if (DEBUG_LEVEL > 0) e.printStackTrace();
		}
		finally {
			try {
				if(fos != null) fos.close();
			}
			catch (Exception e) {
				// nop
			}
		}
		return ret;
	}
}
/
CREATE OR REPLACE PACKAGE RIVUS.XT_UTL_FILE
IS
	--
	-- PUT_BLOB
	FUNCTION PUT_BLOB(P_FILE IN VARCHAR2,
	                  P_BLOB IN OUT NOCOPY BLOB)
	RETURN NUMBER;
	--
	-- PUT_CLOB
	FUNCTION PUT_CLOB(P_FILE IN VARCHAR2,
	                  P_CLOB IN OUT NOCOPY CLOB,
	                  P_CSNAME IN VARCHAR2:=NULL)
	RETURN NUMBER;
	--
	-- PUT_CHAR
	FUNCTION PUT_CHAR(P_FILE IN VARCHAR2,
	                  P_CHAR IN VARCHAR2,
	                  P_CSNAME IN VARCHAR2:=NULL)
	RETURN NUMBER;
	--
	-- PUT_RAW
	FUNCTION PUT_RAW(P_FILE IN VARCHAR2,
	                  P_RAW IN RAW)
	RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY RIVUS.XT_UTL_FILE
IS
-- Java Stored Package Peer
FUNCTION PUT_BLOB_PEER(P_FILE IN VARCHAR2,
                       P_BLOB IN BLOB)
RETURN NUMBER
AS LANGUAGE JAVA
NAME
'jp.rivus.io.UtilFileSurrogate.writeBlob(java.lang.String, oracle.sql.BLOB)
return java.lang.String';
--
-- PUT_BLOB 
FUNCTION PUT_BLOB(P_FILE IN VARCHAR2,
                  P_BLOB IN OUT NOCOPY BLOB)
RETURN NUMBER
IS
BEGIN
	-- DBMS_JAVA.SET_OUTPUT(2000);  -- printStackTrace -> DBMS_OUTPUT
	RETURN XT_UTL_FILE.PUT_BLOB_PEER(P_FILE, P_BLOB);
END;
--
-- PUT_CLOB
FUNCTION PUT_CLOB(P_FILE IN VARCHAR2,
                  P_CLOB IN OUT NOCOPY CLOB,
                  P_CSNAME IN VARCHAR2:=NULL)
RETURN NUMBER
IS
	vRet		NUMBER;
	vBlob		BLOB;
	vDstOffset	INTEGER := 1;				-- Dest Offset
	vSrcOffset	INTEGER := 1;				-- Source Offset
	vCSID		NUMBER;					-- Charset ID
	vLangContext	INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;	-- Lang Context
	vWarning	INTEGER := DBMS_LOB.NO_WARNING;		-- Warning
BEGIN
	vCSID := NVL(CASE WHEN P_CSNAME IS NOT NULL THEN NLS_CHARSET_ID(P_CSNAME)
		     ELSE DBMS_LOB.DEFAULT_CSID END, DBMS_LOB.DEFAULT_CSID);
	DBMS_LOB.CREATETEMPORARY(vBlob, TRUE, DBMS_LOB.CALL);	-- BLOB 
	DBMS_LOB.CONVERTTOBLOB(vBlob, P_CLOB, DBMS_LOB.LOBMAXSIZE,
	                       vDstOffset, vSrcOffset, vCSID, vLangContext, vWarning);
	vRet := XT_UTL_FILE.PUT_BLOB(P_FILE, vBlob);
	DBMS_LOB.FREETEMPORARY(vBlob);
	RETURN vRet;
END;
--
-- PUT_CHAR
FUNCTION PUT_CHAR(P_FILE IN VARCHAR2,
                  P_CHAR IN VARCHAR2,
                  P_CSNAME IN VARCHAR2:=NULL)
RETURN NUMBER
IS
	vClob		CLOB;
BEGIN
	vClob := P_CHAR;
	RETURN XT_UTL_FILE.PUT_CLOB(P_FILE, vClob, P_CSNAME);
END;
--
-- PUT_RAW
FUNCTION PUT_RAW(P_FILE IN VARCHAR2,
                  P_RAW IN RAW)
RETURN NUMBER
IS
	vBlob		BLOB;
BEGIN
	vBlob := P_RAW;
	RETURN XT_UTL_FILE.PUT_BLOB(P_FILE, vBlob);
END;

END XT_UTL_FILE;
/
