You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2008/03/10 10:04:14 UTC

svn commit: r635493 - in /harmony/enhanced/classlib/trunk/modules/sql/src: main/java/org/apache/harmony/sql/internal/rowset/ test/java/org/apache/harmony/sql/tests/internal/rowset/

Author: tonywu
Date: Mon Mar 10 02:04:01 2008
New Revision: 635493

URL: http://svn.apache.org/viewvc?rev=635493&view=rev
Log:
Apply patch for HARMONY-5588 ([classlib][sql] CachedRowSetImpl add paging support)

Added:
    harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java   (with props)
Modified:
    harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java
    harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetDeleteTest.java
    harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java
    harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetInsertTest.java
    harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java

Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java?rev=635493&r1=635492&r2=635493&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java Mon Mar 10 02:04:01 2008
@@ -83,7 +83,22 @@
     // the number of the rows in one "page"
     private int pageSize;
 
-    private int pageNumber = 1;
+    /**
+     * used for paging, record row index for next page in ResultSet, start from
+     * 1
+     */
+    private int nextPageRowIndex = -1;
+
+    /**
+     * used for paging, record row index for previous page in ResultSet, start
+     * from 1
+     */
+    private int previousPageRowIndex = -1;
+
+    /**
+     * cached ResultSet for paging in memory
+     */
+    private CachedRowSet cachedResultSet = null;
 
     private String tableName;
 
