protected boolean internalPrevious() throws SQLException {
        boolean ret = false;

        do {
            if (cursorPos > 1) {
                --cursorPos;
                ret = true;
            } else if (cursorPos == 1) {
                // decrement to before first
                --cursorPos;
                ret = false;
                break;
            }
        } while ((getShowDeleted() == false) && (rowDeleted() == true));

        /*
         * Each call to internalPrevious may move the cursor
         * over multiple rows, the absolute position moves one one row
         */
        if (ret == true)
            --absolutePos;
        else
            absolutePos = 0;

        return ret;
    }
Moves the cursor to the previous row in this <code>CachedRowSetImpl</code>
object, skipping past deleted rows that are not visible; returns
<code>true</code> if the cursor is on a row in this rowset and
<code>false</code> when the cursor goes before the first row.
<P>
This method is called internally by the method <code>previous</code>.
<P>
This is a implementation only method and is not required as a standard
implementation of the <code>CachedRowSet</code> interface.

@return <code>true</code> if the cursor is on a row in this rowset;
        <code>false</code> when the cursor reaches the position before
        the first row
@throws SQLException if an error occurs
src/main/java/org/replicadb/rowset/sun/rowset/CachedRowSetImpl.java