Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 91991 invoked from network); 1 Sep 2009 14:21:08 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 1 Sep 2009 14:21:08 -0000 Received: (qmail 3687 invoked by uid 500); 1 Sep 2009 14:21:08 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 3620 invoked by uid 500); 1 Sep 2009 14:21:08 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 3610 invoked by uid 99); 1 Sep 2009 14:21:08 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Sep 2009 14:21:08 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Sep 2009 14:21:06 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 35CB823888E4; Tue, 1 Sep 2009 14:20:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r810068 - in /jackrabbit/sandbox/JCR-1456/jackrabbit-core: ./ src/main/java/org/apache/jackrabbit/core/fs/db/ src/main/java/org/apache/jackrabbit/core/persistence/bundle/ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ src... Date: Tue, 01 Sep 2009 14:20:45 -0000 To: commits@jackrabbit.apache.org From: martijnh@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090901142046.35CB823888E4@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: martijnh Date: Tue Sep 1 14:20:44 2009 New Revision: 810068 URL: http://svn.apache.org/viewvc?rev=810068&view=rev Log: JCR-1456 Database connection pooling * Some minor modifications such that tests can be run on Oracle (10g). * Renamed the workspace-init-test workspace because Oracle identifiers have a max length of 30. * Special Oracle blob support needs to unwrap the connection provided by the commons-dbcp library. Added: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/ - copied from r809496, jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/workspace-init-test/ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/ - copied from r809496, jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/workspace-init-test/ Removed: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/workspace-init-test/ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/workspace-init-test/ Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/pom.xml jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/OraclePersistenceManager.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionFactory.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionHelper.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/Oracle10R1ConnectionHelper.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/OracleConnectionHelper.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/WorkspaceInitTest.java jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/workspace.xml jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/workspace.xml Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/pom.xml?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/pom.xml (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/pom.xml Tue Sep 1 14:20:44 2009 @@ -279,7 +279,7 @@ org.apache.jackrabbit.core.journal.MSSqlDatabaseJournal mssql user - $pwd + pwd net.sourceforge.jtds.jdbc.Driver jdbc:jtds:sqlserver://localhost:2433/${config.db.name} jdbc:jtds:sqlserver://localhost:2433/master @@ -288,6 +288,24 @@ + oracle + + unused + org.apache.jackrabbit.core.fs.db.OracleFileSystem + org.apache.jackrabbit.core.data.db.DbDataStore + org.apache.jackrabbit.core.persistence.bundle.OraclePersistenceManager + org.apache.jackrabbit.core.journal.OracleDatabaseJournal + oracle + user + password + oracle.jdbc.driver.OracleDriver + jdbc:oracle:thin:@localhost:1521:xe + unused + unused + unused + + + use-descriptor-overlay @@ -354,7 +372,7 @@ - + @@ -369,7 +387,7 @@ - + @@ -412,6 +430,12 @@ 1.2.2 test + + com.oracle + ojdbc14 + 10.2.0.3.0 + test + Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java Tue Sep 1 14:20:44 2009 @@ -22,6 +22,7 @@ import org.apache.jackrabbit.core.fs.FileSystemException; import org.apache.jackrabbit.core.fs.FileSystemPathUtil; import org.apache.jackrabbit.core.fs.RandomAccessOutputStream; +import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -154,6 +155,32 @@ } /** + * Makes sure that schemaObjectPrefix does only consist of + * characters that are allowed in names on the target database. Illegal + * characters will be replaced by '_'. + * + * @throws Exception if an error occurs + */ + @Override + protected void prepareSchemaObjectPrefix() throws Exception { + DatabaseMetaData metaData = con.getMetaData(); + String legalChars = metaData.getExtraNameCharacters(); + legalChars += "ABCDEFGHIJKLMNOPQRSTUVWXZY0123456789_"; + + String prefix = schemaObjectPrefix.toUpperCase(); + StringBuffer escaped = new StringBuffer(); + for (int i = 0; i < prefix.length(); i++) { + char c = prefix.charAt(i); + if (legalChars.indexOf(c) == -1) { + escaped.append("_"); + } else { + escaped.append(c); + } + } + schemaObjectPrefix = escaped.toString(); + } + + /** * {@inheritDoc} *

