/*
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

/*
 * @(#)RowSet.java	1.6 03/10/21
 */

package javax.sql;

import java.io.*;
import java.math.*;
import java.sql.*;
import java.util.*;

/**
 * The interface that adds support to the JDBC API for the JavaBeans<sup><font size=-2>TM</font></sup> component model. A rowset, which can be used as a JavaBeans component in a visual Bean development environment, can be created and configured at design time and executed at run time.   <P> The <code>RowSet</code> interface provides a set of JavaBeans properties that allow a <code>RowSet</code> instance to be configured to connect to a JDBC data source and read some data from the data source.  A group of setter methods (<code>setInt</code>, <code>setBytes</code>, <code>setString</code>, and so on) provide a way to pass input parameters to a rowset's command property. This command is the SQL query the rowset uses when it gets its data from a relational database, which is generally the case. <P> The <code>RowSet</code> interface supports JavaBeans events, allowing other components in an application to be notified when an event occurs on a rowset, such as a change in its value. <P>The <code>RowSet</code> interface is unique in that it is intended to be implemented using the rest of the JDBC API.  In other words, a <code>RowSet</code> implementation is a layer of software that executes "on top" of a JDBC driver.  Implementations of the <code>RowSet</code> interface can be provided by anyone, including JDBC driver vendors who want to provide a <code>RowSet</code> implementation as part of their JDBC products.  <P> A <code>RowSet</code> object may make a connection with a data source and maintain that connection throughout its life cycle, in which case it is called a <i>connected</i> rowset.  A rowset may also make a connection with a data source, get data from it, and then close the connection. Such a rowset is called a <i>disconnected</i> rowset.  A disconnected rowset may make changes to its data while it is disconnected and then send the changes back to the original source of the data, but it must reestablish a connection to do so. <P> A disconnected rowset may have a reader (a <code>RowSetReader</code> object) and a writer (a <code>RowSetWriter</code> object) associated with it. The reader may be implemented in many different ways to populate a rowset with data, including getting data from a non-relational data source. The writer can also be implemented in many different ways to propagate changes made to the rowset's data back to the underlying data source. <P> Rowsets are easy to use.  The <code>RowSet</code> interface extends the standard <code>java.sql.ResultSet</code> interface.  The <code>RowSetMetaData</code> interface extends the <code>java.sql.ResultSetMetaData</code> interface. Thus, developers familiar with the JDBC API will have to learn a minimal number of new APIs to use rowsets.  In addition, third-party software tools that work with JDBC <code>ResultSet</code> objects will also easily be made to work with rowsets.
 * @since  1.4
 */

public interface RowSet extends ResultSet {
  
  //-----------------------------------------------------------------------
  // Properties 
  //-----------------------------------------------------------------------

  //-----------------------------------------------------------------------
  // The following properties may be used to create a Connection.
  //-----------------------------------------------------------------------

  /**
 * Retrieves the logical name that identifies the data source for this <code>RowSet</code> object.  Users should set either the url property or the data source name property.  The rowset will use the property that was set more recently to get a connection.
 * @return  a data source name
 * @see  #setDataSourceName
 * @uml.property  name="dataSourceName"
 */
  String getDataSourceName();

  /**
 * Sets the data source name property for this <code>RowSet</code> object to the  given <code>String</code>. <P> The value of the data source name property can be used to do a lookup of a <code>DataSource</code> object that has been registered with a naming service.  After being retrieved, the <code>DataSource</code> object can be used to create a connection to the data source that it represents.
 * @param name  the logical name of the data source for this <code>RowSet</code>  object
 * @exception SQLException  if a database access error occurs
 * @see  #getDataSourceName
 * @uml.property  name="dataSourceName"
 */
  void setDataSourceName(String name) throws SQLException;

  /**
 * Retrieves the username used to create a database connection for this <code>RowSet</code> object.   The username property is set at run time before calling the method  <code>execute</code>.  It is  not usually part of the serialized state of a <code>RowSet</code> object.
 * @return  the username property
 * @see  #setUsername
 * @uml.property  name="username"
 */
  String getUsername();

