Shouldn't we take this over to the main branch as well?

Oliver


On 13 Nov 2004 14:42:01 -0000, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
> dsavazzi    2004/11/13 06:42:01
> 
>   Modified:    src/stores/org/apache/slide/store/impl/rdbms Tag:
>                         SLIDE_2_1_RELEASE_BRANCH OracleRDBMSAdapter.java
>   Log:
>   Added patch by Richard Emberson.
> 
>   Revision  Changes    Path
>   No                   revision
>   No                   revision
>   1.9.2.3   +157 -10   
> jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/OracleRDBMSAdapter.java
> 
>   Index: OracleRDBMSAdapter.java
>   ===================================================================
>   RCS file: 
> /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/OracleRDBMSAdapter.java,v
>   retrieving revision 1.9.2.2
>   retrieving revision 1.9.2.3
>   diff -u -r1.9.2.2 -r1.9.2.3
>   --- OracleRDBMSAdapter.java   30 Oct 2004 21:47:25 -0000      1.9.2.2
>   +++ OracleRDBMSAdapter.java   13 Nov 2004 14:42:00 -0000      1.9.2.3
>   @@ -23,36 +23,179 @@
> 
>    package org.apache.slide.store.impl.rdbms;
> 
>   +import java.io.*;
>   +import java.lang.reflect.*;
>    import java.sql.Connection;
>    import java.sql.PreparedStatement;
>   +import java.sql.CallableStatement;
>    import java.sql.ResultSet;
>    import java.sql.SQLException;
> 
>   +import org.apache.slide.common.Uri;
>    import org.apache.slide.common.Service;
>    import org.apache.slide.common.ServiceAccessException;
>   +import org.apache.slide.content.NodeRevisionDescriptor;
>   +import org.apache.slide.content.NodeRevisionContent;
>    import org.apache.slide.util.logger.Logger;
> 
>    /**
>   - * Adapter for Oracle 10.
>   + * Adapter for Oracle 9 and 10.
>     *
>     * @version $Revision$
>     */
>    public class OracleRDBMSAdapter extends CommonRDBMSAdapter implements 
> SequenceAdapter {
> 
>   -    protected static String normalizeSequenceName(String sequenceName) {
>   -        return sequenceName.replace('-', '_').toUpperCase() + "_SEQ";
>   -    }
>   -
>        // Constructor
> 
>   -    public OracleRDBMSAdapter(Service service, Logger logger) {
>   +    public OracleRDBMSAdapter(Service service, Logger logger)
>   +        throws ClassNotFoundException, NoSuchMethodException
>   +    {
>            super(service, logger);
>   +
>   +        Class bCls = Class.forName("oracle.sql.BLOB");
>   +        blobGetOutStreamMethod = bCls.getMethod("getBinaryOutputStream", 
> new Class[] {});
>        }
> 
>        // Public Methods
> 
>   +    protected void storeContent(
>   +        Connection connection, Uri uri,
>   +        NodeRevisionDescriptor revisionDescriptor,
>   +        NodeRevisionContent revisionContent) throws IOException, 
> SQLException
>   +    {
>   +        assureVersionInfo(connection, uri, revisionDescriptor);
>   +
>   +        InputStream is = revisionContent.streamContent();
>   +        if (is != null) {
>   +            long blobLength = 0;
>   +            File tempFile = null;
>   +
>   +            if (bcompress) {
>   +                getLogger().log("Compressing the data", LOG_CHANNEL,
>   +                Logger.DEBUG);
>   +                StoreContentZip ziputil = new StoreContentZip();
>   +                ziputil.Zip(is);
>   +                is = ziputil.getInputStream();
>   +
>   +                // fix RevisionDescriptor Content Length
>   +                if (revisionDescriptor.getContentLength() == -1) {
>   +                    
> revisionDescriptor.setContentLength(ziputil.getInitialContentLength());
>   +                }
>   +
>   +                blobLength = ziputil.getContentLength();
>   +            } else {
>   +                // fix RevisionDescriptor Content Length
>   +                if (revisionDescriptor.getContentLength() == -1) {
>   +                    try {
>   +                        tempFile = File.createTempFile("content", null);
>   +                        FileOutputStream fos = new 
> FileOutputStream(tempFile);
>   +                        try {
>   +                            byte buffer[] = new byte[4096];
>   +                            do {
>   +                                int nChar = is.read(buffer);
>   +                                if (nChar == -1) {
>   +                                    break;
>   +                                }
>   +                                fos.write(buffer, 0, nChar);
>   +                            } while (true);
>   +                        } finally {
>   +                            fos.close();
>   +                        }
>   +                        is.close();
>   +                        is = new FileInputStream(tempFile);
>   +
>   +                        
> revisionDescriptor.setContentLength(tempFile.length());
>   +
>   +                    } catch (IOException ex) {
>   +                        getLogger().log(ex.toString() + " during the 
> calculation of the content length.",
>   +                            LOG_CHANNEL, Logger.ERROR);
>   +                        throw ex;
>   +                    }
>   +                }
>   +
>   +                blobLength = revisionDescriptor.getContentLength();
>   +            }
>   +
>   +            CallableStatement statement = null;
>   +            try {
>   +                long versionID = getVersionID(connection, uri.toString(), 
> revisionDescriptor);
>   +                statement = connection.prepareCall(
>   +                    "BEGIN "
>   +                    + "insert into VERSION_CONTENT (VERSION_ID, CONTENT) "
>   +                    + "values (?, empty_blob()) RETURN CONTENT into ?;"
>   +                    + "END; "
>   +                );
>   +                statement.setLong(1, versionID);
>   +                statement.registerOutParameter(2, java.sql.Types.BLOB);
>   +
>   +                statement.executeUpdate();
>   +
>   +                // do these two lines using reflection
>   +                // BLOB blob = (BLOB) statement.getBlob(2);
>   +                // OutputStream os = blob.getBinaryOutputStream();
>   +
>   +                Object bObj = statement.getBlob(2);
>   +                OutputStream os = null;
>   +                try {
>   +                    os = (OutputStream) 
> blobGetOutStreamMethod.invoke(bObj, new Object[] {});
>   +                } catch (Exception ex) {
>   +                    ex.printStackTrace();
>   +                    throw new IOException("Reflection error");
>   +                }
>   +
>   +                try {
>   +                    byte buffer[] = new byte[4096];
>   +                    do {
>   +                        int nChar = is.read(buffer);
>   +                        if (nChar == -1) {
>   +                            break;
>   +                        }
>   +                        os.write(buffer, 0, nChar);
>   +                    } while (true);
>   +                } finally {
>   +                    os.flush();
>   +                    os.close();
>   +                }
>   +
>   +            } finally {
>   +                if (tempFile != null) {
>   +                    try {
>   +                        is.close();
>   +                    } catch (Exception ex) {
>   +                        // ignore
>   +                    }
>   +                    is = null;
>   +                    if (!tempFile.delete()) {
>   +                        logger.log("Could not delete file \"" + 
> tempFile.getAbsolutePath() +
>   +                            "\"");
>   +                    }
>   +                }
>   +
>   +                try {
>   +                    close(statement);
>   +                } finally {
>   +                    if (is != null) {
>   +                        // XXX some JDBC drivers seem to close the stream 
> upon
>   +                        // closing of
>   +                        // the statement; if so this will raise an 
> IOException
>   +                        // silently ignore it...
>   +                        try {
>   +                            is.close();
>   +                        } catch (IOException ioe) {
>   +                            logger.log("Could not close stream", ioe, 
> LOG_CHANNEL, Logger.DEBUG);
>   +                        }
>   +                    }
>   +                }
>   +            }
>   +        }
>   +    }
>   +
>   +    protected static String normalizeSequenceName(String sequenceName) {
>   +        return sequenceName.replace('-', '_').toUpperCase() + "_SEQ";
>   +    }
>   +
>        public boolean isSequenceSupported(Connection conn) {
>            return true;
>        }
>   @@ -113,6 +256,10 @@
>            }
>        }
> 
>   +
>   +    // Attributes
>   +
>   +    protected Method blobGetOutStreamMethod;
>    }
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to