package coreservlets.beans;

import java.sql.*;

/** Bean to scroll through an uncached ResultSet. As the data 
 *  is not cached, subsequent requests for additional table rows
 *  results in reexecution of the query. 
 *  <P>
 *  Taken from http://www.lmbrown.com/.
 *  &copy; 2004 Larry Brown; may be freely used or adapted 
 */

public class UncachedScrollableQueryBean extends ScrollableQueryBean {
  // Staring cursor position in result set from the last returned
  // block of rows.
  private int priorStartRow;
  
  private void setPriorStartRow(int row) {
    priorStartRow = row;
  }
  
  /** Execute the query and store the results in a
   *  ResultSet.
   */

  public ResultSet executeQuery(String query)
      throws SQLException {
    if (connection == null) {
      throw new SQLException("No connection available.");
    }
    statement = connection.createStatement();
    resultSet = statement.executeQuery(query);
    // Determine column names.
    if (columnNames == null) {
      ResultSetMetaData resultSetMetaData =
        resultSet.getMetaData();
      int columnCount = resultSetMetaData.getColumnCount();
      columnNames = new String[columnCount];
      for(int i=1; i<=columnCount; i++) {
        columnNames[i-1] =
          resultSetMetaData.getColumnName(i).trim();
      }
    }
    return(resultSet);
  }
  
  public void findStartRow(String scrollTo)
      throws SQLException {
    Integer value = (Integer)directions.get(scrollTo);
    int direction = FIRST_DIR;
    if (value != null) {
      direction = value.intValue();
    }
    int row = 1;
    switch(direction) {
      case FIRST_DIR: 
             resultSet.beforeFirst();
             break;
      case PREV_DIR:  
             row = priorStartRow - scrollSize;
             if (row < 1) {
               findStartRow("first");
             } else {
               resultSet.absolute(row);
             }
             break;
      case NEXT_DIR:  
             row = priorStartRow + scrollSize;
             resultSet.absolute(row);
System.out.println("Row id: " + resultSet.getRow() + " is after last: " + resultSet.isAfterLast());
             if (resultSet.isAfterLast() || 
               resultSet.isLast()) {
               if (priorStartRow < 1) {
                 findStartRow("first");
               } else {
                 resultSet.absolute(priorStartRow);
               }
             }
             break;
      case LAST_DIR:  
             System.out.println("Setting 'last'");
             resultSet.last();
             int size = resultSet.getRow();      
             row = (size-1)/scrollSize * scrollSize;
             System.out.println("Calculated row is: " + row);
             if (row < 1) {
               resultSet.beforeFirst();
             } else {
               resultSet.absolute(row);
             }
             break;
      default:    findStartRow("next");
    }
    setPriorStartRow(resultSet.getRow());
  }        
        
  public void close() {
    closeResultSet();
    closeStatement();
    closeConnection();
  }
}