/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_sdbc_XResultSet_idl__ 
#define __com_sun_star_sdbc_XResultSet_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_sdbc_SQLException_idl__ 
#include <com/sun/star/sdbc/SQLException.idl> 
#endif 
 
 module com {  module sun {  module star {  module sdbc { 
 
 published interface XStatement; 
 
 
/** provides the navigation on a table of data.  A 
	<type scope="com::sun::star::sdbc">ResultSet</type>
	object is usually generated by executing a 
	<type scope="com::sun::star::sdbc">Statement</type>
	.
	
	
	<p>
	A ResultSet maintains a cursor pointing to its current row of
	data. Initially the cursor is positioned before the first row.
	The 'next' method moves the cursor to the next row.
	</p>
 */
published interface XResultSet: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** moves the cursor down one row from its current position.
		
		
		<p>
		A ResultSet cursor is initially positioned before the first row; the
		first call to next makes the first row the current row; the
		second call makes the second row the current row, and so on.
		</p>
		<p>If an input stream is open for the current row, a call
		to the method 
		<code>next</code>
		will implicitly close it.
		The ResultSet's warning chain is cleared when a new row is read.
		</p>
		@returns
		 <TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean next() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** indicates whether the cursor is before the first row in the result
		set.
		@returns
		 <TRUE/> if so
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean isBeforeFirst() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** indicates whether the cursor is after the last row in the result
		set.
		@returns
		 <TRUE/> if so
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean isAfterLast() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** indicates whether the cursor is on the first row of the result set.
		@returns
		 <TRUE/> if so
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean isFirst() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** indicates whether the cursor is on the last row of the result set.
		
		
		<p>
		<B>
		Note:
		</B>
		Calling the method 
		<code>isAtLast</code>
		may be expensive because the SDBC driver might need to fetch ahead one row in order
		to determine whether the current row is the last row in the result set.
		</p>
		@returns
		 <TRUE/> if so
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean isLast() raises (SQLException); 
    //------------------------------------------------------------------------- 
     
	/** moves the cursor to the front of the result set, just before the
		first row. Has no effect if the result set contains no rows.
		@throws SQLException 
			if a database access error occurs.
	 */
	void beforeFirst() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor to the end of the result set, just after the last
		row. Has no effect if the result set contains no rows.
		@throws SQLException 
			if a database access error occurs.
	 */
	void afterLast() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor to the first row in the result set.
		@returns
		 <TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean first() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor to the last row in the result set.
		@returns
		 <TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean last() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** retrieves the current row number. The first row is number 1, the
		second number 2, and so on.
		@returns
		 the current position
		@throws SQLException 
			if a database access error occurs.
	 */
	long getRow() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor to the given row number in the result set.
		
		
		<p>
		If the row number is positive, the cursor moves to
		the given row number with respect to the
		beginning of the result set. The first row is row 1, the second
		is row 2, and so on.
		</p>
		<p>
		If the given row number is negative, the cursor moves to
		an absolute row position with respect to
		the end of the result set. For example, calling
		<code>absolute(-1)</code>
		positions the
		cursor on the last row, 
		<code>absolute(-2)</code>
		indicates the next-to-last row, and so on.
		</p>
		<p>
		An attempt to position the cursor beyond the first/last row in
		the result set leaves the cursor before/after the first/last
		row, respectively.
		</p>
		<p>
		Note: Calling 
		<code>absolute(1)</code>
		is the same
		as calling 
		<member scope="com::sun::star::sdbc">XResultSet::first()</member>
		.
		Calling <code>moveToPosition(-1)</code> is the same as calling
		<code>moveToLast()</code>.
		</p>
	 */
	boolean absolute([in] long row ) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor a relative number of rows, either positive or negative.
		
		
		<p>
		Attempting to move beyond the first/last row in the result set
		positions the cursor before/after 
		the first/last row. Calling 
		<code>relative(0)</code>
		is valid, but does not change the cursor position.
		</p>
		<p>
		Note: Calling 
		<code>relative(1)</code>
		is different from calling 
		<member scope="com::sun::star::sdbc">XResultSet::next()</member>
		because is makes sense to call 
		<code>next()</code>
		when there is no current row, for example, when the cursor is positioned before
		the first row or after the last row of the result set.
		</p>
		@param rows
			how many rows should be moved relative to the current row
		@returns
		 <TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean relative([in]long rows) raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** moves the cursor to the previous row in the result set.
		
		
		<p>
		Note: 
		<code>previous()</code>
		is not the same as
		<code>relative(-1)</code>
		because it makes sense to call 
		<code>previous()</code>
		when there is no current row.
		</p>
		@returns
			<TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean previous() raises (SQLException); 
    //------------------------------------------------------------------------- 
	 
	/** refreshes the current row with its most recent value in
		the database. Cannot be called when on the insert row.
		The 
		<code>refreshRow</code>
		method provides a way for an application to
		explicitly tell the SDBC driver to refetch a row(s) from the
		database. An application may want to call 
		<code>refreshRow</code>
		when caching or prefetching is being done by the SDBC driver to
		fetch the latest value of a row from the database. The SDBC driver
		may actually refresh multiple rows at once if the fetch size is
		greater than one.
		All values are refetched subject to the transaction isolation
		level and cursor sensitivity. If 
		<code>refreshRow</code>
		is called after calling 
		<code>updateXXX</code>
		, but before calling 
		<member scope="com::sun::star::sdbc">XResultSet::updateRow()</member>
		, then the updates made to the row are lost.
		Calling the method 
		<code>refreshRow</code>
		frequently will likely slow performance.
		@throws SQLException 
			if a database access error occurs.
	 */
	void refreshRow() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** indicates whether the current row has been updated. The value returned
		depends on whether or not the result set can detect updates.
		@returns
			<TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean rowUpdated() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** indicates whether the current row has had an insertion.  The value returned
		depends on whether or not the result set can detect visible inserts.
		@returns
			<TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean rowInserted() raises (SQLException); 
    //------------------------------------------------------------------------- 
	 
	/** indicates whether a row has been deleted.  A deleted row may leave
		a visible "hole" in a result set.  This method can be used to
		detect holes in a result set.  The value returned depends on whether
		or not the result set can detect deletions.
		@returns
			<TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean rowDeleted() raises (SQLException); 
	//------------------------------------------------------------------------- 
	 
	/** returns the Statement that produced this 
		<type scope="com::sun::star::sdbc">ResultSet</type>
		object. If the result set was generated some other way, such as by an
		<type scope="com::sun::star::sdbc">XDatabaseMetaData</type>
		method, this method returns 
		<NULL/>
		.
		@returns
			the statement object
		@throws SQLException 
			if a database access error occurs.
	 */
	com::sun::star::uno::XInterface getStatement() raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