  /**
 * Sets the username property for this <code>RowSet</code> object to the  given <code>String</code>.
 * @param name  a user name
 * @exception SQLException  if a database access error occurs
 * @see  #getUsername
 * @uml.property  name="username"
 */
  void setUsername(String name) throws SQLException;

  /**
 * Retrieves the password used to create a database connection.  The password property is set at run time before calling the method <code>execute</code>.  It is not usually part of the serialized state  of a <code>RowSet</code> object.
 * @return  the password for making a database connection
 * @see  #setPassword
 * @uml.property  name="password"
 */
  String getPassword();

  /**
 * Sets the database password for this <code>RowSet</code> object to the given <code>String</code>.
 * @param password  the password string
 * @exception SQLException  if a database access error occurs
 * @see  #getPassword
 * @uml.property  name="password"
 */
  void setPassword(String password) throws SQLException;

  /**
 * Retrieves the transaction isolation level set for this <code>RowSet</code> object.
 * @return  the transaction isolation level; one of  <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,  <code>Connection.TRANSACTION_READ_COMMITTED</code>,  <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or  <code>Connection.TRANSACTION_SERIALIZABLE</code>
 * @see  #setTransactionIsolation
 * @uml.property  name="transactionIsolation"
 */
  int getTransactionIsolation();

  /**
 * Sets the transaction isolation level for this <code>RowSet</code> obejct.
 * @param level  the transaction isolation level; one of  <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,  <code>Connection.TRANSACTION_READ_COMMITTED</code>,  <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or  <code>Connection.TRANSACTION_SERIALIZABLE</code>
 * @exception SQLException  if a database access error occurs
 * @see  #getTransactionIsolation
 * @uml.property  name="transactionIsolation"
 */
  void setTransactionIsolation(int level) throws SQLException;

  /**
 * Retrieves the <code>Map</code> object associated with this <code>RowSet</code> object, which specifies the custom mapping of SQL user-defined types, if any.  The default is for the type map to be empty.
 * @return  a <code>java.util.Map</code> object containing the names of  SQL user-defined types and the Java classes to which they are  to be mapped
 * @exception SQLException  if a database access error occurs
 * @see  #setTypeMap
 * @uml.property  name="typeMap"
 */
  java.util.Map getTypeMap() throws SQLException;

  /**
 * Installs the given <code>java.util.Map</code> object as the default  type map for this <code>RowSet</code> object. This type map will be used unless another type map is supplied as a method parameter.
 * @param map   a <code>java.util.Map</code> object containing the names of  SQL user-defined types and the Java classes to which they are  to be mapped
 * @exception SQLException  if a database access error occurs
 * @see  #getTypeMap
 * @uml.property  name="typeMap"
 */
  void setTypeMap(java.util.Map map) throws SQLException;

  //-----------------------------------------------------------------------
  // The following properties may be used to create a Statement.
  //-----------------------------------------------------------------------

  /**
 * Retrieves this <code>RowSet</code> object's command property. The command property contains a command string, which must be an SQL query, that can be executed to fill the rowset with data.   The default value is <code>null</code>.
 * @return  the command string; may be <code>null</code>
 * @see  #setCommand
 * @uml.property  name="command"
 */
  String getCommand();

  /**
 * Sets this <code>RowSet</code> object's command property to the given SQL query. This property is optional when a rowset gets its data from a data source that does not support commands, such as a spreadsheet. 
 * @param cmd  the SQL query that will be used to get the data for this  <code>RowSet</code> object; may be <code>null</code>
 * @exception SQLException  if a database access error occurs
 * @see  #getCommand
 * @uml.property  name="command"
 */
  void setCommand(String cmd) throws SQLException;

  /**
 * Retrieves whether this <code>RowSet</code> object is read-only. If updates are possible, the default is for a rowset to be updatable. <P> Attempts to update a read-only rowset will result in an <code>SQLException</code> being thrown. 
 * @return  <code>true</code> if this <code>RowSet</code> object is  read-only; <code>false</code> if it is updatable 
 * @see  #setReadOnly
 * @uml.property  name="readOnly"
 */
  boolean isReadOnly();

