You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2005/01/21 19:14:40 UTC

svn commit: r125949 - incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc

Author: djd
Date: Fri Jan 21 10:14:39 2005
New Revision: 125949

URL: http://svn.apache.org/viewcvs?view=rev&rev=125949
Log:
Move BigDecimal methods and Blob/Clob methods into or out of JDBC 2.0
Prepared/CallableStatement implementation classes.
Refactor EmbedConnection20 in preparation for removing it.
See design attachment for Derby-97 for details

Modified:
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java
   incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement.java	Fri Jan 21 10:14:39 2005
@@ -30,7 +30,6 @@
 import org.apache.derby.iapi.reference.JDBC30Translation;
 import org.apache.derby.iapi.reference.SQLState;
 
-import java.math.BigDecimal;
 import java.sql.CallableStatement;
 import java.sql.SQLException;
 import java.sql.Date;
@@ -356,24 +355,6 @@
 			DataValueDescriptor param = getParms().getParameterForGet(parameterIndex-1);
 			double v = param.getDouble();
 			wasNull = (v == 0.0) && param.isNull();
-			return v;
-		} catch (StandardException e)
-		{
-			throw EmbedResultSet.noStateChangeException(e);
-		}
-
-	}
-
-    /**
-	 * @see CallableStatement#getBigDecimal
-     * @exception SQLException NoOutputParameters thrown.
-     */
-    public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException
-	{
-		checkStatus();
-		try {
-			BigDecimal v =  getParms().getParameterForGet(parameterIndex-1).getBigDecimal();
-			wasNull = (v == null);
 			return v;
 		} catch (StandardException e)
 		{

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedCallableStatement20.java	Fri Jan 21 10:14:39 2005
@@ -250,32 +250,6 @@
      /**
       * JDBC 2.0
       *
-      * Set a BLOB parameter.
-      *
-      * @param i the first parameter is 1, the second is 2, ...
-      * @param x an object representing a BLOB
-      * @exception SQLException Feature not implemented for now.
-      */
-     public void setBlob (int i, Blob x) throws SQLException {
- 		throw Util.notImplemented();
-	 }
- 
-     /**
-      * JDBC 2.0
-      *
-      * Set a CLOB parameter.
-      *
-      * @param i the first parameter is 1, the second is 2, ...
-      * @param x an object representing a CLOB
-      * @exception SQLException Feature not implemented for now.
-      */
-     public void setClob (int i, Clob x) throws SQLException {
- 		throw Util.notImplemented();
-	 }
- 
-     /**
-      * JDBC 2.0
-      *
       * Set an Array parameter.
       *
       * @param i the first parameter is 1, the second is 2, ...
@@ -1158,6 +1132,63 @@
     throws SQLException
 	{
 		throw Util.notImplemented();
+	}
+
+	/*
+	** Methods using BigDecimal, moved out of EmbedPreparedStatement
+	** to allow that class to support JSR169.
+	*/
+	/**
+     * Set a parameter to a java.lang.BigDecimal value.  
+     * The driver converts this to a SQL NUMERIC value when
+     * it sends it to the database.
+     *
+     * @param parameterIndex the first parameter is 1, the second is 2, ...
+     * @param x the parameter value
+	 * @exception SQLException thrown on failure.
+     */
+    public final void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
+		checkStatus();
+		try {
+			/* JDBC is one-based, DBMS is zero-based */
+			getParms().getParameterForSet(parameterIndex - 1).setValue(x);
+
+		} catch (Throwable t) {
+			throw EmbedResultSet.noStateChangeException(t);
+		}
+	}
+    /**
+	 * @see CallableStatement#getBigDecimal
+     * @exception SQLException NoOutputParameters thrown.
+     */
+    public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException
+	{
+		checkStatus();
+		try {
+			BigDecimal v =  getParms().getParameterForGet(parameterIndex-1).getBigDecimal();
+			wasNull = (v == null);
+			return v;
+		} catch (StandardException e)
+		{
+			throw EmbedResultSet.noStateChangeException(e);
+		}
+
+	}
+	/**
+		Allow explict setObject conversions by sub-classes for classes
+		not supported by this variant. In this case handle BigDecimal.
+		@return true if the object was set successfully, false if no valid
+		conversion exists.
+
+		@exception SQLException value could not be set.
+	*/
+	boolean setObjectConvert(int parameterIndex, Object x) throws SQLException
+	{
+		if (x instanceof BigDecimal) {
+			setBigDecimal(parameterIndex, (BigDecimal) x);
+			return true;
+		}
+		return false;
 	}
 }
 

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java	Fri Jan 21 10:14:39 2005
@@ -1199,6 +1199,39 @@
 		topWarning = null;
 	}
 
