Bug 30445 - RDBMS adapter for Weblogic/Oracle
Summary: RDBMS adapter for Weblogic/Oracle
Status: RESOLVED FIXED
Alias: None
Product: Slide
Classification: Unclassified
Component: Stores (show other bugs)
Version: Nightly
Hardware: Other All
: P3 normal (vote)
Target Milestone: ---
Assignee: Slide Developer List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-08-03 10:41 UTC by Christophe
Modified: 2004-11-16 19:05 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Christophe 2004-08-03 10:41:18 UTC
The following RDBMS adapter is required for running Slide on Weblogic & Oracle
because Weblogic has to use the class
"weblogic.jdbc.vendor.oracle.OracleThinBlob" in order to save blob into an
Oracle DB. 


---------------------------------------------------------------------------------
package org.apache.slide.store.impl.rdbms;

import org.apache.slide.common.*;
import org.apache.slide.content.*;
import org.apache.slide.store.impl.rdbms.CommonRDBMSAdapter;
import org.apache.slide.store.impl.rdbms.SequenceAdapter;
import org.apache.slide.util.logger.Logger;

import java.io.*;
import java.sql.*;


/**
 * 
 *  Slide Adapter for Weblogic/oracle.
 * 
 */
public class WeblogicOracleRDBMSAdapter extends CommonRDBMSAdapter implements
SequenceAdapter 
{

    protected static String normalizeSequenceName(String sequenceName) {
        return sequenceName.replace('-', '_').toUpperCase() + "_SEQ";
    }

    // Constructor

    public WeblogicOracleRDBMSAdapter(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);
        }
    }

    // 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 = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)
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, ((weblogic.jdbc.vendor.oracle.OracleThinBlob)
blob).getBufferSize());
                } finally {
                    close(out);
                }
            } finally {
                close(res);
            }
        }  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);
		}
	}

}
Comment 1 Christophe 2004-08-03 10:43:59 UTC
weblogic.jar is required to compile this adapter (found in the weblogic
distribution).
Comment 2 Davide Savazzi 2004-08-23 17:56:16 UTC
Removed use of Oracle Blob extensions.