  /**
 * Sets whether this <code>RowSet</code> object is read-only to the given <code>boolean</code>.
 * @param value  <code>true</code> if read-only; <code>false</code> if   updatable
 * @exception SQLException  if a database access error occurs
 * @see  #isReadOnly
 * @uml.property  name="readOnly"
 */
  void setReadOnly(boolean value) throws SQLException;

  /**
 * Retrieves the maximum number of bytes that may be returned  for certain column values.  This limit applies only to <code>BINARY</code>, <code>VARBINARY</code>, <code>LONGVARBINARYBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>, and <code>LONGVARCHAR</code> columns. If the limit is exceeded, the excess data is silently discarded.
 * @return  the current maximum column size limit; zero means that there  is no limit
 * @exception SQLException  if a database access error occurs
 * @see  #setMaxFieldSize
 * @uml.property  name="maxFieldSize"
 */
  int getMaxFieldSize() throws SQLException;
    
  /**
 * Sets the maximum number of bytes that can be returned for a column value to the given number of bytes. This limit applies only to <code>BINARY</code>, <code>VARBINARY</code>, <code>LONGVARBINARYBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>, and <code>LONGVARCHAR</code> columns. If the limit is exceeded, the excess data is silently discarded. For maximum portability, use values greater than 256.
 * @param max  the new max column size limit in bytes; zero means unlimited 
 * @exception SQLException  if a database access error occurs
 * @see  #getMaxFieldSize
 * @uml.property  name="maxFieldSize"
 */
  void setMaxFieldSize(int max) throws SQLException;

  /**
 * Retrieves the maximum number of rows that this <code>RowSet</code> object can contain. If the limit is exceeded, the excess rows are silently dropped.
 * @return  the current maximum number of rows that this <code>RowSet</code>  object can contain; zero means unlimited
 * @exception SQLException  if a database access error occurs
 * @see  #setMaxRows
 * @uml.property  name="maxRows"
 */
  int getMaxRows() throws SQLException;

  /**
 * Sets the maximum number of rows that this <code>RowSet</code> object can contain to the specified number. If the limit is exceeded, the excess rows are silently dropped.
 * @param max  the new maximum number of rows; zero means unlimited 
 * @exception SQLException  if a database access error occurs
 * @see  #getMaxRows
 * @uml.property  name="maxRows"
 */
  void setMaxRows(int max) throws SQLException;

  /**
 * Retrieves whether escape processing is enabled for this <code>RowSet</code> object.   If escape scanning is enabled, which is the default, the driver will do escape substitution before sending an SQL statement to the database.
 * @return  <code>true</code> if escape processing is enabled;   <code>false</code> if it is disabled
 * @exception SQLException  if a database access error occurs
 * @see  #setEscapeProcessing
 * @uml.property  name="escapeProcessing"
 */
  boolean getEscapeProcessing() throws SQLException;

  /**
 * Sets escape processing for this <code>RowSet</code> object on or off. If escape scanning is on (the default), the driver will do escape substitution before sending an SQL statement to the database.
 * @param enable  <code>true</code> to enable escape processing;  <code>false</code> to disable it
 * @exception SQLException  if a database access error occurs
 * @see  #getEscapeProcessing
 * @uml.property  name="escapeProcessing"
 */
  void setEscapeProcessing(boolean enable) throws SQLException;

  /**
 * Retrieves the maximum number of seconds the driver will wait for a statement to execute. If this limit is exceeded, an <code>SQLException</code> is thrown.
 * @return  the current query timeout limit in seconds; zero means   unlimited 
 * @exception SQLException  if a database access error occurs
 * @see  #setQueryTimeout
 * @uml.property  name="queryTimeout"
 */
  int getQueryTimeout() throws SQLException;

