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 dy...@apache.org on 2008/01/18 15:20:00 UTC

svn commit: r613169 - in /db/derby/code/trunk/java: drda/org/apache/derby/impl/drda/DRDAConnThread.java drda/org/apache/derby/impl/drda/DRDAStatement.java engine/org/apache/derby/iapi/jdbc/EngineResultSet.java

Author: dyre
Date: Fri Jan 18 06:19:59 2008
New Revision: 613169

URL: http://svn.apache.org/viewvc?rev=613169&view=rev
Log:
DERBY-3311: Client ResultSet.getHoldabilty will return incorrect value when the ResultSet is obtained from a procedure call
Patch contributed by Daniel John Debrunner
Patch file: derby_3311_diff.txt 

Modified:
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAStatement.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/EngineResultSet.java

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java?rev=613169&r1=613168&r2=613169&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAConnThread.java Fri Jan 18 06:19:59 2008
@@ -61,6 +61,7 @@
 import org.apache.derby.iapi.services.stream.HeaderPrintWriter;
 import org.apache.derby.iapi.tools.i18n.LocalizedResource;
 import org.apache.derby.iapi.jdbc.AuthenticationService;
+import org.apache.derby.iapi.jdbc.EngineResultSet;
 import org.apache.derby.impl.jdbc.EmbedSQLException;
 import org.apache.derby.impl.jdbc.Util;
 import org.apache.derby.jdbc.InternalDriver;
@@ -4127,7 +4128,7 @@
 		writer.createDssObject();
 		writer.startDdm(CodePoint.SQLCINRD);
 		if (sqlamLevel >= MGRLVL_7)
-			writeSQLDHROW (stmt);
+			writeSQLDHROW(((EngineResultSet) rs).getHoldability());
 
 		ResultSetMetaData rsmeta = rs.getMetaData();
 		int ncols = rsmeta.getColumnCount();
@@ -6250,7 +6251,7 @@
 		writeSQLCAGRP(e, getSqlCode(getExceptionSeverity(e)), 0, 0);
 
 		if (sqlamLevel >= MGRLVL_7)
-			writeSQLDHROW (stmt);
+			writeSQLDHROW(ps.getResultSetHoldability());
 
 		//SQLNUMROW
 		if (SanityManager.DEBUG) 
@@ -6460,9 +6461,15 @@
 
 
 
-	//pass PreparedStatement here so we can send correct holdability on the wire for jdk1.3 and higher
-	//For jdk1.3, we provide hold cursor support through reflection.
-	private void writeSQLDHROW (DRDAStatement stmt) throws DRDAProtocolException,SQLException
+
+    /**
+     * Holdability passed in as it can represent the holdability of
+     * the statement or a specific result set.
+     * @param holdability HOLD_CURSORS_OVER_COMMIT or CLOSE_CURSORS_AT_COMMIT
+     * @throws DRDAProtocolException
+     * @throws SQLException
+     */
+	private void writeSQLDHROW(int holdability) throws DRDAProtocolException,SQLException
 	{		
 		if (JVMInfo.JDK_ID < 2) //write null indicator for SQLDHROW because there is no holdability support prior to jdk1.3
 		{
@@ -6473,7 +6480,7 @@
 		writer.writeByte(0);		// SQLDHROW INDICATOR
 
 		//SQLDHOLD
-		writer.writeShort(stmt.getResultSetHoldability());
+		writer.writeShort(holdability);
 		
 		//SQLDRETURN
 		writer.writeShort(0);

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAStatement.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAStatement.java?rev=613169&r1=613168&r2=613169&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAStatement.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DRDAStatement.java Fri Jan 18 06:19:59 2008
@@ -43,6 +43,7 @@
 import org.apache.derby.iapi.jdbc.BrokeredPreparedStatement;
 import org.apache.derby.iapi.jdbc.EngineConnection;
 import org.apache.derby.iapi.jdbc.EnginePreparedStatement;
+import org.apache.derby.iapi.jdbc.EngineResultSet;
 import org.apache.derby.iapi.reference.JDBC30Translation;
 import org.apache.derby.iapi.sql.execute.ExecutionContext;
 import org.apache.derby.iapi.util.StringUtil;
@@ -408,38 +409,6 @@
 		currentDrdaRs.clearExtDtaObjects();
 	}
 
-	/**
-	 *
-	 *  get resultSetHoldability.
-	 * 
-	 * @return the resultSet holdability for the prepared statement
-	 *
-	 */
-	protected int getResultSetHoldability() throws SQLException
-	{
-		return getResultSetHoldability(getResultSet());
-	}
-	
-	/**
-	 *
-	 *  get resultSetHoldability.
-	 * 
-	 * @param rs ResultSet 
-	 * @return the resultSet holdability for the prepared statement
-	 *
-	 */
-	int getResultSetHoldability(ResultSet rs) throws SQLException
-	{
-		Statement rsstmt;
-
-		if (rs  != null)
-			rsstmt = rs.getStatement();
-		else
-			rsstmt = getPreparedStatement();
-        
-        return rsstmt.getResultSetHoldability();
-	}	
-
 	/*
 	 * Is lob object nullable
 	 * @param index - offset starting with 0
@@ -727,7 +696,7 @@
 			{
 				//For callable statement, get holdability of statement generating the result set
 				if(isCallable)
-					addResultSet(rs,getResultSetHoldability(rs));
+					addResultSet(rs, ((EngineResultSet) rs).getHoldability());
 				else
 					addResultSet(rs,withHoldCursor);
 				hasResultSet = true;

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/EngineResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/EngineResultSet.java?rev=613169&r1=613168&r2=613169&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/EngineResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/EngineResultSet.java Fri Jan 18 06:19:59 2008
@@ -57,4 +57,12 @@
      */
     public int getLength(int columnIndex) throws SQLException;
     
+    /**
+     * Fetch the holdability of this ResultSet which may be different
+     * from the holdability of its Statement.
+     * @return HOLD_CURSORS_OVER_COMMIT or CLOSE_CURSORS_AT_COMMIT
+     * @throws SQLException Error.
+     */
+    public int getHoldability() throws SQLException;
+    
 }