Return-Path: Delivered-To: apmail-cayenne-commits-archive@www.apache.org Received: (qmail 47200 invoked from network); 9 May 2008 17:35:24 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 9 May 2008 17:35:24 -0000 Received: (qmail 87786 invoked by uid 500); 9 May 2008 17:35:26 -0000 Delivered-To: apmail-cayenne-commits-archive@cayenne.apache.org Received: (qmail 87771 invoked by uid 500); 9 May 2008 17:35:26 -0000 Mailing-List: contact commits-help@cayenne.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cayenne.apache.org Delivered-To: mailing list commits@cayenne.apache.org Received: (qmail 87760 invoked by uid 99); 9 May 2008 17:35:26 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 May 2008 10:35:26 -0700 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; Fri, 09 May 2008 17:34:37 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 403C52388A35; Fri, 9 May 2008 10:34:52 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r654893 - /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java Date: Fri, 09 May 2008 17:34:52 -0000 To: commits@cayenne.apache.org From: aadamchik@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080509173452.403C52388A35@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Fri May 9 10:34:51 2008 New Revision: 654893 URL: http://svn.apache.org/viewvc?rev=654893&view=rev Log: handling Oracle boolean silliness Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java?rev=654893&r1=654892&r2=654893&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java Fri May 9 10:34:51 2008 @@ -21,7 +21,10 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.sql.CallableStatement; import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.sql.Types; import java.util.Collection; import java.util.Collections; @@ -37,6 +40,7 @@ import org.apache.cayenne.access.types.ByteType; import org.apache.cayenne.access.types.CharType; import org.apache.cayenne.access.types.DefaultType; +import org.apache.cayenne.access.types.ExtendedType; import org.apache.cayenne.access.types.ExtendedTypeMap; import org.apache.cayenne.access.types.ShortType; import org.apache.cayenne.dba.JdbcAdapter; @@ -48,6 +52,7 @@ import org.apache.cayenne.query.Query; import org.apache.cayenne.query.SQLAction; import org.apache.cayenne.query.UpdateBatchQuery; +import org.apache.cayenne.validation.ValidationResult; /** * DbAdapter implementation for Oracle RDBMS . Sample @@ -208,6 +213,8 @@ // Integer and Double map.registerType(new OracleIntegerType()); map.registerType(new OracleDoubleType()); + + map.registerType(new OracleBooleanType()); } /** @@ -232,6 +239,26 @@ + " CASCADE CONSTRAINTS"); } + @Override + public void bindParameter( + PreparedStatement statement, + Object object, + int pos, + int sqlType, + int scale) throws SQLException, Exception { + + // Oracle doesn't support BOOLEAN even when binding NULL, so have to intercept + // NULL Boolean here, as super doesn't pass it through ExtendedType... + if (object == null && sqlType == Types.BOOLEAN) { + ExtendedType typeProcessor = getExtendedTypes().getRegisteredType( + Boolean.class); + typeProcessor.setJdbcObject(statement, object, pos, sqlType, scale); + } + else { + super.bindParameter(statement, object, pos, sqlType, scale); + } + } + /** * Fixes some reverse engineering problems. Namely if a columns is created as DECIMAL * and has non-positive precision it is converted to INTEGER. @@ -352,4 +379,62 @@ } } } + + /** + * @since 3.0 + */ + final class OracleBooleanType implements ExtendedType { + + public String getClassName() { + return Boolean.class.getName(); + } + + /** + * @deprecated since 3.0 as validation should not be done at the DataNode level. + */ + public boolean validateProperty( + Object source, + String property, + Object value, + DbAttribute dbAttribute, + ValidationResult validationResult) { + return true; + } + + public void setJdbcObject( + PreparedStatement st, + Object val, + int pos, + int type, + int precision) throws Exception { + + // Oracle does not support Types.BOOLEAN, so we have to override user mapping + // unconditionally + if (val == null) { + st.setNull(pos, Types.INTEGER); + } + else { + boolean flag = Boolean.TRUE.equals(val); + st.setInt(pos, flag ? 1 : 0); + } + } + + public Object materializeObject(ResultSet rs, int index, int type) + throws Exception { + + // Oracle does not support Types.BOOLEAN, so we have to override user mapping + // unconditionally + int i = rs.getInt(index); + return (rs.wasNull()) ? null : i == 0 ? Boolean.FALSE : Boolean.TRUE; + } + + public Object materializeObject(CallableStatement st, int index, int type) + throws Exception { + + // Oracle does not support Types.BOOLEAN, so we have to override user mapping + // unconditionally + int i = st.getInt(index); + return (st.wasNull()) ? null : i == 0 ? Boolean.FALSE : Boolean.TRUE; + } + } }