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]

Reply via email to