+ 	/////////////////////////////////////////////////////////////////////////
+	//
+	//	JDBC 2.0	-	New public methods
+	//
+	/////////////////////////////////////////////////////////////////////////
+
+    /**
+     *
+	 * Get the type-map object associated with this connection.
+	 * By default, the map returned is empty.
+	 * JDBC 2.0 - java.util.Map requires JDK 1
+     *
+     */
+    public final java.util.Map getTypeMap() {
+		// just return an immuntable empty map
+		return java.util.Collections.EMPTY_MAP;
+    }
+
+    /** 
+	 * Install a type-map object as the default type-map for
+	 * this connection.
+	 * JDBC 2.0 - java.util.Map requires JDK 1
+     *
+     * @exception SQLException Feature not implemented for now.
+	 */
+    public final void setTypeMap(java.util.Map map) throws SQLException {
+
+        if( map == null)
+            throw Util.generateCsSQLException(SQLState.INVALID_API_PARAMETER,map,"map",
+                                              "java.sql.Connection.setTypeMap");
+        if(!(map.isEmpty()))
+            throw Util.notImplemented();
+    }
 
 	/////////////////////////////////////////////////////////////////////////
 	//

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedConnection20.java	Fri Jan 21 10:14:39 2005
@@ -84,40 +84,6 @@
 		}
 	}
 
- 	/////////////////////////////////////////////////////////////////////////
-	//
-	//	JDBC 2.0	-	New public methods
-	//
-	/////////////////////////////////////////////////////////////////////////
-
-    /**
-     *
-	 * Get the type-map object associated with this connection.
-	 * By default, the map returned is empty.
-	 * JDBC 2.0 - java.util.Map requires JDK 1
-     *
-     */
-    public java.util.Map getTypeMap() {
-		// just return an empty map
-		return new java.util.Hashtable(0);
-    }
-
-    /** 
-	 * Install a type-map object as the default type-map for
-	 * this connection.
-	 * JDBC 2.0 - java.util.Map requires JDK 1
-     *
-     * @exception SQLException Feature not implemented for now.
-	 */
-    public void setTypeMap(java.util.Map map) throws SQLException {
-
-        if( map == null)
-            throw Util.generateCsSQLException(SQLState.INVALID_API_PARAMETER,map,"map",
-                                              "java.sql.Connection.setTypeMap");
-        if(!(map.isEmpty()))
-            throw Util.notImplemented();
-    }
-
 	/*
 	** methods to be overridden by subimplementations wishing to insert
 	** their classes into the mix.

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement.java	Fri Jan 21 10:14:39 2005
@@ -59,7 +59,6 @@
 import java.sql.Clob;
 import java.sql.Blob;
 
-import java.math.BigDecimal;
 import java.io.InputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
@@ -71,7 +70,10 @@
 /**
  *
  * EmbedPreparedStatement is a local JDBC statement.
- *
+  <P><B>Supports</B>
+   <UL>
+   <LI> JSR169
+   </UL>
  */
 public abstract class EmbedPreparedStatement
 	extends EmbedStatement
