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 ka...@apache.org on 2006/03/03 08:52:29 UTC
svn commit: r382710 - in /db/derby/code/trunk/java:
client/org/apache/derby/client/am/ client/org/apache/derby/client/net/
engine/org/apache/derby/impl/jdbc/
testing/org/apache/derbyTesting/functionTests/tests/jdbc4/
Author: kahatlen
Date: Thu Mar 2 23:52:28 2006
New Revision: 382710
URL: http://svn.apache.org/viewcvs?rev=382710&view=rev
Log:
DERBY-948: Miscellaneous ResultSet methods added by JDBC 4
Implemented new methods defined by the JDBC 4 spec:
* ResultSet.getHoldability()
* ResultSet.isClosed()
Modified:
db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestResultSetMethods.java
Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java?rev=382710&r1=382709&r2=382710&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java Thu Mar 2 23:52:28 2006
@@ -5243,4 +5243,49 @@
"JDBC 3 method called - not yet supported").getSQLException();
}
+ // -------------------------- JDBC 4.0 --------------------------
+
+ /**
+ * Retrieves the holdability for this <code>ResultSet</code>
+ * object.
+ *
+ * @return either <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code>
+ * or <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>
+ * @exception SQLException if a database error occurs
+ */
+ public final int getHoldability() throws SQLException {
+ if (agent_.loggingEnabled()) {
+ agent_.logWriter_.traceEntry(this, "getHoldability");
+ }
+ try {
+ checkForClosedResultSet();
+ } catch (SqlException se) {
+ throw se.getSQLException();
+ }
+ if (agent_.loggingEnabled()) {
+ agent_.logWriter_.traceExit(this, "getHoldability",
+ resultSetHoldability_);
+ }
+ return resultSetHoldability_;
+ }
+
+ /**
+ * Checks whether this <code>ResultSet</code> object has been
+ * closed, either automatically or because <code>close()</code>
+ * has been called.
+ *
+ * @return <code>true</code> if the <code>ResultSet</code> is
+ * closed, <code>false</code> otherwise
+ * @exception SQLException if a database error occurs
+ */
+ public final boolean isClosed() throws SQLException {
+ if (agent_.loggingEnabled()) {
+ agent_.logWriter_.traceEntry(this, "isClosed");
+ }
+ final boolean isClosed = !openOnClient_;
+ if (agent_.loggingEnabled()) {
+ agent_.logWriter_.traceExit(this, "isClosed", isClosed);
+ }
+ return isClosed;
+ }
}
Modified: db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java?rev=382710&r1=382709&r2=382710&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java Thu Mar 2 23:52:28 2006
@@ -65,14 +65,6 @@
throw SQLExceptionFactory.notImplemented ("updateRowId (String, RowId)");
}
- public int getHoldability() throws SQLException {
- throw SQLExceptionFactory.notImplemented ("getHoldability ()");
- }
-
- public boolean isClosed() throws SQLException {
- throw SQLExceptionFactory.notImplemented ("isClosed ()");
- }
-
public void updateNString(int columnIndex, String nString) throws SQLException {
throw SQLExceptionFactory.notImplemented ("updateNString (int, String)");
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java?rev=382710&r1=382709&r2=382710&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet40.java Thu Mar 2 23:52:28 2006
@@ -25,7 +25,11 @@
import java.sql.SQLException;
import java.sql.SQLXML;
import org.apache.derby.iapi.sql.ResultSet;
+import java.sql.Statement;
+/**
+ * Implementation of JDBC 4 specific ResultSet methods.
+ */
public class EmbedResultSet40 extends org.apache.derby.impl.jdbc.EmbedResultSet20{
/** Creates a new instance of EmbedResultSet40 */
@@ -56,12 +60,40 @@
throw Util.notImplemented();
}
- public int getHoldability() throws SQLException {
- throw Util.notImplemented();
- }
-
- public boolean isClosed() throws SQLException {
- throw Util.notImplemented();
+ /**
+ * Retrieves the holdability for this <code>ResultSet</code>
+ * object.
+ *
+ * @return either <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code>
+ * or <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>
+ * @exception SQLException if a database error occurs
+ */
+ public final int getHoldability() throws SQLException {
+ checkIfClosed("getHoldability");
+ Statement statement = getStatement();
+ if (statement == null) {
+ // If statement is null, the result set is an internal
+ // result set created by getNewRowSet() or getOldRowSet()
+ // in InternalTriggerExecutionContext. These result sets
+ // are not exposed to the JDBC applications. Returning
+ // CLOSE_CURSORS_AT_COMMIT since the result set will be
+ // closed when the trigger has finished.
+ return CLOSE_CURSORS_AT_COMMIT;
+ }
+ return statement.getResultSetHoldability();
+ }
+
+ /**
+ * Checks whether this <code>ResultSet</code> object has been
+ * closed, either automatically or because <code>close()</code>
+ * has been called.
+ *
+ * @return <code>true</code> if the <code>ResultSet</code> is
+ * closed, <code>false</code> otherwise
+ * @exception SQLException if a database error occurs
+ */
+ public final boolean isClosed() throws SQLException {
+ return isClosed;
}
public void updateNString(int columnIndex, String nString) throws SQLException {
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestResultSetMethods.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestResultSetMethods.java?rev=382710&r1=382709&r2=382710&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestResultSetMethods.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestResultSetMethods.java Thu Mar 2 23:52:28 2006
@@ -25,9 +25,11 @@
import java.io.Reader;
import java.io.InputStream;
import java.sql.Connection;
+import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
import org.apache.derby.shared.common.reference.SQLState;
/**
@@ -40,6 +42,19 @@
PreparedStatement ps=null;
ResultSet rs=null;
+ /**
+ * Checks that a <code>boolean</code> value is
+ * <code>true</code>. Throws an exception if it is false.
+ *
+ * @param expr boolean expected to be true
+ * @param msg message when assertion fails
+ * @exception RuntimeException if <code>expr</code> is false
+ */
+ private static void assert_(boolean expr, String msg) {
+ if (!expr) {
+ throw new RuntimeException("Assertion failed: " + msg);
+ }
+ }
void t_getRowId1() {
try {
@@ -100,13 +115,40 @@
}
}
+ /**
+ * Tests that <code>ResultSet.getHoldability()</code> has the
+ * correct behaviour.
+ */
void t_getHoldability() {
try {
- int i = rs.getHoldability();
- System.out.println("unImplemented Exception not thrown in code");
- } catch(SQLException e) {
- if(SQLState.NOT_IMPLEMENTED.equals (e.getSQLState())) {
- System.out.println("Unexpected SQLException"+e);
+ // test default holdability
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("values(1)");
+ assert_(rs.getHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT,
+ "default holdability is HOLD_CURSORS_OVER_COMMIT");
+ rs.close();
+ try {
+ rs.getHoldability();
+ assert_(false, "getHoldability() should fail when closed");
+ } catch (SQLException sqle) {
+ String sqlState = sqle.getSQLState();
+ // client driver throws exception with SQL state null
+ // when result set is closed
+ if (sqlState != null &&
+ !sqlState.equals("XCL16")) {
+ throw sqle;
+ }
+ }
+ stmt.close();
+ // test explicitly set holdability
+ for (int h : new int[] { ResultSet.HOLD_CURSORS_OVER_COMMIT,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT }) {
+ stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, h);
+ rs = stmt.executeQuery("values(1)");
+ assert_(rs.getHoldability() == h, "holdability " + h);
+ rs.close();
+ stmt.close();
}
} catch(Exception e) {
@@ -115,14 +157,59 @@
}
}
+ /**
+ * Tests that <code>ResultSet.isClosed()</code> returns the
+ * correct value in different situations.
+ */
void t_isClosed(){
try {
- boolean b = rs.isClosed();
- System.out.println("unImplemented Exception not thrown in code");
- } catch(SQLException e) {
- if(SQLState.NOT_IMPLEMENTED.equals (e.getSQLState())) {
- System.out.println("Unexpected SQLException"+e);
- }
+ Statement stmt = conn.createStatement();
+
+ // simple open/read/close test
+ ResultSet rs = stmt.executeQuery("values(1)");
+ assert_(!rs.isClosed(), "rs should be open");
+ while (rs.next());
+ assert_(!rs.isClosed(), "rs should be open");
+ rs.close();
+ assert_(rs.isClosed(), "rs should be closed");
+
+ // execute and re-execute statement
+ rs = stmt.executeQuery("values(1)");
+ assert_(!rs.isClosed(), "rs should be open");
+ ResultSet rs2 = stmt.executeQuery("values(1)");
+ assert_(rs.isClosed(), "rs should be closed");
+ assert_(!rs2.isClosed(), "rs2 should be open");
+
+ // re-execute another statement on the same connection
+ Statement stmt2 = conn.createStatement();
+ rs = stmt2.executeQuery("values(1)");
+ assert_(!rs2.isClosed(), "rs2 should be open");
+ assert_(!rs.isClosed(), "rs should be open");
+
+ // retrieve multiple result sets
+ stmt.execute("create procedure retrieve_result_sets() " +
+ "parameter style java language java external name " +
+ "'org.apache.derbyTesting.functionTests.tests." +
+ "jdbc4.TestResultSetMethods.threeResultSets' " +
+ "dynamic result sets 3 reads sql data");
+ stmt.execute("call retrieve_result_sets()");
+ ResultSet[] rss = new ResultSet[3];
+ int count = 0;
+ do {
+ rss[count] = stmt.getResultSet();
+ assert_(!rss[count].isClosed(),
+ "rss[" + count + "] should be open");
+ if (count > 0) {
+ assert_(rss[count-1].isClosed(),
+ "rss[" + (count-1) + "] should be closed");
+ }
+ ++count;
+ } while (stmt.getMoreResults());
+ assert_(count == 3, "expected three result sets");
+ stmt.execute("drop procedure retrieve_result_sets");
+
+ stmt.close();
+ stmt2.close();
} catch(Exception e) {
System.out.println("Unexpected exception caught"+e);
@@ -286,6 +373,29 @@
t_updateSQLXML2();
}
+ /**
+ * Method that is invoked by <code>t_isClosed()</code> (as a
+ * stored procedure) to retrieve three result sets.
+ *
+ * @param rs1 first result set
+ * @param rs2 second result set
+ * @param rs3 third result set
+ * @exception SQLException if a database error occurs
+ */
+ public static void threeResultSets(ResultSet[] rs1,
+ ResultSet[] rs2,
+ ResultSet[] rs3)
+ throws SQLException
+ {
+ Connection c = DriverManager.getConnection("jdbc:default:connection");
+ Statement stmt1 = c.createStatement();
+ rs1[0] = stmt1.executeQuery("values(1)");
+ Statement stmt2 = c.createStatement();
+ rs2[0] = stmt2.executeQuery("values(1)");
+ Statement stmt3 = c.createStatement();
+ rs3[0] = stmt3.executeQuery("values(1)");
+ c.close();
+ }
public static void main(String args[]) {
TestConnection tc=null;