* Overridden in order to support multiple oracle schemas. Note that @@ -569,7 +596,7 @@ Method createTemporary = blobClass.getMethod("createTemporary", new Class[]{Connection.class, Boolean.TYPE, Integer.TYPE}); Object blob = createTemporary.invoke(null, - new Object[]{con, Boolean.FALSE, durationSessionConstant}); + new Object[]{ConnectionFactory.unwrap(con), Boolean.FALSE, durationSessionConstant}); Method open = blobClass.getMethod("open", new Class[]{Integer.TYPE}); open.invoke(blob, new Object[]{modeReadWriteConstant}); Method getBinaryOutputStream = Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java Tue Sep 1 14:20:44 2009 @@ -44,7 +44,7 @@ */ @Override protected ConnectionHelper createConnectionHelper(DataSource dataSrc) throws Exception { - Oracle10R1ConnectionHelper helper = new Oracle10R1ConnectionHelper(dataSrc, user); + Oracle10R1ConnectionHelper helper = new Oracle10R1ConnectionHelper(dataSrc); helper.init(); return helper; } Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/OraclePersistenceManager.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/OraclePersistenceManager.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/OraclePersistenceManager.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/OraclePersistenceManager.java Tue Sep 1 14:20:44 2009 @@ -47,7 +47,7 @@ public class OraclePersistenceManager extends BundleDbPersistenceManager { /** the Oracle table space to use */ - protected String tableSpace; + protected String tableSpace = ""; /** * Creates a new oracle persistence manager @@ -111,7 +111,7 @@ */ @Override protected ConnectionHelper createConnectionHelper(DataSource dataSrc) throws Exception { - OracleConnectionHelper helper = new OracleConnectionHelper(dataSrc, user); + OracleConnectionHelper helper = new OracleConnectionHelper(dataSrc); helper.init(); return helper; } Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionFactory.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionFactory.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionFactory.java Tue Sep 1 14:20:44 2009 @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.core.persistence.bundle.util; +import java.lang.reflect.Field; import java.sql.Connection; import java.sql.SQLException; @@ -25,6 +26,7 @@ import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.dbcp.DelegatingConnection; /** * A factory for new database connections. @@ -92,6 +94,31 @@ } /** + * Needed for pre-10R2 Oracle blob support....:( + * + * This method actually assumes that we are using commons DBCP 1.2.2. + * + * @param con the commons-DBCP pooled connection to unwrap + * @return the unwrapped connection + */ + public static Connection unwrap(Connection con) throws SQLException { + try { + Field f1 = con.getClass().getDeclaredField("delegate"); + f1.setAccessible(true); + Object con2 = f1.get(con); + Field f2 = DelegatingConnection.class.getDeclaredField("_conn"); + f2.setAccessible(true); + return (Connection) f2.get(con2); + } catch (IllegalArgumentException e) { + throw new SQLException("failed to unwrap connection: " + e.getMessage()); + } catch (NoSuchFieldException e) { + throw new SQLException("failed to unwrap connection: " + e.getMessage()); + } catch (IllegalAccessException e) { + throw new SQLException("failed to unwrap connection: " + e.getMessage()); + } + } + + /** * Loads and returns the given JDBC driver (or JNDI context) class. * Returns null if a class name is not given. * Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionHelper.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionHelper.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionHelper.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionHelper.java Tue Sep 1 14:20:44 2009 @@ -50,7 +50,7 @@ */ public class ConnectionHelper { - private final String userName; + private final boolean checkTablesWithUserName; protected final DataSource dataSource; @@ -65,18 +65,18 @@ */ public ConnectionHelper(DataSource dataSrc) { dataSource = dataSrc; - userName = null; + checkTablesWithUserName = false; } /** * Constructor, typically used for Oracle subtypes. * * @param dataSrc the {@link DataSource} on which this instance acts - * @param user the username which is to be used for the {@link #tableExists(String)} method + * @param checkWithUserName whether the username is to be used for the {@link #tableExists(String)} method */ - protected ConnectionHelper(DataSource dataSrc, String user) { + protected ConnectionHelper(DataSource dataSrc, boolean checkWithUserName) { dataSource = dataSrc; - userName = user; + checkTablesWithUserName = checkWithUserName; } /** @@ -156,6 +156,10 @@ } else if (metaData.storesUpperCaseIdentifiers()) { name = tableName.toUpperCase(); } + String userName = null; + if (checkTablesWithUserName) { + userName = metaData.getUserName(); + } rs = metaData.getTables(null, userName, name, null); schemaExists = rs.next(); } finally { @@ -217,17 +221,25 @@ /** * Executes a general SQL statement and immediately closes all resources. * + * Note: We use a Statement if there are no parameters to avoid a problem on + * the Oracle 10g JDBC driver w.r.t. :NEW and :OLD keywords that triggers ORA-17041. + * * @param sql an SQL statement string * @param params the parameters for the SQL statement * @throws SQLException on error */ public final void exec(String sql, Object... params) throws SQLException { Connection con = null; - PreparedStatement stmt = null; + Statement stmt = null; try { con = getConnection(); - stmt = con.prepareStatement(sql); - execute(stmt, params); + if (params == null || params.length == 0) { + stmt = con.createStatement(); + stmt.execute(sql); + } else { + stmt = con.prepareStatement(sql); + execute((PreparedStatement) stmt, params); + } } finally { closeResources(con, stmt, null); } @@ -335,10 +347,10 @@ } /** - * This method is used by all methods of this class that execute SQL statements. This default - * implementation sets all parameters and unwraps {@link StreamWrapper} instances. Subclasses may override - * this method to do something special with the parameters. E.g., the {@code Oracle10R1ConnectionHelper} - * overrides it in order to add special blob handling. + * This method is used by all methods of this class that execute SQL statements with parameters. This + * default implementation sets all parameters and unwraps {@link StreamWrapper} instances. Subclasses may + * override this method to do something special with the parameters. E.g., the {@code + * Oracle10R1ConnectionHelper} overrides it in order to add special blob handling. * * @param stmt the {@link PreparedStatement} to execute * @param params the parameters Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/Oracle10R1ConnectionHelper.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/Oracle10R1ConnectionHelper.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/Oracle10R1ConnectionHelper.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/Oracle10R1ConnectionHelper.java Tue Sep 1 14:20:44 2009 @@ -53,8 +53,8 @@ * @param dataSrc * @param userName */ - public Oracle10R1ConnectionHelper(DataSource dataSrc, String userName) { - super(dataSrc, userName); + public Oracle10R1ConnectionHelper(DataSource dataSrc) { + super(dataSrc); } /** @@ -135,7 +135,9 @@ */ Method createTemporary = blobClass.getMethod("createTemporary", new Class[]{Connection.class, Boolean.TYPE, Integer.TYPE}); - Object blob = createTemporary.invoke(null, new Object[]{con, Boolean.FALSE, durationSessionConstant}); + Object blob = + createTemporary.invoke(null, new Object[]{ConnectionFactory.unwrap(con), Boolean.FALSE, + durationSessionConstant}); Method open = blobClass.getMethod("open", new Class[]{Integer.TYPE}); open.invoke(blob, new Object[]{modeReadWriteConstant}); Method getBinaryOutputStream = blobClass.getMethod("getBinaryOutputStream", new Class[0]); Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/OracleConnectionHelper.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/OracleConnectionHelper.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/OracleConnectionHelper.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/OracleConnectionHelper.java Tue Sep 1 14:20:44 2009 @@ -37,10 +37,9 @@ /** * @param dataSrc - * @param userName */ - public OracleConnectionHelper(DataSource dataSrc, String userName) { - super(dataSrc, userName); + public OracleConnectionHelper(DataSource dataSrc) { + super(dataSrc, true); } public void init() throws Exception { @@ -58,7 +57,7 @@ } catch (SQLException e) { log.warn("Can not retrieve driver version", e); } finally { - DbUtility.close(connection, null, null); + DbUtility.close(connection, null, null); } } Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/WorkspaceInitTest.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/WorkspaceInitTest.java?rev=810068&r1=810067&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/WorkspaceInitTest.java (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/WorkspaceInitTest.java Tue Sep 1 14:20:44 2009 @@ -48,7 +48,7 @@ Thread t = new Thread(new Runnable() { public void run() { try { - getHelper().getSuperuserSession("workspace-init-test").logout(); + getHelper().getSuperuserSession("wsp-init-test").logout(); } catch (RepositoryException e) { throw new RuntimeException(e); } Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/workspace.xml URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/workspace.xml?rev=810068&r1=809496&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/workspace.xml (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository-descriptor-overlay/workspaces/wsp-init-test/workspace.xml Tue Sep 1 14:20:44 2009 @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/workspace.xml URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/workspace.xml?rev=810068&r1=809496&r2=810068&view=diff ============================================================================== --- jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/workspace.xml (original) +++ jackrabbit/sandbox/JCR-1456/jackrabbit-core/src/test/repository/workspaces/wsp-init-test/workspace.xml Tue Sep 1 14:20:44 2009 @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - +