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:[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]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
