I've added 6 lines needed to support compression :) Cheers, -- Davide Savazzi
/* * $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:[EMAIL PROTECTED]">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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