  /**
 * Sets the maximum time the driver will wait for a statement to execute to the given number of seconds. If this limit is exceeded, an <code>SQLException</code> is thrown.
 * @param seconds  the new query timeout limit in seconds; zero means   that there is no limit
 * @exception SQLException  if a database access error occurs
 * @see  #getQueryTimeout
 * @uml.property  name="queryTimeout"
 */
  void setQueryTimeout(int seconds) throws SQLException;

  /**
   * Sets the type of this <code>RowSet</code> object to the given type.
   * This method is used to change the type of a rowset, which is by
   * default read-only and non-scrollable.
   *
   * @param type one of the <code>ResultSet</code> constants specifying a type:
   *        <code>ResultSet.TYPE_FORWARD_ONLY</code>,
   *        <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
   *        <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
   * @exception SQLException if a database access error occurs
   * @see java.sql.ResultSet#getType
   */
  void setType(int type) throws SQLException;

  /**
   * Sets the concurrency of this <code>RowSet</code> object to the given
   * concurrency level. This method is used to change the concurrency level
   * of a rowset, which is by default <code>ResultSet.CONCUR_READ_ONLY</code>
   *
   * @param concurrency one of the <code>ResultSet</code> constants specifying a
   *        concurrency level:  <code>ResultSet.CONCUR_READ_ONLY</code> or
   *        <code>ResultSet.CONCUR_UPDATABLE</code>
   * @exception SQLException if a database access error occurs
   * @see ResultSet#getConcurrency
   */
  void setConcurrency(int concurrency) throws SQLException;
  
  //-----------------------------------------------------------------------
  // Parameters
  //-----------------------------------------------------------------------

