You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by Davide Savazzi <da...@corefandango.net> on 2004/07/13 17:40:41 UTC

Oracle store compression support

I've added 6 lines needed to support compression :)

Cheers,
-- 
Davide Savazzi

Re: Oracle store compression support

Posted by Oliver Zeigermann <ol...@zeigermann.de>.
Cool thing! I have just committed it!

Thanks a lot again,

Oliver

Davide Savazzi wrote:
> I've added 6 lines needed to support compression :)
> 
> Cheers,
> 
> 
> ------------------------------------------------------------------------
> 
> /*
>  * $Header: /home/cvspublic/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/OracleRDBMSAdapter.java,v 1.4 2004/06/08 13:40:08 ozeigermann Exp $
>  * $Revision: 1.4 $
>  * $Date: 2004/06/08 13:40:08 $
>  *
>  * ====================================================================
>  *
>  * Copyright 1999-2003 The Apache Software Foundation 
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
>  * You may obtain a copy of the License at
>  *
>  *     http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing, software
>  * distributed under the License is distributed on an "AS IS" BASIS,
>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>  * See the License for the specific language governing permissions and
>  * limitations under the License.
>  *
>  */
> 
> package org.apache.slide.store.impl.rdbms;
> 
> import org.apache.slide.common.*;
> import org.apache.slide.content.*;
> import org.apache.slide.lock.LockTokenNotFoundException;
> import org.apache.slide.lock.NodeLock;
> import org.apache.slide.security.NodePermission;
> import org.apache.slide.structure.LinkNode;
> import org.apache.slide.structure.ObjectAlreadyExistsException;
> import org.apache.slide.structure.ObjectNode;
> import org.apache.slide.structure.ObjectNotFoundException;
> import org.apache.slide.util.logger.Logger;
> 
> import java.io.*;
> import java.sql.*;
> import java.util.*;
> 
> 
> /**
>  * Adapter for Oracle 10.
>  *
>  * @author <a href="mailto:davide.savazzi@corefandango.net">Davide Savazzi</a>
>  * @version $Revision: 1.6 $
>  */
> public class OracleRDBMSAdapter extends StandardRDBMSAdapter implements SequenceAdapter {
>     
>     protected static String normalizeSequenceName(String sequenceName) {
>         return sequenceName.replace('-', '_').toUpperCase() + "_SEQ";
>     }
> 
>     // Constructor
>     
>     public OracleRDBMSAdapter(Service service, Logger logger) {
>         super(service, logger);
>     }
>     
> 
>     // Public Methods
>     
>     public boolean isSequenceSupported(Connection conn) {
>         return true;
>     }
> 
>     public boolean createSequence(Connection conn, String sequenceName) throws ServiceAccessException {
> 
>         String query = "CREATE SEQUENCE \"" + normalizeSequenceName(sequenceName) + "\"";
> 
>         PreparedStatement statement = null;
> 
>         try {
>             statement = conn.prepareStatement(query);
>             statement.executeUpdate();
>             return true;
>         } catch (SQLException e) {
>             throw new ServiceAccessException(service, e);
>         } finally {
>             close(statement);
>         }
> 
>     }
> 
>     public long nextSequenceValue(Connection conn, String sequenceName) throws ServiceAccessException {
>         String selectQuery = "SELECT \"" + normalizeSequenceName(sequenceName)+"\".nextval FROM DUAL";
> 
>         PreparedStatement selectStatement = null;
>         ResultSet res = null;
> 
>         try {
>             selectStatement = conn.prepareStatement(selectQuery);
>             res = selectStatement.executeQuery();
>             if (!res.next()) {
>                 throw new ServiceAccessException(service, "Could not increment sequence " + sequenceName);
>             }
>             long value = res.getLong(1);
>             return value;
>         } catch (SQLException e) {
>             throw new ServiceAccessException(service, e);
>         } finally {
>             close(selectStatement, res);
>         }
>     }
> 
>     public boolean sequenceExists(Connection conn, String sequenceName) throws ServiceAccessException {
> 
>         PreparedStatement selectStatement = null;
>         ResultSet res = null;
> 
>         try {
>             selectStatement =
>                 conn.prepareStatement("ALTER SEQUENCE  \"" + normalizeSequenceName(sequenceName) + "\" INCREMENT BY 1");
>             res = selectStatement.executeQuery();
>             return true;
>         } catch (SQLException e) {
>             return false;
>         } finally {
>             close(selectStatement, res);
>         }
>     }
>     
>     public void removeObject(Connection connection, Uri uri, ObjectNode object)
>         throws ServiceAccessException, ObjectNotFoundException 
>     {
>         PreparedStatement statement = null;
>         try {
>             clearBinding(connection, uri);
> 
>             // delete links
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from LINKS l where l.URI_ID in (" + 
>                         "select u.URI_ID from URI u where u.URI_STRING = ?)");
>                 statement.setString(1, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             // delete version history
>             // FIXME: Is this true??? Should the version history be removed if the object is removed???
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from VERSION_HISTORY vh where vh.URI_ID in (" + 
>                         "select u.URI_ID from URI u where u.URI_STRING = ?)");
>                 statement.setString(1, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             // delete version
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from VERSION v where v.URI_ID in (" + 
>                         "select u.URI_ID from URI u where u.URI_STRING = ?)");
>                 statement.setString(1, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             // delete the object itself
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from OBJECT o where o.URI_ID in (" +
>                         "select u.URI_ID from URI u where u.URI_STRING = ?)");
>                 statement.setString(1, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             // finally delete the uri
>             try {
>                 statement = connection.prepareStatement("delete from URI where URI_STRING = ?");
>                 statement.setString(1, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
> 
>         }
>     }
>     
>     public void removeRevisionContent(Connection connection, Uri uri, NodeRevisionDescriptor revisionDescriptor)
>         throws ServiceAccessException {
>         try {
>             PreparedStatement statement = null;
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from VERSION_CONTENT vc where vc.VERSION_ID in (" + 
>                         "select vh.VERSION_ID from VERSION_HISTORY vh, URI u where vh.REVISION_NO = ? and vh.URI_ID=u.URI_ID AND u.URI_STRING=?)");
>                 statement.setString(1, revisionDescriptor.getRevisionNumber().toString());
>                 statement.setString(2, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         }
>     }
>     
>     public void removeRevisionDescriptors(Connection connection, Uri uri) throws ServiceAccessException {
>         PreparedStatement statement = null;
>         try {
>             statement =
>                 connection.prepareStatement(
>                 "delete from VERSION_PREDS vp where vp.VERSION_ID in (" + 
>                 "select vh.VERSION_ID from VERSION_HISTORY vh, URI u where vh.URI_ID = u.URI_ID and u.URI_STRING = ?)");
>             statement.setString(1, uri.toString());
>             statement.executeUpdate();
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         } finally {
>             close(statement);
>         }
>     }
> 
>     public void removeRevisionDescriptor(Connection connection, Uri uri, NodeRevisionNumber revisionNumber)
>         throws ServiceAccessException 
>     {
>         PreparedStatement statement = null;
>         try {
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from VERSION_LABELS vl where vl.VERSION_ID in (" + 
>                         "select vh.VERSION_ID from VERSION_HISTORY vh, URI u where vh.REVISION_NO = ? and vh.URI_ID = u.URI_ID AND u.URI_STRING = ?)");
>                 statement.setString(1, revisionNumber.toString());
>                 statement.setString(2, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from PROPERTIES p where p.VERSION_ID in (" + 
>                         "select vh.VERSION_ID from VERSION_HISTORY vh, URI u where vh.REVISION_NO = ? and vh.URI_ID = u.URI_ID AND u.URI_STRING = ?)");
>                 statement.setString(1, revisionNumber.toString());
>                 statement.setString(2, uri.toString());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         }
>     }
>     
>     public void removeLock(Connection connection, Uri uri, NodeLock lock)
>         throws ServiceAccessException, LockTokenNotFoundException {
>         PreparedStatement statement = null;
>         try {
>             // FIXME: What about inheritage?
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from LOCKS where LOCKS.LOCK_ID in (select u.URI_ID from URI u where u.URI_STRING=?)");
>                 statement.setString(1, lock.getLockId());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>             try {
>                 statement =
>                     connection.prepareStatement(
>                         "delete from URI where URI.URI_ID in (select LOCK_ID from LOCKS) and URI_STRING=?");
>                 statement.setString(1, lock.getLockId());
>                 statement.executeUpdate();
>             } finally {
>                 close(statement);
>             }
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         }
>     }
>     
>     public void revokePermission(Connection connection, Uri uri, NodePermission permission)
>         throws ServiceAccessException {
>         PreparedStatement statement = null;
>         try {
>             NodeRevisionNumber revisionNumber = permission.getRevisionNumber();
>             statement =
>                 connection.prepareStatement(
>                     "delete from PERMISSIONS where PERMISSIONS.OBJECT_ID in (select ou.URI_ID from URI ou, URI su, URI au where ou.URI_STRING = ? and SUBJECT_ID = su.URI_ID and su.URI_STRING = ? and ACTION_ID = au.URI_ID and au.URI_STRING = ? and VERSION_NO"
>                         + getRevisionNumberAsWhereQueryFragement(revisionNumber) + ")");
>             statement.setString(1, permission.getObjectUri());
>             statement.setString(2, permission.getSubjectUri());
>             statement.setString(3, permission.getActionUri());
>             statement.executeUpdate();
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         } finally {
>             close(statement);
>         }
>     }
> 
>     public void revokePermissions(Connection connection, Uri uri) throws ServiceAccessException {
>         PreparedStatement statement = null;
>         try {
>             statement =
>                 connection.prepareStatement(
>                     "delete from PERMISSIONS where PERMISSIONS.OBJECT_ID in (select u.URI_ID from URI u where u.URI_STRING = ?)");
>             statement.setString(1, uri.toString());
>             statement.executeUpdate();
>         } catch (SQLException e) {
>             throw createException(e, uri.toString());
>         } finally {
>             close(statement);
>         }
>     }
>     
>     
>     // Private Methods
>     
>     protected void storeContent(
>         Connection connection,
>         Uri uri,
>         NodeRevisionDescriptor revisionDescriptor,
>         NodeRevisionContent revisionContent)
>         throws IOException, SQLException 
>     {
>         getLogger().log("storeContent: " + uri, Logger.DEBUG);
>         
>         assureVersionInfo(connection, uri, revisionDescriptor);
>         long versionContentId = getVersionContentId(connection, uri, revisionDescriptor);
>         insertEmptyContent(connection, versionContentId);
>         
>         PreparedStatement statement = connection.prepareStatement(
>             "SELECT vc.CONTENT FROM VERSION_CONTENT vc WHERE vc.VERSION_ID = ? FOR UPDATE");
>         try {
>             statement.setLong(1, versionContentId);
>             ResultSet res = statement.executeQuery();
>             try {
>                 res.next();
>                 Blob blob = res.getBlob(1);
>                 InputStream in = revisionContent.streamContent();
>                 OutputStream out = ((oracle.sql.BLOB) blob).getBinaryOutputStream();
> 
>                 if (bcompress) {
>                     getLogger().log("Compressing the data", LOG_CHANNEL, 6);
>                     StoreContentZip ziputil = new StoreContentZip();
>                     ziputil.Zip(in);
>                     in = ziputil.getInputStream();
>                 }
>                 
>                 try {
>                     copy(in, out, ((oracle.sql.BLOB) blob).getBufferSize());
>                 } finally {
>                     close(out);
>                 }
>             } finally {
>                 close(res);
>             }
>         }  finally {
>             close(statement);
>         }
>     }
>     
>     protected void clearBinding(Connection connection, Uri uri)
>         throws ServiceAccessException, ObjectNotFoundException, SQLException 
>     {
>         PreparedStatement statement = null;
> 
>         try {
>             statement =
>                 connection.prepareStatement(
>                     "delete from BINDING where BINDING.URI_ID in (select URI_ID from URI where URI.URI_STRING = ?)");
>             statement.setString(1, uri.toString());
>             statement.executeUpdate();
>         } finally {
>             close(statement);
>         }
> 
>         try {
>             statement =
>                 connection.prepareStatement(
>                     "delete from PARENT_BINDING where PARENT_BINDING.URI_ID in (select URI_ID from URI where URI.URI_STRING = ?)");
>             statement.setString(1, uri.toString());
>             statement.executeUpdate();
>         } finally {
>             close(statement);
>         }
>     }
>     
>     private long getVersionContentId(Connection connection, Uri uri, NodeRevisionDescriptor revisionDescriptor) 
>         throws SQLException 
>     {
>         PreparedStatement statement = connection.prepareStatement(
>             "select vh.VERSION_ID from VERSION_HISTORY vh, URI u " + 
>             "where vh.URI_ID = u.URI_ID and u.URI_STRING = ? and vh.REVISION_NO"
>             + getRevisionNumberAsWhereQueryFragement(revisionDescriptor.getRevisionNumber()));
>         try {
>             statement.setString(1, uri.toString());
>             ResultSet res = statement.executeQuery();
>             try {
>                 res.next();
>                 return res.getLong(1);
>             } finally {
>                 close(res);
>             }
>         } finally {
>             close(statement);
>         }
>     }
>     
>     private void insertEmptyContent(Connection connection, long versionContentId) 
>         throws SQLException 
>     {
>         PreparedStatement statement = connection.prepareStatement(
>             "insert into VERSION_CONTENT (VERSION_ID, CONTENT) values (?, EMPTY_BLOB())");
>         try {
>             statement.setLong(1, versionContentId);
>             statement.executeUpdate();
>         } finally {
>             close(statement);
>         }
>     }
>     
>     private void close(ResultSet resultSet) {
>         try {
>             if (resultSet != null) {
>                 resultSet.close();
>             }
>         } catch (SQLException e) {
>             getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
>         }
>     }
>     
>     private void close(InputStream in) {
>         try {
>             if (in != null) {
>                 in.close();
>             }
>         } catch (IOException e) {
>             getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
>         }
>     }
>     
>     private void close(OutputStream out) {
>         try {
>             if (out != null) {
>                 out.close();
>             }
>         } catch (IOException e) {
>             getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
>         }
>     }
>     
>     private static void copy(InputStream in, OutputStream out, int bufferSize) 
>         throws IOException 
>     {
>         int read = 0;
>         byte buffer[] = new byte[bufferSize];
>         while ((read = in.read(buffer, 0, bufferSize)) != -1) {
>             out.write(buffer, 0, read);
>         }
>     }
>     
>     protected String convertRevisionNumberToComparable(String revisioNumber) {
>         return "to_number(substr("+revisioNumber+",1,instr("+revisioNumber+",'.')-1)), to_number(substr("+revisioNumber+",instr("+revisioNumber+",'.')+1))";
>     }
> 
> }
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: slide-dev-help@jakarta.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org