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