  /** 
   * The <code>RowSet</code> setter methods are used to set any input parameters
   * needed by the <code>RowSet</code> object's command.
   * Parameters are set at run time, as opposed to design time.
   */

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's SQL
   * command to SQL <code>NULL</code>.
   *
   * <P><B>Note:</B> You must specify the parameter's SQL type.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param sqlType a SQL type code defined by <code>java.sql.Types</code>
   * @exception SQLException if a database access error occurs
   */
  void setNull(int parameterIndex, int sqlType) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's SQL
   * command to SQL <code>NULL</code>. This version of the method <code>setNull</code>
   * should  be used for SQL user-defined types (UDTs) and <code>REF</code> type
   * parameters.  Examples of UDTs include: <code>STRUCT</code>, <code>DISTINCT</code>,
   * <code>JAVA_OBJECT</code>, and named array types.
   *
   * <P><B>Note:</B> To be portable, applications must give the
   * SQL type code and the fully qualified SQL type name when specifying
   * a NULL UDT or <code>REF</code> parameter.  In the case of a UDT,
   * the name is the type name of the parameter itself.  For a <code>REF</code> 
   * parameter, the name is the type name of the referenced type.  If 
   * a JDBC driver does not need the type code or type name information, 
   * it may ignore it.     
   *
   * Although it is intended for UDT and <code>REF</code> parameters,
   * this method may be used to set a null parameter of any JDBC type.
   * If the parameter does not have a user-defined or <code>REF</code> type,
   * the typeName parameter is ignored.
   *
   *
   * @param paramIndex the first parameter is 1, the second is 2, ...
   * @param sqlType a value from <code>java.sql.Types</code>
   * @param typeName the fully qualified name of an SQL UDT or the type
   *        name of the SQL structured type being referenced by a <code>REF</code>
   *        type; ignored if the parameter is not a UDT or <code>REF</code> type
   * @exception SQLException if a database access error occurs
   */
  void setNull (int paramIndex, int sqlType, String typeName) 
    throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>boolean</code> value. The driver converts this to
   * an SQL <code>BIT</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setBoolean(int parameterIndex, boolean x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>byte</code> value. The driver converts this to
   * an SQL <code>TINYINT</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setByte(int parameterIndex, byte x) throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>short</code> value. The driver converts this to
   * an SQL <code>SMALLINT</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setShort(int parameterIndex, short x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>int</code> value. The driver converts this to
   * an SQL <code>INTEGER</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setInt(int parameterIndex, int x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>long</code> value. The driver converts this to
   * an SQL <code>BIGINT</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setLong(int parameterIndex, long x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>float</code> value. The driver converts this to
   * an SQL <code>REAL</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setFloat(int parameterIndex, float x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>double</code> value. The driver converts this to
   * an SQL <code>DOUBLE</code> value before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setDouble(int parameterIndex, double x) throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java <code>String</code> value. Before sending it to the 
   * database, the driver converts this to an SQL <code>VARCHAR</code> or
   * <code>LONGVARCHAR</code> value, depending on the argument's size relative
   * to the driver's limits on <code>VARCHAR</code> values.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setString(int parameterIndex, String x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given Java array of <code>byte</code> values. Before sending it to the 
   * database, the driver converts this to an SQL <code>VARBINARY</code> or
   * <code>LONGVARBINARY</code> value, depending on the argument's size relative
   * to the driver's limits on <code>VARBINARY</code> values.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value 
   * @exception SQLException if a database access error occurs
   */
  void setBytes(int parameterIndex, byte x[]) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.sql.Date</code> value. The driver converts this to
   * an SQL <code>DATE</code> value before sending it to the database, using the
   * default <code>java.util.Calendar</code> to calculate the date.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setDate(int parameterIndex, java.sql.Date x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.sql.Time</code> value. The driver converts this to
   * an SQL <code>TIME</code> value before sending it to the database, using the
   * default <code>java.util.Calendar</code> to calculate it.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @exception SQLException if a database access error occurs
   */
  void setTime(int parameterIndex, java.sql.Time x) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.sql.Timestamp</code> value. The driver converts this to
   * an SQL <code>TIMESTAMP</code> value before sending it to the database, using the
   * default <code>java.util.Calendar</code> to calculate it.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value 
   * @exception SQLException if a database access error occurs
   */
  void setTimestamp(int parameterIndex, java.sql.Timestamp x)
    throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.io.InputStream</code> value. 
   * It may be more practical to send a very large ASCII value via a
   * <code>java.io.InputStream</code> rather than as a <code>LONGVARCHAR</code> 
   * parameter. The driver will read the data from the stream
   * as needed until it reaches end-of-file.   
   * 
   * <P><B>Note:</B> This stream object can either be a standard
   * Java stream object or your own subclass that implements the
   * standard interface.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the Java input stream that contains the ASCII parameter value
   * @param length the number of bytes in the stream 
   * @exception SQLException if a database access error occurs
   */
  void setAsciiStream(int parameterIndex, java.io.InputStream x, int length)
    throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.io.InputStream</code> value. 
   * It may be more practical to send a very large binary value via a
   * <code>java.io.InputStream</code> rather than as a <code>LONGVARBINARY</code> 
   * parameter. The driver will read the data from the stream
   * as needed until it reaches end-of-file.   
   * 
   * <P><B>Note:</B> This stream object can either be a standard
   * Java stream object or your own subclass that implements the
   * standard interface.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the java input stream which contains the binary parameter value
   * @param length the number of bytes in the stream 
   * @exception SQLException if a database access error occurs
   */
  void setBinaryStream(int parameterIndex, java.io.InputStream x, 
		       int length) throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * to the given <code>java.io.Reader</code> value. 
   * It may be more practical to send a very large UNICODE value via a
   * <code>java.io.Reader</code> rather than as a <code>LONGVARCHAR</code> 
   * parameter. The driver will read the data from the stream
   * as needed until it reaches end-of-file.   
   * 
   * <P><B>Note:</B> This stream object can either be a standard
   * Java stream object or your own subclass that implements the
   * standard interface.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param reader the <code>Reader</code> object that contains the UNICODE data
   *        to be set
   * @param length the number of characters in the stream 
   * @exception SQLException if a database access error occurs
   */
  void setCharacterStream(int parameterIndex,
       			  Reader reader,
			  int length) throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given Java <code>Object</code>.  For integral values, the 
   * <code>java.lang</code> equivalent objects should be used (for example,
   * an instance of the class <code>Integer</code> for an <code>int</code>).
   *
   * <p>The given Java object will be converted to the targetSqlType
   * before being sent to the database.
   * <P>
   * If the object is of a class implementing <code>SQLData</code>,
   * the rowset should call the method <code>SQLData.writeSQL</code>
   * to write the object to an <code>SQLOutput</code> data stream.
   * If the object is an instance of a class implementing the <code>Ref</code>,
   * <code>Struct</code>, <code>Array</code>, <code>Blob</code>,
   * or <code>Clob</code> interfaces,
   * the driver uses the default mapping to the corresponding SQL type.
   *
   * <p>Note that this method may be used to pass datatabase-specific
   * abstract data types. 
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the object containing the input parameter value
   * @param targetSqlType the SQL type (as defined in <code>java.sql.Types</code>) 
   *        to be sent to the database. The scale argument may further qualify this
   *        type.
   * @param scale for <code>java.sql.Types.DECIMAL</code> or
   *        <code>java.sql.Types.NUMERIC</code> types, this is the number of
   *         digits after the decimal point.  For all other types, this value
   *         will be ignored.
   * @exception SQLException if a database access error occurs
   * @see java.sql.Types 
   */
  void setObject(int parameterIndex, Object x, int targetSqlType, int scale)
            throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with a Java <code>Object</code>.  For integral values, the 
   * <code>java.lang</code> equivalent objects should be used.
   * This method is like <code>setObject</code> above, but the scale used is the scale
   * of the second parameter.  Scalar values have a scale of zero.  Literal
   * values have the scale present in the literal.  
   * <P>
   * Even though it is supported, it is not recommended that this method
   * be called with floating point input values.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the object containing the input parameter value
   * @param targetSqlType the SQL type (as defined in <code>java.sql.Types</code>) 
   *        to be sent to the database
   * @exception SQLException if a database access error occurs
   */
  void setObject(int parameterIndex, Object x, 
		 int targetSqlType) throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with a Java <code>Object</code>.  For integral values, the 
   * <code>java.lang</code> equivalent objects should be used.
   *
   * <p>The JDBC specification provides a standard mapping from
   * Java Object types to SQL types.  The driver will convert the 
   * given Java object to its standard SQL mapping before sending it
   * to the database.
   *
   * <p>Note that this method may be used to pass datatabase-specific
   * abstract data types by using a driver-specific Java type.
   *
   * If the object is of a class implementing <code>SQLData</code>,
   * the rowset should call the method <code>SQLData.writeSQL</code>
   * to write the object to an <code>SQLOutput</code> data stream.
   * If the object is an instance of a class implementing the <code>Ref</code>,
   * <code>Struct</code>, <code>Array</code>, <code>Blob</code>,
   * or <code>Clob</code> interfaces,
   * the driver uses the default mapping to the corresponding SQL type.
   * <P>
   * An exception is thrown if there is an ambiguity, for example, if the
   * object is of a class implementing more than one of these interfaces.
   *
   * @param parameterIndex The first parameter is 1, the second is 2, ...
   * @param x The object containing the input parameter value 
   * @exception SQLException if a database access error occurs
   */
  void setObject(int parameterIndex, Object x) throws SQLException;

  /** 
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given  <code>Blob</code> value.  The driver will convert this
   * to the <code>BLOB</code> value that the <code>Blob</code> object
   * represents before sending it to the database.
   *
   * @param i the first parameter is 1, the second is 2, ...
   * @param x an object representing a BLOB
   * @exception SQLException if a database access error occurs
   */
  void setBlob (int i, Blob x) throws SQLException;

  /** 
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given  <code>Clob</code> value.  The driver will convert this
   * to the <code>CLOB</code> value that the <code>Clob</code> object
   * represents before sending it to the database.
   *
   * @param i the first parameter is 1, the second is 2, ...
   * @param x an object representing a CLOB
   * @exception SQLException if a database access error occurs
   */
  void setClob (int i, Clob x) throws SQLException;
  
  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given  <code>java.sql.Date</code> value.  The driver will convert this
   * to an SQL <code>DATE</code> value, using the given <code>java.util.Calendar</code>
   * object to calculate the date.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @param cal the <code>java.util.Calendar</code> object to use for calculating the date
   * @exception SQLException if a database access error occurs
   */
  void setDate(int parameterIndex, java.sql.Date x, Calendar cal)
    throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given  <code>java.sql.Time</code> value.  The driver will convert this
   * to an SQL <code>TIME</code> value, using the given <code>java.util.Calendar</code>
   * object to calculate it, before sending it to the database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value
   * @param cal the <code>java.util.Calendar</code> object to use for calculating the time
   * @exception SQLException if a database access error occurs
   */
  void setTime(int parameterIndex, java.sql.Time x, Calendar cal) 
    throws SQLException;

  /**
   * Sets the designated parameter in this <code>RowSet</code> object's command
   * with the given  <code>java.sql.Timestamp</code> value.  The driver will
   * convert this to an SQL <code>TIMESTAMP</code> value, using the given
   * <code>java.util.Calendar</code> object to calculate it, before sending it to the
   * database.
   *
   * @param parameterIndex the first parameter is 1, the second is 2, ...
   * @param x the parameter value 
   * @param cal the <code>java.util.Calendar</code> object to use for calculating the 
   *        timestamp
   * @exception SQLException if a database access error occurs
   */
  void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal)
    throws SQLException;

  /**
   * Clears the parameters set for this <code>RowSet</code> object's command.
   * <P>In general, parameter values remain in force for repeated use of a
   * <code>RowSet</code> object. Setting a parameter value automatically clears its
   * previous value.  However, in some cases it is useful to immediately
   * release the resources used by the current parameter values, which can
   * be done by calling the method <code>clearParameters</code>.
   *
   * @exception SQLException if a database access error occurs
   */
  void clearParameters() throws SQLException;

  //---------------------------------------------------------------------
  // Reading and writing data
  //---------------------------------------------------------------------

  /**
   * Fills this <code>RowSet</code> object with data.  
   * <P>
   * The <code>execute</code> method may use the following properties 
   * to create a connection for reading data: url, data source name, 
   * user name, password, transaction isolation, and type map.
   * 
   * The <code>execute</code> method  may use the following properties 
   * to create a statement to execute a command:
   * command, read only, maximum field size, 
   * maximum rows, escape processing, and query timeout.
   * <P>
   * If the required properties have not been set, an exception is 
   * thrown.  If this method is successful, the current contents of the rowset are 
   * discarded and the rowset's metadata is also (re)set.  If there are 
   * outstanding updates, they are ignored.   
   * <P>
   * If this <code>RowSet</code> object does not maintain a continuous connection 
   * with its source of data, it may use a reader (a <code>RowSetReader</code> 
   * object) to fill itself with data.  In this case, a reader will have been
   * registered with this <code>RowSet</code> object, and the method 
   * <code>execute</code> will call on the reader's <code>readData</code>
   * method as part of its implementation.
   *
   * @exception SQLException if a database access error occurs or any of the
   *            properties necessary for making a connection and creating
   *            a statement have not been set
   */
  void execute() throws SQLException;

  //--------------------------------------------------------------------
  // Events
  //--------------------------------------------------------------------

  /**
   * Registers the given listener so that it will be notified of events
   * that occur on this <code>RowSet</code> object.
   *
   * @param listener a component that has implemented the <code>RowSetListener</code>
   *        interface and wants to be notified when events occur on this
   *        <code>RowSet</code> object
   * @see #removeRowSetListener
   */
  void addRowSetListener(RowSetListener listener);

  /**
   * Removes the specified listener from the list of components that will be
   * notified when an event occurs on this <code>RowSet</code> object.
   *
   * @param listener a component that has been registered as a listener for this
   *        <code>RowSet</code> object
   * @see #addRowSetListener
   */
  void removeRowSetListener(RowSetListener listener);
 
}









