/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
 * indicated by the @author tags or express copyright attribution
 * statements applied by the authors.  All third-party contributions are
 * distributed under license by Red Hat Middleware LLC.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 *
 */
package org.hibernate;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Blob;
import java.sql.Clob;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.hibernate.type.Type;

/**
 * A result iterator that allows moving around within the results
 * by arbitrary increments. The <tt>Query</tt> / <tt>ScrollableResults</tt>
 * pattern is very similar to the JDBC <tt>PreparedStatement</tt>/
 * <tt>ResultSet</tt> pattern and the semantics of methods of this interface
 * are similar to the similarly named methods on <tt>ResultSet</tt>.<br>
 * <br>
 * Contrary to JDBC, columns of results are numbered from zero.
 *
 * @see Query#scroll()
 * @author Gavin King
 */
public interface ScrollableResults {
	/**
	 * Advance to the next result
	 * @return <tt>true</tt> if there is another result
	 */
	public boolean next() throws HibernateException;
	/**
	 * Retreat to the previous result
	 * @return <tt>true</tt> if there is a previous result
	 */
	public boolean previous() throws HibernateException;
	/**
	 * Scroll an arbitrary number of locations
	 * @param i a positive (forward) or negative (backward) number of rows
	 * @return <tt>true</tt> if there is a result at the new location
	 */
	public boolean scroll(int i) throws HibernateException;
	/**
	 * Go to the last result
	 * @return <tt>true</tt> if there are any results
	 */
	public boolean last() throws HibernateException;
	/**
	 * Go to the first result
	 * @return <tt>true</tt> if there are any results
	 */
	public boolean first() throws HibernateException;
	/**
	 * Go to a location just before first result (this is the initial location)
	 */
	public void beforeFirst() throws HibernateException;
	/**
	 * Go to a location just after the last result
	 */
	public void afterLast() throws HibernateException;
	/**
	 * Is this the first result?
	 *
	 * @return <tt>true</tt> if this is the first row of results
	 * @throws HibernateException
	 */
	public boolean isFirst() throws HibernateException;
	/**
	 * Is this the last result?
	 *
	 * @return <tt>true</tt> if this is the last row of results
	 * @throws HibernateException
	 */
	public boolean isLast() throws HibernateException;
	/**
	 * Release resources immediately.
	 */
	public void close() throws HibernateException;
	/**
	 * Get the current row of results
	 * @return an object or array
	 */
	public Object[] get() throws HibernateException;
	/**
	 * Get the <tt>i</tt>th object in the current row of results, without
	 * initializing any other results in the row. This method may be used
	 * safely, regardless of the type of the column (ie. even for scalar
	 * results).
	 * @param i the column, numbered from zero
	 * @return an object of any Hibernate type or <tt>null</tt>
	 */
	public Object get(int i) throws HibernateException;

	/**
	 * Get the type of the <tt>i</tt>th column of results
	 * @param i the column, numbered from zero
	 * @return the Hibernate type
	 */
	public Type getType(int i);

	/**
	 * Convenience method to read an <tt>integer</tt>
	 */
	public Integer getInteger(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>long</tt>
	 */
	public Long getLong(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>float</tt>
	 */
	public Float getFloat(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>boolean</tt>
	 */
	public Boolean getBoolean(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>double</tt>
	 */
	public Double getDouble(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>short</tt>
	 */
	public Short getShort(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>byte</tt>
	 */
	public Byte getByte(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>character</tt>
	 */
	public Character getCharacter(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>binary</tt>
	 */
	public byte[] getBinary(int col) throws HibernateException;
	/**
	 * Convenience method to read <tt>text</tt>
	 */
	public String getText(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>blob</tt>
	 */
	public Blob getBlob(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>clob</tt>
	 */
	public Clob getClob(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>string</tt>
	 */
	public String getString(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>big_decimal</tt>
	 */
	public BigDecimal getBigDecimal(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>big_integer</tt>
	 */
	public BigInteger getBigInteger(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>date</tt>, <tt>time</tt> or <tt>timestamp</tt>
	 */
	public Date getDate(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>locale</tt>
	 */
	public Locale getLocale(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>calendar</tt> or <tt>calendar_date</tt>
	 */
	public Calendar getCalendar(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>currency</tt>
	 */
	//public Currency getCurrency(int col) throws HibernateException;
	/**
	 * Convenience method to read a <tt>timezone</tt>
	 */
	public TimeZone getTimeZone(int col) throws HibernateException;
	/**
	 * Get the current location in the result set. The first
	 * row is number <tt>0</tt>, contrary to JDBC.
	 * @return the row number, numbered from <tt>0</tt>, or <tt>-1</tt> if
	 * there is no current row
	 */
	public int getRowNumber() throws HibernateException;
	/**
	 * Set the current location in the result set, numbered from either the
	 * first row (row number <tt>0</tt>), or the last row (row
	 * number <tt>-1</tt>).
	 * @param rowNumber the row number, numbered from the last row, in the
	 * case of a negative row number
	 * @return true if there is a row at that row number
	 */
	public boolean setRowNumber(int rowNumber) throws HibernateException;
}