@@ -432,25 +434,6 @@
 	}
 
     /**
-     * Set a parameter to a java.lang.BigDecimal value.  
-     * The driver converts this to a SQL NUMERIC value when
-     * it sends it to the database.
-     *
-     * @param parameterIndex the first parameter is 1, the second is 2, ...
-     * @param x the parameter value
-	 * @exception SQLException thrown on failure.
-     */
-    public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
-		checkStatus();
-		try {
-			/* JDBC is one-based, DBMS is zero-based */
-			getParms().getParameterForSet(parameterIndex - 1).setValue(x);
-
-		} catch (Throwable t) {
-			throw EmbedResultSet.noStateChangeException(t);
-		}
-	}
-    /**
      * Set a parameter to a Java String value.  The driver converts this
      * to a SQL VARCHAR or LONGVARCHAR value (depending on the arguments
      * size relative to the driver's limits on VARCHARs) when it sends
@@ -967,10 +950,6 @@
 			return;
 		}
 
-		if (x instanceof BigDecimal) {
-			setBigDecimal(parameterIndex, (BigDecimal) x);
-			return;
-		}
 		if (x instanceof Boolean) {
 			setBoolean(parameterIndex, ((Boolean) x).booleanValue());
 			return;
@@ -1020,11 +999,29 @@
 			return;
 		}
 
+		if (setObjectConvert(parameterIndex, x))
+			return;
+
 		
 		throw dataTypeConversion(parameterIndex, x.getClass().getName());
 
 	}
 
+	/**
+		Allow explict setObject conversions by sub-classes for classes
+		not supported by this variant. E.g. BigDecimal
+		This top-level implementation always returns false.
+
+		@return true if the object was set successfully, false if no valid
+		conversion exists.
+
+		@exception SQLException value could not be set.
+	*/
+	boolean setObjectConvert(int parameterIndex, Object x) throws SQLException
+	{
+		return false;
+	}
+
     /**
      * @see java.sql.Statement#execute
 	 * @exception SQLException thrown on failure.
@@ -1095,6 +1092,61 @@
 			throw EmbedResultSet.noStateChangeException(t);
 		}
 	}
+
+
+    /**
+     * JDBC 2.0
+     *
+     * Set a BLOB parameter.
+     *
+     * @param i the first parameter is 1, the second is 2, ...
+     * @param x an object representing a BLOB
+     */
+    public void setBlob (int i, Blob x)
+        throws SQLException
+    {
+        int colType;
+        synchronized (getConnectionSynchronization())
+        {
+            colType = getParameterJDBCType(i);
+        }
+		// DB2: only allow setBlob on a BLOB column.
+		if (colType != Types.BLOB)
+            throw dataTypeConversion(i, "java.sql.Blob");
+
+		if (x == null)
+			setNull(i, Types.BLOB);
+		else
+			setBinaryStreamInternal(i, x.getBinaryStream(), -1);
+	}
+
+    /**
+     * JDBC 2.0
+     *
+     * Set a CLOB parameter.
+     *
+     * @param i the first parameter is 1, the second is 2, ...
+     * @param x an object representing a CLOB
+     */
+    public void setClob (int i, Clob x)
+        throws SQLException
+    {
+        int colType;
+        synchronized (getConnectionSynchronization())
+        {
+            colType = getParameterJDBCType(i);
+        }
+
+		// DB2, only allow setClob on a CLOB column.
+		if (colType != Types.CLOB)
+            throw dataTypeConversion(i, "java.sql.Clob");
+
+		if (x == null)
+			setNull(i, Types.CLOB);
+		else
+			setCharacterStreamInternal(i, x.getCharacterStream(), -1);
+	}
+
 	/**
 	 * Get the ParameterValueSet from the activation
 	 *

Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java
Url: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java?view=diff&rev=125949&p1=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java&r1=125948&p2=incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java&r2=125949
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java	(original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedPreparedStatement20.java	Fri Jan 21 10:14:39 2005
@@ -30,6 +30,8 @@
 
 import java.io.InputStream;
 
+import java.math.BigDecimal;
+
 import java.sql.SQLException;
 import java.sql.SQLWarning;
 import java.sql.Date;
@@ -47,7 +49,10 @@
 /**
  * This class extends the EmbedPreparedStatement class in order to support new
  * methods and classes that come with JDBC 2.0.
- *
+  <P><B>Supports</B>
+   <UL>
+   <LI> JDBC 2.0
+   </UL>
  *	@see org.apache.derby.impl.jdbc.EmbedPreparedStatement
  *
  *	@author francois
@@ -91,58 +96,7 @@
 		throw Util.notImplemented();
 	}
 
-    /**
-     * JDBC 2.0
-     *
-     * Set a BLOB parameter.
-     *
-     * @param i the first parameter is 1, the second is 2, ...
-     * @param x an object representing a BLOB
-     */
-    public void setBlob (int i, Blob x)
-        throws SQLException
-    {
-        int colType;
-        synchronized (getConnectionSynchronization())
-        {
-            colType = getParameterJDBCType(i);
-        }
-		// DB2: only allow setBlob on a BLOB column.
-		if (colType != Types.BLOB)
-            throw dataTypeConversion(i, "java.sql.Blob");
-
-		if (x == null)
-			setNull(i, Types.BLOB);
-		else
-			setBinaryStreamInternal(i, x.getBinaryStream(), -1);
-	}
 
-    /**
-     * JDBC 2.0
-     *
-     * Set a CLOB parameter.
-     *
-     * @param i the first parameter is 1, the second is 2, ...
-     * @param x an object representing a CLOB
-     */
-    public void setClob (int i, Clob x)
-        throws SQLException
-    {
-        int colType;
-        synchronized (getConnectionSynchronization())
-        {
-            colType = getParameterJDBCType(i);
-        }
-
-		// DB2, only allow setClob on a CLOB column.
-		if (colType != Types.CLOB)
-            throw dataTypeConversion(i, "java.sql.Clob");
-
-		if (x == null)
-			setNull(i, Types.CLOB);
-		else
-			setCharacterStreamInternal(i, x.getCharacterStream(), -1);
-	}
 
 
     /**
@@ -156,6 +110,47 @@
      */
     public void setArray (int i, Array x) throws SQLException {
 		throw Util.notImplemented();
+	}
+
+	/*
+	** Methods using BigDecimal, moved out of EmbedPreparedStatement
+	** to allow that class to support JSR169.
+	*/
+	/**
+     * Set a parameter to a java.lang.BigDecimal value.  
+     * The driver converts this to a SQL NUMERIC value when
+     * it sends it to the database.
+     *
+     * @param parameterIndex the first parameter is 1, the second is 2, ...
+     * @param x the parameter value
+	 * @exception SQLException thrown on failure.
+     */
+    public final void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
+		checkStatus();
+		try {
+			/* JDBC is one-based, DBMS is zero-based */
+			getParms().getParameterForSet(parameterIndex - 1).setValue(x);
+
+		} catch (Throwable t) {
+			throw EmbedResultSet.noStateChangeException(t);
+		}
+	}
+
+	/**
+		Allow explict setObject conversions by sub-classes for classes
+		not supported by this variant. In this case handle BigDecimal.
+		@return true if the object was set successfully, false if no valid
+		conversion exists.
+
+		@exception SQLException value could not be set.
+	*/
+	boolean setObjectConvert(int parameterIndex, Object x) throws SQLException
+	{
+		if (x instanceof BigDecimal) {
+			setBigDecimal(parameterIndex, (BigDecimal) x);
+			return true;
+		}
+		return false;
 	}
 }