Author: arminw
Date: Fri Jun 16 14:32:22 2006
New Revision: 414927

URL: http://svn.apache.org/viewvc?rev=414927&view=rev
Log:
improve support for advanced jdbc data types (like JAVA_OBJECT)

Modified:
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/Platform.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/Platform.java
URL: 
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/Platform.java?rev=414927&r1=414926&r2=414927&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/Platform.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/Platform.java
 Fri Jun 16 14:32:22 2006
@@ -16,6 +16,7 @@
  */
 
 import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
 import org.apache.ojb.broker.query.LikeCriteria;
 
 import java.sql.CallableStatement;
@@ -96,6 +97,9 @@
     /**
      * Called to let the Platform implementation perform any JDBC 
type-specific operations
      * needed by the driver when binding positional parameters for a 
PreparedStatement.
+     * <br/>
+     * When read in result set columns, the counterpart of this method is
+     * [EMAIL PROTECTED] 
#postPrepareReadInValue(org.apache.ojb.broker.metadata.FieldDescriptor, 
Object)}.
      */
     void setObjectForStatement(PreparedStatement ps, int index, Object value, 
int sqlType)
             throws SQLException;
@@ -103,6 +107,9 @@
     /**
      * Called to let the Platform implementation perform any JDBC 
type-specific operations
      * needed by the driver when binding null parameters for a 
PreparedStatement.
+     * <br/>
+     * When read in result set columns, the counterpart of this method is
+     * [EMAIL PROTECTED] 
#postPrepareReadInValue(org.apache.ojb.broker.metadata.FieldDescriptor, 
Object)}.
      */
     void setNullForStatement(PreparedStatement ps, int index, int sqlType)
             throws SQLException;
@@ -112,6 +119,9 @@
      * needed by the driver when binding positional parameters for a 
PreparedStatement.
      * <br/>
      * Note: This method may be called only if the JDBC-type is unknown.
+     * <br/>
+     * When read in result set columns, the counterpart of this method is
+     * [EMAIL PROTECTED] 
#postPrepareReadInValue(org.apache.ojb.broker.metadata.FieldDescriptor, 
Object)}.
      *
      * @param ps The [EMAIL PROTECTED] java.sql.PreparedStatement} to use.
      * @param index The column index.
@@ -143,15 +153,6 @@
      */
     boolean supportsBatchOperations();
 
-// arminw: think we can handle this internally
-//    /**
-//     * Sets platform information for if the jdbc driver/db combo support
-//     * batch operations. Will only be checked once, then have same batch
-//     * support setting for the entire session.
-//     * @param conn
-//     */
-//    void checkForBatchSupport(Connection conn);
-
     /**
      * Returns a query to create a sequence entry.
      *
@@ -258,15 +259,6 @@
      */
     String getEscapeClause(LikeCriteria aCriteria);
 
-// arminw: Check is not necessary any longer
-//    /**
-//     * Determines whether statement is [EMAIL PROTECTED] CallableStatement} 
or not.
-//     *
-//     * @param stmt the statement
-//     * @return true if statement is [EMAIL PROTECTED] CallableStatement}.
-//     */
-//    boolean isCallableStatement(PreparedStatement stmt);
-
     /**
      * Registers call argument at <code>position</code> as returning
      * a [EMAIL PROTECTED] ResultSet} value.
@@ -291,4 +283,18 @@
      * details see JDBC-spec. 16.3).
      */
     public boolean locatorsUpdateCopy(Connection con);
+
+    /**
+     * Allows database specific post preparation of ResultSet read in column 
values,
+     * e.g. casting of types or wrapping/unwrapping of classes or 
deserialisation
+     * of objects. It's the counterpart of [EMAIL PROTECTED] 
#setObjectForStatement(java.sql.PreparedStatement, int, Object, int)}
+     * and [EMAIL PROTECTED] #setNullForStatement(java.sql.PreparedStatement, 
int, int)} methods.
+     * <br/>
+     * Note: This method is called before any
+     * [EMAIL PROTECTED] 
org.apache.ojb.broker.accesslayer.conversions.FieldConversion}
+     * could take place.
+     *
+     * @return The post prepared column value.
+     */
+    public Object postPrepareReadInValue(FieldDescriptor fld, Object value);
 }

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
URL: 
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java?rev=414927&r1=414926&r2=414927&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
 Fri Jun 16 14:32:22 2006
@@ -30,9 +30,8 @@
 
 import org.apache.ojb.broker.PersistenceBrokerException;
 import org.apache.ojb.broker.accesslayer.JoinSyntaxTypes;
-import org.apache.ojb.broker.lob.BlobHandle;
-import org.apache.ojb.broker.lob.ClobHandle;
 import org.apache.ojb.broker.lob.LobHandle;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
 import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
 import org.apache.ojb.broker.query.LikeCriteria;
 import org.apache.ojb.broker.util.SqlHelper;
@@ -670,5 +669,10 @@
 
         }
         return locatorsUpdateCopy.booleanValue();
+    }
+
+    public Object postPrepareReadInValue(final FieldDescriptor fld, final 
Object value)
+    {
+        return value;
     }
 }

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java
URL: 
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java?rev=414927&r1=414926&r2=414927&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformMySQLImpl.java
 Fri Jun 16 14:32:22 2006
@@ -24,6 +24,8 @@
 import java.sql.Types;
 
 import org.apache.ojb.broker.query.LikeCriteria;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
