You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by br...@apache.org on 2004/02/15 15:08:33 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/platforms PlatformOracleImpl.java

brj         2004/02/15 06:08:33

  Modified:    src/java/org/apache/ojb/broker/platforms
                        PlatformOracleImpl.java
  Log:
  applied patch to support like for date-columns 
  patch by martin kalen
  
  Revision  Changes    Path
  1.17      +82 -92    db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformOracleImpl.java
  
  Index: PlatformOracleImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformOracleImpl.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- PlatformOracleImpl.java	24 Jan 2004 00:08:58 -0000	1.16
  +++ PlatformOracleImpl.java	15 Feb 2004 14:08:33 -0000	1.17
  @@ -1,56 +1,41 @@
   package org.apache.ojb.broker.platforms;
   
  -/* ====================================================================
  - * The Apache Software License, Version 1.1
  - *
  - * Copyright (c) 2001 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  - * Redistribution and use in source and binary forms, with or without
  - * modification, are permitted provided that the following conditions
  - * are met:
  - *
  - * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer.
  - *
  - * 2. Redistributions in binary form must reproduce the above copyright
  - *    notice, this list of conditions and the following disclaimer in
  - *    the documentation and/or other materials provided with the
  - *    distribution.
  - *
  - * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowledgment may appear in the software itself,
  - *    if and wherever such third-party acknowledgments normally appear.
  - *
  - * 4. The names "Apache" and "Apache Software Foundation" and
  - *    "Apache ObjectRelationalBridge" must not be used to endorse or promote products
  - *    derived from this software without prior written permission. For
  - *    written permission, please contact apache@apache.org.
  - *
  - * 5. Products derived from this software may not be called "Apache",
  - *    "Apache ObjectRelationalBridge", nor may "Apache" appear in their name, without
  - *    prior written permission of the Apache Software Foundation.
  - *
  - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  - * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  - * SUCH DAMAGE.
  +/*
  + * ==================================================================== The Apache Software
  + * License, Version 1.1
  + * 
  + * Copyright (c) 2001 The Apache Software Foundation. All rights reserved.
  + * 
  + * Redistribution and use in source and binary forms, with or without modification, are permitted
  + * provided that the following conditions are met:
  + *  1. Redistributions of source code must retain the above copyright notice, this list of
  + * conditions and the following disclaimer.
  + *  2. Redistributions in binary form must reproduce the above copyright notice, this list of
  + * conditions and the following disclaimer in the documentation and/or other materials provided
  + * with the distribution.
  + *  3. The end-user documentation included with the redistribution, if any, must include the
  + * following acknowledgment: "This product includes software developed by the Apache Software
  + * Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the
  + * software itself, if and wherever such third-party acknowledgments normally appear.
  + *  4. The names "Apache" and "Apache Software Foundation" and "Apache ObjectRelationalBridge" must
  + * not be used to endorse or promote products derived from this software without prior written
  + * permission. For written permission, please contact apache@apache.org.
  + *  5. Products derived from this software may not be called "Apache", "Apache
  + * ObjectRelationalBridge", nor may "Apache" appear in their name, without prior written permission
  + * of the Apache Software Foundation.
  + * 
  + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR
  + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    * ====================================================================
  - *
  - * This software consists of voluntary contributions made by many
  - * individuals on behalf of the Apache Software Foundation.  For more
  - * information on the Apache Software Foundation, please see
  + * 
  + * This software consists of voluntary contributions made by many individuals on behalf of the
  + * Apache Software Foundation. For more information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
   
  @@ -72,11 +57,10 @@
   import java.sql.Types;
   
   /**
  - *  This class is a concrete implementation of <code>Platform</code>. Provides
  - *  an implementation that works around some issues with Oracle in general and
  - *  Oracle's Thin driver in particular..
  - *
  - * @author <a href="mailto:thma@apache.org">Thomas Mahler<a>
  + * This class is a concrete implementation of <code>Platform</code>. Provides an implementation
  + * that works around some issues with Oracle in general and Oracle's Thin driver in particular..
  + * 
  + * @author <a href="mailto:thma@apache.org">Thomas Mahler <a>
    * @version $Id$
    */
   
  @@ -90,8 +74,7 @@
       private Logger logger = LoggerFactory.getLogger(PlatformOracleImpl.class);
   
       /**
  -     * In Oracle we set escape processing explizit 'true' after a
  -     * statement was created.
  +     * In Oracle we set escape processing explizit 'true' after a statement was created.
        */
       public void afterStatementCreate(Statement stmt) throws PlatformException
       {
  @@ -106,24 +89,25 @@
       }
   
       /**
  -     *  For objects beyond 4k, weird things happen in Oracle if you try
  -     *  to use "setBytes", so for all cases it's better to use setBinaryStream.
  -     *  Oracle also requires a change in the resultset type of the prepared
  -     *  statement.
  -     * 	MBAIRD NOTE: BLOBS may not work with Oracle database/thin driver versions
  -     *  prior to 8.1.6.
  -     *
  -     *  @see Platform#setObjectForStatement
  +     * For objects beyond 4k, weird things happen in Oracle if you try to use "setBytes", so for
  +     * all cases it's better to use setBinaryStream. Oracle also requires a change in the resultset
  +     * type of the prepared statement. MBAIRD NOTE: BLOBS may not work with Oracle database/thin
  +     * driver versions prior to 8.1.6.
  +     * 
  +     * @see Platform#setObjectForStatement
        */
  -    public void setObjectForStatement(PreparedStatement ps, int index, Object value, int sqlType) throws SQLException
  +    public void setObjectForStatement(PreparedStatement ps, int index, Object value, int sqlType)
  +            throws SQLException
       {
  -        if (((sqlType == Types.VARBINARY) || (sqlType == Types.LONGVARBINARY) ||
  -                (sqlType == Types.BLOB)) && (value instanceof byte[]))
  +        if (((sqlType == Types.VARBINARY) || (sqlType == Types.LONGVARBINARY) || (sqlType == Types.BLOB))
  +                && (value instanceof byte[]))
           {
               byte buf[] = (byte[]) value;
               int length = buf.length;
  -            if (isUsingOracleThinDriver(ps.getConnection()) && length > THIN_BLOB_MAX_SIZE) {
  -                throw new SQLException("Oracle thin driver cannot update BLOB values with length>2000. (Consider using Oracle9i as OJB platform.)");
  +            if (isUsingOracleThinDriver(ps.getConnection()) && length > THIN_BLOB_MAX_SIZE)
  +            {
  +                throw new SQLException(
  +                        "Oracle thin driver cannot update BLOB values with length>2000. (Consider using Oracle9i as OJB platform.)");
               }
               ByteArrayInputStream inputStream = new ByteArrayInputStream(buf);
               changePreparedStatementResultSetType(ps);
  @@ -139,12 +123,16 @@
               // workaround: Oracle thin driver problem when expecting long
               ps.setLong(index, ((Integer) value).intValue());
           }
  -		else if (sqlType == Types.INTEGER && value instanceof Long)
  -		{
  -			 ps.setLong(index, ((Long) value).longValue());
  -		}
  -        else if (sqlType == Types.CLOB &&
  -                (value instanceof String || value instanceof byte[]))
  +        else if (sqlType == Types.INTEGER && value instanceof Long)
  +        {
  +            ps.setLong(index, ((Long) value).longValue());
  +        }
  +        else if (sqlType == Types.DATE && value instanceof String)
  +        {
  +            // special handling of like for dates (birthDate like '2000-01%')
  +            ps.setString(index, (String) value);
  +        }
  +        else if (sqlType == Types.CLOB && (value instanceof String || value instanceof byte[]))
           {
               Reader reader = null;
               int length = 0;
  @@ -161,8 +149,10 @@
                   reader = new InputStreamReader(inputStream);
                   length = buf.length;
               }
  -            if (isUsingOracleThinDriver(ps.getConnection()) && length > THIN_CLOB_MAX_SIZE) {
  -                throw new SQLException("Oracle thin driver cannot insert CLOB values with length>4000. (Consider using Oracle9i as OJB platform.)");
  +            if (isUsingOracleThinDriver(ps.getConnection()) && length > THIN_CLOB_MAX_SIZE)
  +            {
  +                throw new SQLException(
  +                        "Oracle thin driver cannot insert CLOB values with length>4000. (Consider using Oracle9i as OJB platform.)");
               }
               ps.setCharacterStream(index, reader, length);
           }
  @@ -173,23 +163,22 @@
       }
   
       /**
  -     *  Attempts to modify a private member in the Oracle thin driver's resultset
  -     *  to allow proper setting of large binary streams.
  +     * Attempts to modify a private member in the Oracle thin driver's resultset to allow proper
  +     * setting of large binary streams.
        */
       protected void changePreparedStatementResultSetType(PreparedStatement ps)
       {
           try
           {
               final Field f = ps.getClass().getSuperclass().getDeclaredField("m_userRsetType");
  -            AccessController.doPrivileged(
  -                    new PrivilegedAction()
  -                    {
  -                        public Object run()
  -                        {
  -                            f.setAccessible(true);
  -                            return null;
  -                        }
  -                    });
  +            AccessController.doPrivileged(new PrivilegedAction()
  +            {
  +                public Object run()
  +                {
  +                    f.setAccessible(true);
  +                    return null;
  +                }
  +            });
               f.setInt(ps, 1);
               f.setAccessible(false);
           }
  @@ -224,9 +213,10 @@
   
       /**
        * Checks if the supplied connection is using the Oracle thin driver.
  +     * 
        * @param conn database connection for which to check JDBC-driver
  -     * @return <code>true</code> if the connection is using Oracle thin driver,
  -     * <code>false</code> otherwise.
  +     * @return <code>true</code> if the connection is using Oracle thin driver, <code>false</code>
  +     *         otherwise.
        */
       protected static boolean isUsingOracleThinDriver(Connection conn)
       {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org