public boolean previousPage() throws SQLException {
      int pS;
      int mR;
      int rem;

      pS = getPageSize();
      mR = maxRowsreached;

      if (populatecallcount == 0){
         throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.nextpage").toString());
      }

      if( !callWithCon){
         if(resultSet.getType() == ResultSet.TYPE_FORWARD_ONLY){
            throw new SQLException (resBundle.handleGetObject("cachedrowsetimpl.fwdonly").toString());
         }
      }

      pagenotend = true;

      if(startPrev < startPos ){
         onFirstPage = true;
         return false;
      }

      if(onFirstPage){
         return false;
      }

      rem = mR % pS;

      if(rem == 0){
         maxRowsreached -= (2 * pS);
         if(callWithCon){
            crsReader.setStartPosition(startPrev);
            crsReader.readData((RowSetInternal)this);
            resultSet = null;
         }
         else {
            populate(resultSet,startPrev);
         }
         return true;
      }
      else
      {
         maxRowsreached -= (pS + rem);
         if(callWithCon){
            crsReader.setStartPosition(startPrev);
            crsReader.readData((RowSetInternal)this);
            resultSet = null;
         }
         else {
            populate(resultSet,startPrev);
         }
         return true;
      }
   }
Retrieves the data present in the page prior to the page from where it is
called.
@return boolean value true if it retrieves the previous page, flase if it
        is on the first page.
@throws SQLException if it is called before populate is called or ResultSet
        is of type <code>ResultSet.TYPE_FORWARD_ONLY</code> or if an error
        occurs.
src/main/java/org/replicadb/rowset/StreamingRowSetImpl.java