+import org.apache.commons.lang.SerializationUtils;
 
 /**
  * @version 1.0
@@ -34,10 +36,10 @@
 {
     private static final String LAST_INSERT = "SELECT LAST_INSERT_ID() FROM ";
     private static final String LIMIT = " LIMIT 1";
-    
+
     /*
-        * @see Platform#setObjectForStatement(PreparedStatement, int, Object, 
int)
-        */
+      * @see Platform#setObjectForStatement(PreparedStatement, int, Object, 
int)
+      */
     public void setObjectForStatement(PreparedStatement ps, int index, Object 
value, int sqlType) throws SQLException
     {
         switch (sqlType)
@@ -45,7 +47,6 @@
             case Types.BIT :
                 ps.setObject(index, value);
                 break;
-
             case Types.BLOB :
             case Types.LONGVARBINARY :
             case Types.VARBINARY :
@@ -54,14 +55,12 @@
                     byte buf[] = (byte[]) value;
                     ByteArrayInputStream inputStream = new 
ByteArrayInputStream(buf);
                     ps.setBinaryStream(index, inputStream, buf.length);
-                    break;
                 }
                 else
                 {
                     super.setObjectForStatement(ps, index, value, sqlType);
-                    break;
                 }
-
+                break;
             case Types.CLOB :
                 Reader reader = null;
                 int length = 0;
@@ -93,16 +92,38 @@
                     super.setObjectForStatement(ps, index, value, sqlType);
                 }
                 break;
-
+            case Types.JAVA_OBJECT :
+            {
+                // JAVA_OBJECT is not proper supported, workaround: use OTHER 
type
+                ps.setObject(index, value, Types.OTHER);
+                break;
+            }
             default :
                 super.setObjectForStatement(ps, index, value, sqlType);
 
         }
     }
+
+    public Object postPrepareReadInValue(final FieldDescriptor fld, final 
Object value)
+    {
+        /*
+        workaround for JAVA_OBJECT type. Currently mysql (version 5.0) doesn't
+        proper support JAVA_OBJECT type
+        */
+        if(fld.getJdbcType().getType() == Types.JAVA_OBJECT && value 
instanceof byte[])
+        {
+            return SerializationUtils.deserialize((byte[]) value);
+        }
+        else
+        {
+            return super.postPrepareReadInValue(fld, value);
+        }
+    }
+
     /**
-        * Get join syntax type for this RDBMS - one on of the constants from
-        * JoinSyntaxType interface
-        */
+     * Get join syntax type for this RDBMS - one on of the constants from
+     * JoinSyntaxType interface
+     */
     public byte getJoinSyntaxType()
     {
         return SQL92_NOPAREN_JOIN_SYNTAX;
@@ -142,9 +163,9 @@
         {
             return theColumns[0];
         }
-        
+
         StringBuffer buf = new StringBuffer();
-        
+
         buf.append("concat(");
         for (int i = 0; i < theColumns.length; i++)
         {
@@ -157,14 +178,14 @@
 
         buf.append(")");
         return buf.toString();
-    }    
-    
+    }
+
     /**
      * @see 
org.apache.ojb.broker.platforms.Platform#getEscapeClause(org.apache.ojb.broker.query.LikeCriteria)
      */
     public String getEscapeClause(LikeCriteria aCriteria)
     {
-        if (LikeCriteria.getEscapeCharacter() != 
LikeCriteria.DEFAULT_ESCPAPE_CHARACTER)  
+        if (LikeCriteria.getEscapeCharacter() != 
LikeCriteria.DEFAULT_ESCPAPE_CHARACTER)
         {
             // the default escape character is \, so there's no need for an 
escape clause
             return super.getEscapeClause(aCriteria);
@@ -174,12 +195,12 @@
             return "";
         }
     }
-    
+
     /**
      * @see 
org.apache.ojb.broker.platforms.PlatformDefaultImpl#getQuotedName(java.lang.String)
      */
     protected String getQuotedName(String aString)
     {
-        return '`' + aString + '`'; 
+        return '`' + aString + '`';
     }
 }

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java
URL: 
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java?rev=414927&r1=414926&r2=414927&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformSapdbImpl.java
 Fri Jun 16 14:32:22 2006
@@ -19,8 +19,11 @@
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.Properties;
+import java.io.Serializable;
 
 import org.apache.ojb.broker.util.sequence.SequenceManagerHelper;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
+import org.apache.commons.lang.SerializationUtils;
 
 /**
  * SapDB specific Platform implementation.
@@ -126,15 +129,36 @@
             int sqlType)
             throws SQLException
     {
-        if(((sqlType == Types.VARBINARY) || (sqlType == Types.LONGVARBINARY))
-                && (value instanceof byte[]))
+        switch (sqlType)
         {
-            byte buf[] = (byte[]) value;
-            ps.setBytes(index, buf);
+            case Types.VARBINARY:
+            case Types.LONGVARBINARY:
+                if(value instanceof byte[])
+                {
+                    byte buf[] = (byte[]) value;
+                    ps.setBytes(index, buf);
+                }
+                break;
+            case Types.JAVA_OBJECT:
+                // workaround for JAVA_OBJECT type.
+                Object ser = SerializationUtils.serialize((Serializable) 
value);
+                ps.setObject(index, ser);
+                break;
+            default:
+                super.setObjectForStatement(ps, index, value, sqlType);
+        }
+    }
+
+    public Object postPrepareReadInValue(final FieldDescriptor fld, final 
Object value)
+    {
+        // workaround for JAVA_OBJECT type.
+        if(fld.getJdbcType().getType() == Types.JAVA_OBJECT && value 
instanceof byte[])
+        {
+            return SerializationUtils.deserialize((byte[]) value);
         }
         else
         {
-            super.setObjectForStatement(ps, index, value, sqlType);
+            return super.postPrepareReadInValue(fld, value);
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to