--- OracleDataHandler.java 2003-07-31 02:33:58.000000000 +0000 +++ NewOracleDataHandler.java 2004-07-29 14:33:48.447525400 +0000 @@ -15,14 +15,27 @@ import oracle.jdbc.driver.OracleResultSet; import oracle.jdbc.driver.OracleTypes; import oracle.sql.BLOB; +import oracle.sql.CLOB; import oracle.sql.ROWID; +import oracle.jdbc.OracleConnection; +import oracle.jdbc.OraclePreparedStatement; import org.python.core.Py; +import org.python.core.PyFile; import org.python.core.PyObject; import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.io.Reader; +import java.io.StringReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; import java.sql.CallableStatement; import java.sql.PreparedStatement; +import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; @@ -36,6 +49,9 @@ */ public class OracleDataHandler extends FilterDataHandler { + private ArrayList blobs; + private ArrayList clobs; + /** * Default constructor for DataHandler filtering. */ @@ -92,11 +108,45 @@ break; case Types.BLOB : + InputStream is = null; + Object jobject = null; + + if (object instanceof PyFile) { + jobject = object.__tojava__(InputStream.class); + } else { + jobject = object.__tojava__(Object.class); + } + + if (jobject instanceof InputStream) { + is = (InputStream) jobject; + } else if (jobject instanceof byte[]) { + is = new ByteArrayInputStream((byte[]) jobject); + } + + if (is != null) { + BLOB blob = makeBlob(is, (OracleConnection)stmt.getConnection()); + ((OraclePreparedStatement)stmt).setBLOB(index, blob); + } + else { + Integer[] vals = { new Integer(index), new Integer(type) }; + String msg = zxJDBC.getString("errorSettingIndex", vals); + + throw new SQLException(msg); + } + break; + case Types.CLOB : - Integer[] vals = { new Integer(index), new Integer(type) }; - String msg = zxJDBC.getString("errorSettingIndex", vals); + if (object instanceof PyFile) { + object = ((PyFile)object).read(); + } + + String clobString = (String)object.__tojava__(String.class); + StringReader reader = new StringReader(clobString); + + CLOB clob = makeClob(reader, (OracleConnection)stmt.getConnection()); + ((OraclePreparedStatement)stmt).setCLOB(index, clob); + break; - throw new SQLException(msg); default : super.setJDBCObject(stmt, index, object, type); } @@ -167,4 +217,99 @@ super.registerOut(statement, index, colType, dataType, dataTypeName); } + + public void postExecute(Statement stmt) throws SQLException { + + if (blobs != null) { + for (Iterator iterator = blobs.iterator(); iterator.hasNext();) { + BLOB blob = (BLOB) iterator.next(); + blob.freeTemporary(); + } + blobs = null; + } + + if (clobs != null) { + for (Iterator iterator = clobs.iterator(); iterator.hasNext();) { + CLOB clob = (CLOB) iterator.next(); + clob.freeTemporary(); + } + clobs = null; + } + + super.postExecute(stmt); + + } + + private BLOB makeBlob(InputStream is, OracleConnection connection) throws SQLException { + + BLOB blob = BLOB.createTemporary(connection, true, BLOB.DURATION_SESSION); + blob.open(BLOB.MODE_READWRITE); + blob.trim(0); + + OutputStream os = blob.getBinaryOutputStream(); + byte buffer[] = new byte[blob.getBufferSize()]; + + try + { + int readSize; + + while((readSize = is.read(buffer)) != -1) { + os.write(buffer, 0, readSize); + } + + os.flush(); + os.close(); + is.close(); + blob.close(); + } + catch(IOException ex) { + blob.freeTemporary(); + throw new SQLException("Unable to write to BLOB:" + ex.getMessage()); + } + + if (blobs == null) { + blobs = new ArrayList(); + } + + blobs.add(blob); + + return blob; + } + + private CLOB makeClob(Reader reader, OracleConnection connection) throws SQLException { + + CLOB clob = CLOB.createTemporary(connection, true, CLOB.DURATION_SESSION); + clob.open(CLOB.MODE_READWRITE); + clob.trim(0); + + Writer writer = clob.getCharacterOutputStream(); + char buffer[] = new char[clob.getBufferSize()]; + + try + { + int readSize; + + while((readSize = reader.read(buffer)) != -1) { + writer.write(buffer, 0, readSize); + } + + writer.flush(); + writer.close(); + reader.close(); + clob.close(); + } + catch(IOException ex) { + clob.freeTemporary(); + throw new SQLException("Unable to write to CLOB:" + ex.getMessage()); + } + + if (clobs == null) { + clobs = new ArrayList(); + } + + clobs.add(clob); + + return clob; + } + }