@@ -208,7 +223,7 @@
     public void acceptChanges(Connection con) throws SyncProviderException {
         if (isCursorOnInsert) {
             // rowset.11=Illegal operation on an insert row
-            throw new SyncProviderException(Messages.getString("rowset.11"));
+            throw new SyncProviderException(Messages.getString("rowset.11")); //$NON-NLS-1$
         }
 
         try {
@@ -217,13 +232,16 @@
             rowSetWriter.setConnection(con);
             int beforeWriteIndex = currentRowIndex;
             boolean isShowDeleted = getShowDeleted();
+            // writer use next navigate rowset, so must make all rows visible
             setShowDeleted(true);
 
             rowSetWriter.writeData(this);
 
+            // must reset curosr before reset showDeleted
             absolute(beforeWriteIndex);
             setShowDeleted(isShowDeleted);
 
+            // record to the next visible row index
             int index = getRow();
             if (index == 0) {
                 next();
@@ -258,6 +276,9 @@
                 }
             }
 
+            deletedRowCount = 0;
+
+            // move cursor
             if (index > rows.size()) {
                 afterLast();
             } else if (index <= 0) {
@@ -410,7 +431,7 @@
         output.currentRow = null;
         output.currentRowIndex = 0;
         output.insertRow = null;
-        output.pageNumber = 1;
+        output.nextPageRowIndex = -1;
         output.rememberedCursorPosition = 0;
         output.rows = new ArrayList<CachedRow>();
         output.sqlwarn = null;
@@ -432,7 +453,7 @@
     }
 
     public void execute(Connection conn) throws SQLException {
-        // ensure the getConnection can works!
+        // TODO ensure the getConnection can works!
         String localCommand = getCommand();
         if (localCommand == null || getParams() == null) {
             // TODO add error messages
@@ -447,6 +468,16 @@
         if (ps.execute()) {
             doPopulate(ps.getResultSet(), true);
         }
+
+        if (getPageSize() != 0) {
+            nextPageRowIndex = rows.size() + 1;
+            previousPageRowIndex = 0;
+            cachedResultSet = null;
+        } else {
+            previousPageRowIndex = -1;
+            nextPageRowIndex = -1;
+            cachedResultSet = null;
+        }
     }
 
     public int[] getKeyColumns() throws SQLException {
@@ -490,27 +521,102 @@
     }
 
     /**
-     * TODO refill the cachedrowset with pagesize, and the previous rowset was
-     * replaced
+     * TODO refactor paging
      */
     public boolean nextPage() throws SQLException {
-        pageNumber++;
+        if (rows == null || nextPageRowIndex == -1 || getPageSize() == 0) {
+            // TODO load message from resource file
+            throw new SQLException(
+                    "Using execute() method populate data before calling");
+        }
+
+        if (cachedResultSet == null) {
+            // TODO ensure the getConnection can works!
+            String localCommand = getCommand();
+            if (localCommand == null || getParams() == null) {
+                // TODO add error messages
+                throw new SQLException();
+            }
+
+            PreparedStatement ps = getConnection().prepareStatement(
+                    localCommand);
+            Object[] params = getParams();
+            for (int i = 0; i < params.length; i++) {
+                ps.setObject(i + 1, params[i]);
+            }
+            if (ps.execute()) {
+                ResultSet rs = ps.getResultSet();
+                int index = 1;
+                while (rs.next() && index < nextPageRowIndex - 1) {
+                    index++;
+                }
+
+                doPopulate(rs, true);
+
+                if (rows.size() == 0) {
+                    return false;
+                }
+                previousPageRowIndex = nextPageRowIndex - 1;
+                nextPageRowIndex += rows.size();
+                return true;
+
+            }
+            return false;
+
+        }
+
+        if (cachedResultSet.absolute(nextPageRowIndex)) {
+            cachedResultSet.previous();
+            doPopulate(cachedResultSet, true);
+
+            if (rows.size() == 0) {
+                return false;
+            }
+            previousPageRowIndex = nextPageRowIndex - 1;
+            nextPageRowIndex += rows.size();
+            return true;
+        }
         return false;
+
     }
 
     public void populate(ResultSet rs) throws SQLException {
         doPopulate(rs, false);
+        previousPageRowIndex = -1;
+        nextPageRowIndex = -1;
+        cachedResultSet = null;
     }
 
     public void populate(ResultSet rs, int startRow) throws SQLException {
+        if (rs == null) {
+            // TODO add error messages
+            throw new SQLException();
+        }
+
         if (startRow == 1) {
             rs.beforeFirst();
+            // TODO use next move
         } else if (startRow <= 0 || !rs.absolute(startRow - 1)) {
             // rowset.7=Not a valid cursor
             throw new SQLException(Messages.getString("rowset.7")); //$NON-NLS-1$
         }
 
-        doPopulate(rs, true);
+        // paging in memory
+        if (getPageSize() != 0) {
+            cachedResultSet = new CachedRowSetImpl();
+            cachedResultSet.setMaxRows(getMaxRows());
+            cachedResultSet.populate(rs, startRow);
+            doPopulate(cachedResultSet, true);
+
+            nextPageRowIndex = rows.size() + 1;
+            previousPageRowIndex = 0;
+
+        } else {
+            doPopulate(rs, true);
+            previousPageRowIndex = -1;
+            nextPageRowIndex = -1;
+            cachedResultSet = null;
+        }
     }
 
     private void doPopulate(ResultSet rs, boolean isPaging) throws SQLException {
@@ -596,8 +702,94 @@
     }
 
     public boolean previousPage() throws SQLException {
-        // TODO implement it
-        return false;
+        if (rows == null || previousPageRowIndex == -1 || getPageSize() == 0) {
+            // TODO load message from resource file
+            throw new SQLException(
+                    "Using execute() method populate data before calling");
+        }
+
+        if (previousPageRowIndex == 0) {
+            return false;
+        }
+
+        if (cachedResultSet == null) {
+            // TODO ensure the getConnection can works!
+            String localCommand = getCommand();
+            if (localCommand == null || getParams() == null) {
+                // TODO add error messages
+                throw new SQLException();
+            }
+
+            PreparedStatement ps = getConnection().prepareStatement(
+                    localCommand);
+            Object[] params = getParams();
+            for (int i = 0; i < params.length; i++)
+                ps.setObject(i + 1, params[i]);
+
+            if (ps.execute()) {
+                ResultSet rs = ps.getResultSet();
+                int startIndex = previousPageRowIndex - getPageSize() + 1;
+
+                if (startIndex <= 0) {
+                    startIndex = 1;
+                }
+
+                int index = 0;
+                while (index < startIndex - 1) {
+                    if (!rs.next()) {
+                        break;
+                    }
+                    index++;
+                }
+
+                int prePageSize = getPageSize();
+                if (prePageSize != 0
+                        && previousPageRowIndex - startIndex + 1 != prePageSize) {
+                    setPageSize(previousPageRowIndex - startIndex + 1);
+                }
+                doPopulate(rs, true);
+
+                setPageSize(prePageSize);
+
+                if (rows.size() == 0) {
+                    return false;
+                }
+                nextPageRowIndex = previousPageRowIndex + 1;
+                previousPageRowIndex = startIndex - 1;
+                return true;
+            }
+
+            return false;
+        }
+
+        int startIndex = previousPageRowIndex - getPageSize() + 1;
+
+        if (startIndex <= 0) {
+            startIndex = 1;
+        }
+
+        if (!cachedResultSet.absolute(startIndex)) {
+            return false;
+        }
+
+        cachedResultSet.previous();
+
+        int prePageSize = getPageSize();
+        if (prePageSize != 0
+                && previousPageRowIndex - startIndex + 1 != prePageSize) {
+            setPageSize(previousPageRowIndex - startIndex + 1);
+        }
+
+        doPopulate(cachedResultSet, true);
+
+        setPageSize(prePageSize);
+
+        if (rows.size() == 0) {
+            return false;
+        }
+        nextPageRowIndex = previousPageRowIndex + 1;
+        previousPageRowIndex = startIndex - 1;
+        return true;
     }
 
     public void release() throws SQLException {
@@ -620,6 +812,7 @@
         rows.removeAll(insertedRows);
         insertRow = null;
         isCursorOnInsert = false;
+        deletedRowCount = 0;
 
         first();
 
@@ -1191,7 +1384,7 @@
 
     public int getRow() throws SQLException {
         // FIXME need more tests
-        if (currentRow == null || rows == null) {
+        if (currentRow == null || rows == null || isCursorOnInsert) {
             return 0;
         }
 
@@ -1459,12 +1652,27 @@
     }
 
     public boolean relative(int moveRows) throws SQLException {
-        if (currentRow == null) {
-            // TODO add error message
-            throw new SQLException();
-        }
-
+        checkValidRow();
+        // TODO use more effective way to move cursor
         int index = getRow() + moveRows;
+
+        if (isCursorOnInsert || currentRow.isDelete()) {
+            if (moveRows > 0) {
+                if (next()) {
+                    index = getRow() + moveRows - 1;
+                } else {
+                    return false;
+                }
+            }
+
+            if (moveRows < 0) {
+                if (previous()) {
+                    index = getRow() + moveRows + 1;
+                } else {
+                    return false;
+                }
+            }
+        }
 
         if (index <= 0) {
             beforeFirst();

Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetDeleteTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetDeleteTest.java?rev=635493&r1=635492&r2=635493&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetDeleteTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetDeleteTest.java Mon Mar 10 02:04:01 2008
@@ -89,17 +89,17 @@
          */
         assertTrue(noInitialCrset.last());
         assertTrue(noInitialCrset.previous());
-        assertEquals(9, noInitialCrset.getInt(1));
+        assertEquals(8, noInitialCrset.getInt(1));
         noInitialCrset.deleteRow();
         assertTrue(noInitialCrset.last());
-        assertEquals(10, noInitialCrset.getInt(1));
+        assertEquals(9, noInitialCrset.getInt(1));
         noInitialCrset.acceptChanges(conn);
 
         if ("true".equals(System.getProperty("Testing Harmony"))) {
             // TODO RI move cursor incorrectly, we follow spec
             assertTrue(noInitialCrset.isLast());
 
-            assertEquals(10, noInitialCrset.getInt(1));
+            assertEquals(9, noInitialCrset.getInt(1));
             noInitialCrset.acceptChanges(conn);
         } else {
             assertTrue(noInitialCrset.isAfterLast());
@@ -513,6 +513,66 @@
             }
         }
         assertEquals(3, index);
+    }
+
+    public void testAbsolute() throws Exception {
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+        noInitialCrset.populate(rs);
+        assertFalse(noInitialCrset.getShowDeleted());
+
+        // delete the third row
+        assertTrue(noInitialCrset.absolute(3));
+        assertFalse(noInitialCrset.rowDeleted());
+        noInitialCrset.deleteRow();
+        assertTrue(noInitialCrset.rowDeleted());
+
+        assertTrue(noInitialCrset.previous());
+        assertTrue(noInitialCrset.previous());
+
+        assertEquals(1, noInitialCrset.getInt(1));
+
+        noInitialCrset.absolute(3);
+        assertEquals(4, noInitialCrset.getInt(1));
+    }
+
+    public void testRelative() throws Exception {
+        insertMoreData(10);
+        
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+        crset = newNoInitialInstance();
+        crset.populate(rs);
+        assertFalse(crset.getShowDeleted());
+
+        // delete row 6
+        assertTrue(crset.absolute(6));
+        assertFalse(crset.rowDeleted());
+        crset.deleteRow();
+        assertTrue(crset.rowDeleted());
+
+        // delete the third row
+        assertTrue(crset.absolute(3));
+        assertFalse(crset.rowDeleted());
+        assertEquals(3, crset.getInt(1));
+        crset.deleteRow();
+        assertTrue(crset.rowDeleted());
+
+        assertTrue(crset.relative(3));
+        assertEquals(7, crset.getInt(1));
+
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+        crset = newNoInitialInstance();
+        crset.populate(rs);
+        assertFalse(crset.getShowDeleted());
+
+        // delete the third row
+        assertTrue(crset.absolute(1));
+        assertEquals(1, crset.getInt(1));
+        assertFalse(crset.rowDeleted());
+        crset.deleteRow();
+        assertTrue(crset.rowDeleted());
+
+        assertFalse(crset.relative(-1));
+        assertTrue(crset.isBeforeFirst());
     }
 
     public void testShowDeleted_True() throws Exception {

Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java?rev=635493&r1=635492&r2=635493&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java Mon Mar 10 02:04:01 2008
@@ -900,6 +900,14 @@
 
         int i = 0;
 
+        /*
+         * TODO In RI there are before first page and after last page, according
+         * spec, there shouldn't be, Harmony follow spec
+         */
+        if ("true".equals(System.getProperty("Testing Harmony"))) {
+            i = 2;
+        }
+
         crset.beforeFirst();
         while (crset.nextPage()) {
             while (crset.next()) {
@@ -907,6 +915,14 @@
             }
         }
 
+        /*
+         * TODO In RI there are before first page and after last page, according
+         * spec, there shouldn't be, Harmony follow spec
+         */
+        if ("true".equals(System.getProperty("Testing Harmony"))) {
+            i = 2;
+        }
+
         while (crset.previousPage()) {
             crset.afterLast();
             while (crset.previous()) {
@@ -939,7 +955,7 @@
             cursorIndex++;
         }
         // setMaxRows no effect, we follow ri
-        assertEquals(20, cursorIndex);
+        assertEquals(19, cursorIndex);
 
         /*
          * The pageSize won't work when call method populate(ResultSet) without
@@ -967,7 +983,7 @@
          * CachedRowSet's pageSize is 5. However, the pageSize doesn't work in
          * RI. The CachedRowSet gets all the data from ResultSet. We follow ri.
          */
-        assertEquals(20, cursorIndex);
+        assertEquals(19, cursorIndex);
 
         noInitialCrset = newNoInitialInstance();
         rs = st.executeQuery("select * from USER_INFO");
@@ -981,7 +997,7 @@
         while (noInitialCrset.next()) {
             cursorIndex++;
         }
-        assertEquals(18, cursorIndex);
+        assertEquals(17, cursorIndex);
     }
 
     public void testPopulate_LResultSet_I() throws Exception {
@@ -997,6 +1013,15 @@
             // expected
         }
 
+        try {
+            noInitialCrset.populate(null, 1);
+            fail("Should throw SQLException");
+        } catch (SQLException e) {
+            // expected, we follow spec
+        } catch (NullPointerException e) {
+            // ri throw NullPointerException
+        }
+
         // create a scrollable and updatable ResultSet
         st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                 ResultSet.CONCUR_UPDATABLE);
@@ -1069,7 +1094,7 @@
                 assertEquals(cursorIndex, noInitialCrset.getInt(1));
             }
         }
-        assertEquals(20, cursorIndex);
+        assertEquals(19, cursorIndex);
 
         try {
             noInitialCrset.populate(crsetCopy, 0);

Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetInsertTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetInsertTest.java?rev=635493&r1=635492&r2=635493&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetInsertTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetInsertTest.java Mon Mar 10 02:04:01 2008
@@ -112,6 +112,9 @@
         noInitialCrset.populate(rs);
         assertTrue(noInitialCrset.absolute(3));
         noInitialCrset.moveToInsertRow();
+        
+        assertEquals(0, noInitialCrset.getRow());
+        
         try {
             // call insertRow() without call any update method
             noInitialCrset.insertRow();
@@ -123,7 +126,11 @@
         assertEquals(10, noInitialCrset.getInt(1));
         noInitialCrset.updateString(2, "insert10");
         assertEquals("insert10", noInitialCrset.getString(2));
+
+        assertEquals(0, noInitialCrset.getRow());
         noInitialCrset.insertRow();
+        assertEquals(0, noInitialCrset.getRow());
+        
         noInitialCrset.moveToCurrentRow();
         assertEquals(3, noInitialCrset.getInt(1));
     }

Added: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java?rev=635493&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java (added)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java Mon Mar 10 02:04:01 2008
@@ -0,0 +1,537 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.harmony.sql.tests.internal.rowset;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * TODO In RI, nextPage is similar next, first call nextPage move to first page,
+ * while in spec, first call nextPage should move to second page, Harmony follow
+ * spec.
+ * 
+ */
+public class CachedRowSetPagingTest extends CachedRowSetTestCase {
+
+    public void testPagingInMemory() throws Exception {
+        insertMoreData(10);
+        crset = newNoInitialInstance();
+
+        st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+                ResultSet.CONCUR_UPDATABLE);
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+
+        // the max rows load into memory
+        crset.setMaxRows(5);
+        crset.setPageSize(3);
+
+        crset.populate(rs, 1);
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        for (int i = 1; i <= 3; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertTrue(crset.nextPage());
+
+        crset.beforeFirst();
+
+        for (int i = 4; i <= 5; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        assertFalse(crset.nextPage());
+
+    }
+
+    public void testPagingInMemory2() throws Exception {
+        insertMoreData(4);
+
+        crset = newNoInitialInstance();
+
+        st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+                ResultSet.CONCUR_UPDATABLE);
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+
+        crset.setPageSize(3);
+
+        crset.populate(rs, 1);
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        for (int i = 1; i <= 3; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(2);
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        for (int i = 4; i <= 5; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(5);
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        for (int i = 6; i <= 8; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+        assertFalse(crset.nextPage());
+
+        assertTrue(crset.previousPage());
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need previousPage one more time
+            assertTrue(crset.previousPage());
+        }
+
+        assertTrue(crset.isBeforeFirst());
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        assertFalse(crset.previousPage());
+
+    }
+
+    public void testPagingInMemory3() throws Exception {
+        insertMoreData(10);
+
+        crset = newNoInitialInstance();
+
+        st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+                ResultSet.CONCUR_UPDATABLE);
+        rs = st.executeQuery("SELECT * FROM USER_INFO");
+
+        crset.setPageSize(4);
+
+        crset.populate(rs, 1);
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        for (int i = 1; i <= 4; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+        assertFalse(crset.previousPage());
+        assertFalse(crset.previousPage());
+
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+        for (int i = 5; i <= 8; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(3);
+        assertTrue(crset.previousPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        if ("true".equals(System.getProperty("Testing Harmony"))) {
+            for (int i = 2; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertTrue(crset.previousPage());
+
+            assertTrue(crset.isBeforeFirst());
+
+            assertTrue(crset.next());
+            assertEquals(1, crset.getInt(1));
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertFalse(crset.previousPage());
+            assertFalse(crset.previousPage());
+
+            assertTrue(crset.nextPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 2; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertTrue(crset.nextPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 5; i <= 7; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            crset.setPageSize(4);
+            assertEquals(4, crset.getPageSize());
+
+            assertTrue(crset.previousPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 1; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertFalse(crset.previousPage());
+            assertFalse(crset.previousPage());
+
+        } else {
+            // seems RI lost one row
+            assertTrue(crset.next());
+            assertEquals(1, crset.getInt(1));
+            assertTrue(crset.next());
+            assertEquals(2, crset.getInt(1));
+            assertTrue(crset.next());
+            assertEquals(3, crset.getInt(1));
+            assertFalse(crset.next());
+        }
+
+    }
+
+    public void testException() throws Exception {
+        insertMoreData(4);
+
+        crset = newNoInitialInstance();
+
+        try {
+            crset.nextPage();
+            fail("Should throw SQLException");
+        } catch (SQLException e) {
+            // expected, Populate data before calling
+        }
+
+        crset.setCommand("select * from USER_INFO");
+        crset.setUrl(DERBY_URL);
+
+        crset.setPageSize(0);
+        crset.execute();
+
+        try {
+            crset.nextPage();
+            fail("Should throw SQLException");
+        } catch (SQLException e) {
+            // expected, Populate data before calling
+        }
+    }
+
+    public void testTravel() throws Exception {
+        insertMoreData(4);
+
+        crset = newNoInitialInstance();
+
+        crset.setCommand("select * from USER_INFO");
+        crset.setUrl(DERBY_URL);
+
+        crset.setPageSize(3);
+        crset.execute();
+
+        assertEquals("select * from USER_INFO", crset.getCommand());
+
+        assertFalse(crset.previousPage());
+
+        for (int i = 1; i <= 3; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        int index = 4;
+        while (crset.nextPage()) {
+            while (crset.next()) {
+                assertEquals(index, crset.getInt(1));
+                index++;
+            }
+        }
+        assertEquals(9, index);
+
+        crset = newNoInitialInstance();
+        crset.setCommand("select * from USER_INFO");
+        crset.setUrl(DERBY_URL);
+
+        crset.setPageSize(3);
+        crset.execute();
+
+        assertTrue(crset.next());
+        assertEquals(1, crset.getInt(1));
+
+        assertTrue(crset.nextPage());
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        assertTrue(crset.next());
+
+        assertEquals(4, crset.getInt(1));
+
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.next());
+        assertEquals(7, crset.getInt(1));
+
+        assertFalse(crset.nextPage());
+
+    }
+
+    public void testTravel2() throws Exception {
+        insertMoreData(4);
+
+        crset = newNoInitialInstance();
+
+        crset.setCommand("select * from USER_INFO");
+        crset.setUrl(DERBY_URL);
+
+        crset.setPageSize(3);
+        crset.execute();
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        for (int i = 1; i <= 3; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(2);
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        for (int i = 4; i <= 5; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(5);
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        for (int i = 6; i <= 8; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+        assertFalse(crset.nextPage());
+
+        assertTrue(crset.previousPage());
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need previousPage one more time
+            assertTrue(crset.previousPage());
+        }
+
+        assertTrue(crset.isBeforeFirst());
+        for (int i = 1; i <= 5; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        assertFalse(crset.previousPage());
+
+    }
+
+    public void testTravel3() throws Exception {
+        insertMoreData(10);
+
+        crset = newNoInitialInstance();
+
+        crset.setCommand("select * from USER_INFO");
+        crset.setUrl(DERBY_URL);
+
+        crset.setPageSize(4);
+        crset.execute();
+
+        if (!"true".equals(System.getProperty("Testing Harmony"))) {
+            // RI need nextPage one more time
+            assertTrue(crset.nextPage());
+        }
+
+        for (int i = 1; i <= 4; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+        assertFalse(crset.previousPage());
+        assertFalse(crset.previousPage());
+
+        assertTrue(crset.nextPage());
+
+        assertTrue(crset.isBeforeFirst());
+        for (int i = 5; i <= 8; ++i) {
+            assertTrue(crset.next());
+            assertEquals(i, crset.getInt(1));
+        }
+
+        assertFalse(crset.next());
+        assertTrue(crset.isAfterLast());
+
+        crset.setPageSize(3);
+        assertTrue(crset.previousPage());
+
+        assertTrue(crset.isBeforeFirst());
+
+        if ("true".equals(System.getProperty("Testing Harmony"))) {
+            for (int i = 2; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertTrue(crset.previousPage());
+
+            assertTrue(crset.isBeforeFirst());
+
+            assertTrue(crset.next());
+            assertEquals(1, crset.getInt(1));
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertFalse(crset.previousPage());
+            assertFalse(crset.previousPage());
+
+            assertTrue(crset.nextPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 2; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertTrue(crset.nextPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 5; i <= 7; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            crset.setPageSize(4);
+            assertEquals(4, crset.getPageSize());
+
+            assertTrue(crset.previousPage());
+
+            assertTrue(crset.isBeforeFirst());
+            for (int i = 1; i <= 4; ++i) {
+                assertTrue(crset.next());
+                assertEquals(i, crset.getInt(1));
+            }
+
+            assertFalse(crset.next());
+            assertTrue(crset.isAfterLast());
+
+            assertFalse(crset.previousPage());
+            assertFalse(crset.previousPage());
+
+        } else {
+            // TODO seems RI lost one row
+            assertTrue(crset.next());
+            assertEquals(1, crset.getInt(1));
+            assertTrue(crset.next());
+            assertEquals(2, crset.getInt(1));
+            assertTrue(crset.next());
+            assertEquals(3, crset.getInt(1));
+            assertFalse(crset.next());
+        }
+
+    }
+}

Propchange: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetPagingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java?rev=635493&r1=635492&r2=635493&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java Mon Mar 10 02:04:01 2008
@@ -174,7 +174,7 @@
         PreparedStatement preStmt = conn.prepareStatement(insertSQL);
 
         // insert 15 rows
-        for (int i = DEFAULT_ROW_COUNT + 1; i <= DEFAULT_ROW_COUNT + rows + 1; i++) {
+        for (int i = DEFAULT_ROW_COUNT + 1; i < DEFAULT_ROW_COUNT + rows + 1; i++) {
             preStmt.setInt(1, i);
             preStmt.setString(2, "test" + i);
             preStmt.setLong(3, 444423L);